Stack Exchange Vote Simulator


73

Escriba un programa o función que tome una cadena que solo contenga los caracteres ^y v(puede suponer que no habrá otros caracteres). Lea de izquierda a derecha esta cadena representa la secuencia de clics del mouse que un solo usuario realizó mientras veía una pregunta o respuesta de Stack Exchange por primera vez.

Cada ^representa un clic del botón de votación positiva y cada uno vrepresenta un clic del botón de votación negativa . (Para ejemplos de trabajo, mire ligeramente a la izquierda).

Suponga que no existen limitaciones de votación, por lo que todos los clics se registran correctamente.
Imprimir o devolver:

  • 1o +1si la publicación termina siendo votada.
  • 0si la publicación termina sin ser votada. ( -0y +0no son válidos)
  • -1 si la publicación termina siendo rechazada.

Las publicaciones comienzan con cero votos netos del usuario y los botones cambian los votos netos de la siguiente manera:

Net Votes Before    Button Pressed    Net Votes After
1                   ^                 0
1                   v                 -1
0                   ^                 1
0                   v                 -1
-1                  ^                 1
-1                  v                 0

El código más corto en bytes gana.

Casos de prueba:

[empty string] -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0

14
¿Qué? sin votación lateral? Geoborts y Seadrus están tristes
Optimizer

25
Estimado desarrollador de Secret SE: Felicitaciones por haber logrado duplicar con éxito su propia comunidad para hacer mejoras en el sitio para usted ...;)
hasta el

1
He estado protagonizando la tabla de ejemplos por un tiempo y todavía no obtengo los casos de prueba. una publicación con una puntuación de 1 se vota y luego obtiene una puntuación de 0. Y una publicación con una puntuación de 0 se vota para obtener una puntuación de 1. Y una publicación con una puntuación de -1 se eleva- votó para tener un puntaje de 1. ¿Entonces el ^personaje puede causar un cambio de puntaje de -1, +1 o +2? ¿Soy denso donde? ¿Que esta pasando?
Brad

44
@Brad, le sugiero que pruebe las acciones con alguna publicación real (por ejemplo, esta pregunta en sí). La votación de una publicación que ya votó cancela la votación. Lo mismo con el voto negativo.
Aficiones de Calvin

66
Me pregunto cuáles fueron los votos en tiempo real sobre esta cuestión. Estoy dispuesto a apostar que mucha gente usó esta pregunta como un caso de prueba.
MikeTheLiar

Respuestas:


35

Gol> <> 0.3.11 , 13 12 11 bytes

iEh`^=:@)+M

Pruébalo en línea . Aunque esto funcionará bien en la próxima actualización, lo he enumerado como 0.3.11 por si acaso.

Explicación

i               Read char
 Eh             If EOF, halt and output top of stack as num
   `^=          Push 1 if char is ^, else 0
      :@        Dup and rotate, giving [is^ is^ votecount]
        )       Compare greater than, pushing 1 or 0 as appropriate
         +M     Add and subtract 1

Tenga en cuenta que el primer uso de @tira un 0 desde la parte inferior de la pila para inicializar el recuento de votos para la primera iteración

Para ilustrar con una tabla completa:

Votes before    Button    Is ^?    Compare <    Add     Subtract 1
     1            ^         1         0          1          0
     1            v         0         0          0         -1
     0            ^         1         1          2          1
     0            v         0         0          0         -1
    -1            ^         1         1          2          1
    -1            v         0         1          1          0

1
.... dang! ¡Buena esa!
El'endia Starman el

22

código de máquina x86, 24 bytes

31 C0 8A 11 84 D2 75 07 C0 E0 02 C0 F8 06 C3 41 38 C2 74 EC 88 D0 EB EA

Esta es una función que utiliza la convención de llamada fastcall, que toma una cadena y devuelve un entero de 8 bits.

Lo probé con el siguiente programa en C, que debe compilarse para el modo de 32 bits.

#include <stdio.h>
#include <inttypes.h>

 __attribute__ ((aligned (16))) const unsigned char fun[] = {

    0x31,  //xor eax,eax
        0xC0,
    0x8A, //mov [ecx],dl
        1 | 2<<3,
    0x84, //test dl, dl
        0xC0 | 2<<3 | 2,
    0x75, // jnz
        7,
    0xC0, //shl al 2
        0xC0 | 4<<3,
        2,
    0xC0, //sar al 6
        0xC0 | 7<<3,
        6,
    0xC3, //ret
    0x41, //inc ecx
    0x38, //cmp al,dl
        0xC0 | 2,
    0x74, //je
        -20,
    0x88, //mov dl,al
        0xC0 | 2<<3,
    0xEB, //jmp
        -22,
};

int main()
{
    __fastcall int8_t (*votesimulator)(char*) = fun;
    char* s[] = {
        "",
        "^^",
        "^v",
        "^",
        "v",
        "v^",
        "vv",
        "^^^",
        "vvv",
        "^^^^",
        "vvvv",
        "^^^^^",
        "vvvvv",
        "^^^^^^",
        "vvvvvv",
        "^^v",
        "^v^",
        "^vv",
        "vv^",
        "v^v",
        "v^^",
        "^vvv^^vv^vv^v^",
        "^vvv^^vv^vv^v^^",
        "^vvv^^vv^vv^v^^^",
        "^vvv^^vv^vv^v^^v",
        "^vvv^^vv^vv^v^^vv",
        "^vvv^^vv^vv^v^^vvv",
        "^vvvvvvvvvvvv",
        "^^vvvvvvvvvvvv",
        "^^^vvvvvvvvvvvv",
        "vvv^^^^^^^^^^^^",
        "vv^^^^^^^^^^^^",
        "v^^^^^^^^^^^^",
    };

    for(int i = 0; i < sizeof(s)/sizeof(*s); i++)
        printf("%d\n", votesimulator(s[i]));

    printf("\n%d\n", sizeof(fun));
    for(int i = 0; i < sizeof(fun); i++)
        printf("%02X ", fun[i]);
    return 0;
}

¿Esto está permitido? Quiero decir que también podría escribir todo en C y solo decir que el código C requiere un archivo vacío para realizar la tarea mientras digo que mi código es el marco que hace que mi código se convierta en 0bytes. ¿Por qué es diferente de su solución?
Zaibis

@Zaibis ¿Porque mi solución contiene el código que resuelve el desafío? Ver meta.codegolf.stackexchange.com/a/1071/30688 .
feersum

21

JavaScript (ES7), 47 46 44 43 37 36 bytes

Tachado 44 sigue siendo regular 44 :(

s=>[for(x of s)s=x<"v"?s!=1:!~s-1]|s

Mantiene un total acumulado s. Utiliza el for ofbucle para iterar sobre cada carácter en la cadena y las actualizaciones sbasadas en el carácter actual y el valor anterior.

Ediciones: Golfed ~s&&-1a !~s-1. Esta expresión tiene que ser igual a 0 si ses igual a -1 y -1 en caso contrario. Guardado 6 bytes gracias a @nderscore.

Cómo funciona la expresión:

 ~s    // Bitwise inverse. ~s==0 only if s==-1
!      // Logical negate. Casts to boolean. Equivalent to s==-1
   -1  // Subtract. Casts to number so true-1 is 1-1 and false-1 is 0-1

3
Lo tengo hasta 37 bytes:v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
nderscore

@nderscore Hola, eso es genial. Pensé que la variable adicional era torpe, pero no pensé que podría eliminarla.
intrepidcoder

1
Tachado 44 sigue siendo regular 44 ...
Rɪᴋᴇʀ

¿No se eliminaron las comprensiones de matriz de la especificación?
MayorMonty

8

CJam, 18 14 bytes

Versión actualizada con mejoras significativas aportadas por Dennis:

0'jqf{-g_@=!*}

Pruébalo en línea

Explicación:

0     Start value for running total.
'j    Push character between '^ and 'v for use in loop.
q     Get input.
f{    Apply block with argument to all input characters.
  -     Subtract character from 'j. This will give -12 for '^, 12 for 'v.
  g     Signum, to get 1 for '^, -1 for 'v, which is our increment value.
  _     Copy increment value.
  @     Bring running total to top.
  =     Compare. This will give 1 for the -1/-1 and 1/1 combinations where the new
        running total is 0. Otherwise, the new running total is the increment value.
  !     Negate to get 0 for the -1/-1 and 1/1 cases.
  *     Multiply result with increment value, to get new running total.
}     End block applied to input characters.

7

Befunge 93 - 55 bytes

vj#p01:>#<:1+|
>~:10g-|v:g25<
^p01"j"<1^   <
./*34-g0<@

52 caracteres y 3 líneas nuevas.

Probado en este intérprete .

El jes equidistante de ^y ven ascii, por lo que se usa para hacer conversiones aritméticas al final, en lugar de condicionales que consumen espacio.


7

brainfuck, 146 bytes

,[[>->+<<-]>[[-]>[<+>-]]>[-]<<[<],]----[>-----<--]--[>>+<<++++++]+>[<-]<[->>++.<++++[<------>-]]>[<+<<]----[>+++++<--]>[,+<]>>[<<]-[>+<-----]>---.

Este programa toma cada byte de entrada y lo compara con el último. Si son iguales, tira la entrada y almacena "0" como la "entrada anterior", de lo contrario la guarda normalmente.

Si el resultado final es v, se imprime -. Si el resultado final fue distinto de cero, se agrega 1 a una celda vacía. Finalmente, se agrega 48 a esa celda y se imprime.


7

Javascript ES6, 91 48 caracteres

s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

Explicación: undefinedtermina por d.

Prueba:

` -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0`
.split("\n").map(s => s.split(" -> "))
.every(([s,key]) => (s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)])(s)==key)

Historial de respuestas:

s=>({'':0,'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)])
s=>~~{'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|((.)\5)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/((.)\2)+/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,0).slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

7

Pitón 2, 49

lambda s:reduce(lambda x,c:cmp(cmp('u',c),x),s,0)

Se repite con la función de actualización

lambda x,c:cmp(cmp('u',c),x)

que toma el recuento de votos actual xy el nuevo personaje cy genera el nuevo recuento de votos.

La idea es utilizar Python 2 cmpfunción, que compara sus dos argumentos y da -1, 0, 1para <, ==, >respectivamente. El interior cmp('u',c)da -1por vy 1para ^; cualquier personaje entre ellos es suficiente 'u'. El externo luego compara eso con x, que da cmp(1,x)por ^y cmp(-1,x)para v, que tienen los valores correctos.

La iteración directa fue 3 caracteres más larga (52), aunque sería un carácter corto (48) si input()se permitiera tomar comillas con comillas.

x=0
for c in raw_input():x=cmp(cmp('u',c),x)
print x

La mejor función recursiva que encontré fue una char más larga (50)

f=lambda s:len(s)and cmp(cmp('u',s[-1]),f(s[:-1]))

5

Prolog, 159152 bytes

Código:

v(1,^,0).
v(1,v,-1).
v(0,^,1).
v(0,v,-1).
v(-1,^,1).
v(-1,v,0).
r(X,[H|T]):-T=[],v(X,H,Z),write(Z);v(X,H,Z),r(Z,T).
p(S):-atom_chars(S,L),r(0,L).

Pruébelo usted mismo:
Intérprete en línea aquí

Ejemplo

>p("^vvv^^vv^vv^v^^vvv").
-1

>p("^vvv^^vv^vv^v^")
1

Editar: Guardado 7 bytes al unificar las cláusulas r con OR.


Hmm Parece que usted podría ahorrar un buen número de bytes mediante la redefinición de los operadores en lugar de definir funciones (si eso cuenta como una función bajo las reglas de PPCG?)
ASCII de sólo

@ Solo ASCII: Sí. No había aprendido ese truco cuando escribí esto :)
Emigna

4

CJam, 16 bytes

0re`W=(2%*c'a--g

Esto se bloqueará después de imprimir 0 , si corresponde. El error se puede suprimir con el intérprete de Java. Si intenta esto en línea , ignore todo menos la última línea de salida.

Cómo funciona

0                e# Push a 0 on the stack.
 r               e# Read a whitespace-separated token from STDIN.
  e`             e# Perform run-length encoding.
    W=           e# Select the last [repetitions character] pair.
                 e# This will fail for the empty string, so the
                 e# interpreter will print the stack's only element (0).
      (          e# Shift out the number of repetitions.
       2%        e# Compute its parity.
         *       e# Create a string, repeating the character 1 or 0 times.
          c      e# Cast to character.
                 e# This will fail for a zero-length string, so the
                 e# interpreter will print the stack's only element (0).
           'a-   e# Subtract the character 'a' from '^' or 'v'.
              -  e# Subtract the difference (integer) from 0.
               g e# Apply the sign function.

4

Python 2, 177159 72 bytes

Todavía un poco nuevo en este código de golf.

def v(s): 
 c=0 
 for i in s:c=((0,1)[c<1],(0,-1)[c>-1])[i=="^"] 
 return c

EDITAR: se corrigió el comportamiento incorrecto.
EDIT 2: Gracias @MorganThrapp por eliminar muchos bytes.


Extraño. Lo miraré.
DJgamer98

Resulta que olvidé el comportamiento correcto ^ luego v (y viceversa).
DJgamer98

Eliminar publicación hasta que se solucione.
DJgamer98

Debería estar funcionando ahora.
DJgamer98

1
Esa sangría no es del todo correcta, solo sugerí una edición con la sangría correcta. No puede formatear el código en los comentarios, por lo que estuvo mal en el mío.
Morgan Thrapp

4

JavaScript (ES6), 64 59 58 52 bytes

f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2

Esto se basa en la observación de que solo el último tramo de la repetición (de cualquiera ^o v) afecta el resultado.

Gracias a Neil por jugar golf en 6 bytes.


1
¿Por qué necesitas las capturas? Me parece f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2suficiente.
Neil

@Neil: no estoy al tanto de que la matriz se coaccione al primer elemento >u <operador. Gracias por los consejos
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

No hay coacción de tipo involucrada, simplemente moví lo [0]que puede haberte confundido.
Neil

@Neil: Oh, de hecho estoy confundido. No me di cuenta de que lo moviste adentro, pensé que era f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2, lo que funciona debido a la coerción de tipo con array.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

Haskell, 40 bytes

1%'^'=0
_%'^'=1
1%_=-1
_%_=0
v=foldl(%)0

Puede cortar todos los espacios definiéndolos fcomo una función infija %. Además, creo que vpuede ser un _.
xnor

En realidad, ¿no da esto -1por en vvlugar de 0?
xnor

Oh, siempre me olvido de los infijos. Gracias por el lugar, perdí la inversión interna.
Leif Willerts

Ahorre 3 caracteres reemplazando la tercera línea (15 caracteres) con 1%_=-1 _%_=012 caracteres.
Kevin Reid

Está bien, ahora eso se ha vuelto más corto.
Leif Willerts

4

Scala, 75 bytes

def d(s:String)=s./:(0){case(1,94)|(-1,'v')=>0;case(_,94)=> 1;case _=> -1}

Prueba de función implementada.

  object Util {
        def d(s: String) = s./:(0) { 
    case (1, '^') | (-1, 'v') => 0
    case (_, '^') => 1
    case (_, _) => -1
  }      
      def main(s: Array[String]): Unit = {
        println("1 == " + d("^vvv^^vv^vv^v^^^"))
        println("1 == " + d("^vvv^^vv^vv^v^"))
        println("-1 == " + d("^vvv^^vv^vv^v^^vvv"))
        println("0 == " + d("^^^vvvvvvvvvvvv"))
        println("0 == " + d("vvv^^^^^^^^^^^^"))
      }
    }

1
Bienvenido a PPCG! ¿Podría por favor agregar una explicación y / o una versión no golfista?
Addison Crump

3

APL, 17

(⊣×≠)/⌽0,2-'^ '⍳⍞

Para intérpretes sin notación fork (como GNU APL), sería {⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞(19). Esta es probablemente la solución más aburrida posible porque funciona directamente desde la definición del problema.


3

Ruby, 41 35 bytes

Regex. Solo el último botón presionado es interesante, así que verifique la duración de la ejecución. Luego compárelo con "a"(o cualquier letra entre ^y v) para obtener 1o -1.

->s{s[/(.?)\1*$/].size%2*(?a<=>$1)}

3

C # 6, 18 + 80 = 98 bytes

Requiere:

using System.Linq;

Función real:

int S(string v)=>v.Split(new[]{"^^","vv"},0).Last().Length<1?0:v.Last()<95?1:-1;

Cómo funciona: el código primero elimina todo antes del último ^^o vv. Ese contenido no es relevante porque hacer clic en el mismo botón dos veces siempre cancelará su voto. Esto se hace mediante la división de ^^y vvy tomando el último elemento. Si este elemento es una cadena vacía ( .Length<1), la función vuelve 0porque toda la votación ha sido cancelada. Si la cadena no está vacía, solo mira el último carácter de la cadena original: anulará todos los votos anteriores. Si el código char es menor que 95, entonces será 94 ^, por lo que devuelve 1, de lo contrario -1.


3

Python 2.7, 79 75 88

s=input()
print (0,(1,-1)[s[-1]=='v'])[len(s[s.rfind(('v^','^v')[s[-1]=='v'])+1:])%2!=0]

Esto en realidad no imprime nada.
Morgan Thrapp

Ejecutándolo en mi intérprete, muestra la salida de la última línea
wnnmaw

Eso es porque lo estás ejecutando en el REPL. Debe proporcionar un programa completo que funcione fuera de REPL.
Morgan Thrapp

Además, puede acortar ese ternario (-1,(1,0)[n==0])[n>0]para ahorrar 10 bytes. Además, no lo uses a=str.count. En realidad te cuesta 4 bytes.
Morgan Thrapp

Eso produce -1 para n = 0, pero sintaxis genial
wnnmaw

2

Minkolang 0.11 , 28 22 bytes

0$I2&N."j"o-34*:dr=,*!

Pruébalo aquí.

Explicación

0                         Push a 0 (running total)
 $I                       Push length of input
   2&N.                   Output as integer and stop if this is 0
       "j"                Push 106
          o               Take character from input (94 for ^, 118 for v)
                          <<so ^ becomes +12 and v becomes -12>>
           -              Subtract
            34*:          Divide by 12
                d         Duplicate top of stack
                 r        Reverse stack
                  =,      Push 0 if equal, 1 otherwise
                    *     Multiply
                          <<this handles two of the same vote in a row>>
                     !    Unconditional trampoline (jumps the 0 at the beginning)

Tenga en cuenta que no hay N.al final. Eso es porque lo dejé envolver hasta el principio. Cuando la entrada está vacía, la cuenta final se emite como un número entero y el programa se detiene.



2

Mathematica, 60 bytes

Mod[#,2]Sign@#&@Tr@Last@Split@StringCases[#,{"^"->1,_->-1}]&

@#&? Eso es inútil (a menos que Sequences están involucrados, pero Sequences no están involucrados.
CalculatorFeline

2

Script de forma , 26 bytes

"^"$"0>1@-"~"v"$"0<1-"~0@!

Cómo funciona:

"^"$     split input on '^'
"
  0>         Check if the number is more than 0 (1 if true, 0 if false).
  1@-        subtract the answer from one.
"~       Join it back together, with this string in place of '^'
"v"$     Split on 'v'
"        
  0<         Check if 0 is more than the number (1 if true, 0 if false).
  1-         subtract one from the results
"~       Join it back together, with this string in place of 'v'
0@       add a zero to the stack and place it under the string just built. 
!        run the string as code

2

C # 6, 18 + 97 95 = 115 113 bytes, sin métodos de cadena, LINQ excesivo

int v(string s)=>(int)s.Reverse().TakeWhile((c,i)=>i<1||c==s[s.Length-i])?.Sum(x=>x<95?1:-1)%2;

Verdaderamente merece ser precedido por

using System.Linq;

Tuve la idea de usar en x<95?1:-1lugar de la respuestax=='^'?1:-1 de ProgramFOX

Coincidencias:

  • El ajuste que robé hace uso de la comparación con 95: el recuento de bytes que excluye la declaración de uso, usando dicho ajuste
  • La suma de los dígitos del recuento total de bytes es igual al número de dígitos del recuento total de bytes escrito como número romano

2

C: 67 66 bytes

golfizado:

void f(char *v){int i=0,c,s=0;for(;v[i]!=0;i++){v[i]>94?s--:s++;}}

sin golf:

void f (char *v)
{
    int i = 0, c, s = 0;

    for (;v[i]!=0;i++)
    {
        v[i] > 94 ? s-- : s++;
    }
}

Esto no devuelve un resultado. No pasa todas las pruebas.
Robert Andrzejuk

2

Ir, 179 bytes

Una solución extremadamente ingenua.

package main
import(."fmt"."strings")
func main(){a:=""
i:=0
Scanln(&a)
b:=Split(a,"")
for _,e:=range b{switch i{case 1:i--
case 0:if e=="^"{i++}else{i--}
case-1:i++}}
Println(i)}

Sin golf:

package main

import (
    ."fmt"
    ."strings"
)

func main() {
    a := ""
    i := 0
    Scanln(&a)
    b := Split(a, "")
    for _, e := range b {
        switch i {
        case 1:
            i--
        case 0:
            if e == "^" {
                i++
            } else {
                i--
            }
        case -1:
            i++
        }
    }
    Println(i)
}

2

Perl 5, 41 bytes

40 bytes, más 1 para -p

/(.)\1*$/;$_=((length$&)%2)*($1=~v?-1:1)

/(.)\1*$/;compara la cadena de entrada con la expresión regular /(.)\1*$/, es decir, ve si termina con un solo carácter repetido un número ≥1 de veces.

Si es así, $&es toda la cadena de repetición y $1es el personaje; de lo contrario (es decir, la cadena de entrada está vacía), esas dos variables son la cadena vacía.

$1=~v?-1:1se compara $1con la expresión regular vy devuelve −1 si coincide y 1 de lo contrario.

Y multiplique eso ± 1 por (length$&)%2la longitud del $&módulo 2.


2

05AB1E , 14 12 11 bytes

Îvy'^QDŠ‹+<

Puerto de la respuesta Gol> <> de @ Sp3000 .

NOTA: @Grimy ya publicó una alternativa más corta de 8 bytes para 05AB1E , ¡así que asegúrese de votarlo!

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Î            # Push 0 (later mentioned as `r`) and the input-string
 v           # Loop over the characters of the input:
  y'^Q      '#  Does the current character equal "^"?
             #  (results in 1 for truthy; 0 for falsey - later mentioned as `b`)
      D      #  Duplicate this result `b`
       Š     #  Triple swap (`r`,`b`,`b`) to (`b`,`r`,`b`)
            #  Check if the boolean `b` is smaller than the result-integer `r`
             #  (again results in 1 for truthy; 0 for falsey)
         +   #  Add them together
          <  #  Decrease this by 1
             # (Implicitly output the result-integer `r` after the loop)

2

05AB1E , 8 bytes

㤮öÓÆ.±

Pruébalo en línea!

Soluciones alternativas con la misma longitud: u㤮öÓÆ(, 㤮ögÓÆ(.


1
Esto no funciona Ni su código publicado ni el código en el enlace TIO (que es diferente) tienen en cuenta votos como^^ -> 0
Emigna

@Emigna gracias por señalarlo! Arreglé el código, todavía son 8 bytes.
Grimmy


1

Rubí, 43

->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

9-i/11se evalúa a 1 o -1 cuando se le dan los códigos ascii de ^(94) o v(118)

En programa de prueba:

f=->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

g=gets.chomp
puts f[g]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.