¡Interpreta la repetición!

11

Este desafío es el primero de una serie de dos desafíos sobre la repetición. El segundo estará listo pronto.

En un lenguaje llamado Repetición (algo que acabo de inventar), consta de una cadena infinita de 12345678901234567890..., con la 1234567890repetición para siempre.

La siguiente sintaxis está disponible para los números de salida:

  • +-*/: Esto inserta el operador en la cadena de dígitos repetidos.
    • Ejemplos:
      • +-> 1+2= 3( +inserta un +entre 1y 2)
      • +*-> 1+2*3= 1+6= 7(Igual que el anterior, excepto que ahora se utilizan dos operadores)
      • /-> 1/2= 0(La repetición usa división entera)
      • //-> 1/2/3= 0/3= 0(La repetición usa "asociación izquierda" con múltiples restas y divisiones)
    • Cada operador se inserta de modo que tenga un dígito a su izquierda, a menos que haya cun (vea a continuación).
  • c: Se concatena con el siguiente dígito en la cadena.
    • Ejemplos:
      • c+-> 12+3= 15(El c"continúa" el 1y lo concatena con el siguiente dígito,, 2para formar 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Corchetes para procesar números.
    • Ejemplos:
      • (c+)*-> (12+3)*4= 15*4= 60(La repetición usa el orden de las operaciones)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Omite un número (elimina el número de la cadena infinita).
    • s+-> 2+3= 5( ssalta 1)
    • csc-> 124(Los primeros cconcatos 1y 2, los ssaltos 3y los cconcatos finales 12a 4)
    • +s+-> 7(La primera +suma 1y 2para hacer 3, ssaltos 3, y la final +se suma 3a 4hacer 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

En los ejemplos anteriores, solo se usa una cantidad finita de dígitos en la cadena infinita. El número de dígitos utilizados es equivalente a number of operators, concats and skips + 1.

Su tarea es, cuando se le da una cadena de código de repetición, generar el resultado.

Ejemplos de entrada y salida son:

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

Este es el código de golf, por lo que gana el código más corto en bytes.

Especificaciones:

  • Le garantizamos que el resultado nunca superará 2^31-1.
  • También tiene la garantía de que la entrada solo consistirá en los símbolos +-*/cs().
  • Se generará un programa vacío 1.
clismique
fuente
¿Qué pasa con el ~s? No nos dejes colgando.
Robert Fraser
@RobertFraser Whoops, eso fue un error, c era originalmente ~, pero parece que no lo he solucionado por completo.
clismique
1
@TonHospel Ooh, tienes un buen punto allí. El símbolo "s" esencialmente elimina el número al que está asociado de la cadena infinita por completo, por lo que es un sí para ambos escenarios.
clismique
2
Sin embargo, su especificación dice que s+es 2+3su primer ejemplo. Y todavía sme sigue molestando. Me pregunto cómo se +s()+expande. Si es 1+(2)+4así, (viene antes, 2pero seso viene incluso antes de que (aparentemente salte 3, no 2. Sin embargo, si el resultado es 1+(3)+4el efecto de a sdepende de lo que viene después (compárelo con +s+)
Ton Hospel
1
sces 23y s+es 1+3? ¿Se ssalta el 1ahora o el 2? Todos los ejemplos usan la primera operación en operandos 1y 2... así scdebería ser 13.
Tito

Respuestas:

4

JavaScript (ES6), 110 bytes

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

Muy simple, pero la división entera agrega 25 bytes. Por alguna razón, una expresión regular en JS no puede coincidir tanto con el comienzo de una cadena como con el primer carácter, por lo que también agrega algunos bytes.

Cómo funciona

  1. Anteponer un espacio a la entrada.
  2. Agregue el siguiente dígito a cada carácter (excepto )) que no esté inmediatamente antes de a (.
  3. Elimine cada uno c, un dígito + sal principio ( 1s2-> 2), y cada s+ un dígito ( 3s4-> 3).
  4. Convierta cada operación de división en int-division ( 1/2-> (1/2|0)).
  5. Evaluar y devolver.
ETHproductions
fuente
OK ... su programa tiene un error ... ss+regresa 6, cuando está destinado a regresar 7(Los dos somiten 1y 2, entonces, +agrega 3y 4).
clismique
@ Qwerp-Derp Gracias, arreglado.
ETHproductions
Algo así /^|,|$/gsolo coincidirá una vez al principio porque ambas coincidencias tendrían el mismo índice. $no tiene el mismo problema porque la coincidencia tiene un índice mayor que cualquier otra coincidencia posible.
Neil
0

Lote, 332 bytes.

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

El comportamiento de shace esto muy incómodo. (Tal vez csdebería evaluar a 13y -sa -2?) Variables:

  • s cadena de entrada (explícitamente en blanco porque set / p no cambia la variable si no ingresa nada)
  • eexpresión parcial en aritmética de enteros normales (a la que podemos pasar set/acomo una forma de eval)
  • d siguiente dígito de la cadena infinita de dígitos
  • rlado derecho del último operador. No podemos concatenar esto de inmediato porque (debe ser lo primero, pero debemos almacenarlo para que sno se incremente. Afortunadamente, hace que el manejo )sea ​​un poco más fácil.
  • c Carácter actual.
Neil
fuente