"Talk" es un lenguaje baroquificado basado en acumuladores que se crea en respuesta a la cita de Dennis en talk.tryitonline.net.
Waiting for someone to create an esolang called talk.
. El lenguaje "Talk" tiene 4 comandos:
00
Si el acumulador es 0, establezca el acumulador en 0.01
Si el acumulador es 0, configure el acumulador en 1.10
Si el acumulador es 1, establezca el acumulador en 0.11
Si el acumulador es 1, configure el acumulador en 1.
Entrada:
La entrada se puede tomar a través de cualquier método de entrada aceptable según nuestras reglas de E / S estándar.
Hay dos entradas, el valor inicial del acumulador y el programa. Puede fusionar estas dos entradas en una entrada o dividir su entrada en comandos válidos (por ejemplo, tomarlos como una lista; por ejemplo
[00, 01, 00]
) si lo desea.
Salida:
- Al final de la ejecución de un comando, el acumulador se emite implícitamente.
Reglas:
- La entrada puede ser una sola cadena o lista de caracteres.
- Como se trata de código de golf , la respuesta más corta, en bytes, gana.
- Tomamos dígitos o cadenas / caracteres.
Casos de prueba:
0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
lang.tryitonline.net
(ahora estio.run/#lang
). Entonces, un lenguaje llamado Talk causaría confusión con la URL de la sala de chat creada recientemente, que estalk.tryitonline.net
Respuestas:
Jalea , 3 bytes
La entrada es una lista única: el acumulador, seguido de los pares.
Pruébalo en línea!
Cómo funciona
El
y
átomo realiza transliteración; [a, b]y
c reemplaza a con b , por lo que devuelve b si a = c y c si a ≠ c .y@/
pliega / reduce la entraday
con argumentos intercambiados, realizando una transliteración por par.fuente
Python 3 , 43 bytes
Pruébalo en línea!
La función toma una sola cadena como entrada, donde el primer carácter es el estado inicial y el resto de la cadena representa los comandos. Esta solución se puede portar fácilmente a otros idiomas que tengan un mejor soporte para expresiones regulares.
La parte difícil es demostrar que la solución produce el resultado correcto. Para ver esto, necesitamos un análisis profundo de los comandos. En primer lugar, podemos ver que los comandos tienen las siguientes propiedades:
00
y11
retiene el estado del acumulador.01
y10
hace que el estado del acumulador sea el mismo que el segundo bit, independientemente de su estado original.Por lo tanto, el estado final del acumulador es:
01
10
existe un comando o , el estado final es el mismo que el estado inicial.10
o01
comando.A continuación, mostraremos que la solución produce el resultado correcto en ambos casos. Probamos la declaración para el estado final
0
y el estado final de1
puede probarse de manera análoga. Si el estado final es0
la entrada está en cualquiera de las siguientes formas:^0{2k+1}11(11|00)*
Para el caso 1 , la cadena de entrada
s
debe comenzar con2k+1
0s, seguida de11
y00
comandos. Eliminar00
sys11
produce un solo0
, que es el estado final..+10{2k+1}11(11|00)*
Para el caso 2 , la cadena de entrada termina con un
10
comando, seguido de cero o más00
y11
s. Este patrón es equivalente a un1
seguido por2k+1
0s, y luego cero o más11
sy00
s. La eliminación de00
sys11
deja atrás el último de los2k+1
0 al final de la cadena, que representa el estado final.Basado en todo lo anterior, después de la eliminación de
00
s y11
es simultáneamente en una sola pasada (01001
es un contra-ejemplo, si00
se elimina en una sola pasada y luego11
en otro pase) a partir de la entradas
, el último carácter es el estado final. Por lo tanto, se demuestra la exactitud de la solución.fuente
Perl 6 , 17 bytes
Pruébalo en línea!
Aprovecha "Puede combinar estas dos entradas en una entrada si lo desea" tomando la entrada como el valor del acumulador concatenado con los comandos, por ejemplo,
1,[00,11]
es10011
. Si esto no está bien, entonces solo son 5 bytes adicionales para tomarlo comof(accumulator, commands)
. Devuelve un objeto de coincidencia que se puede forzar a una cadena.Explicación:
Básicamente, esto funciona porque los comandos
00
y11
no hacen literalmente nada, mientras que los comandos01
y10
simplemente configuran el acumulador en el segundo dígito del comando. Si no hay comandos, toma el valor inicial del acumulador.fuente
Zsh , 33 bytes
La lista de caracteres se pasa como argumentos, el valor inicial del acumulador se pasa como stdin.
Pruébalo en línea!
39 bytes : si los comandos deben ser una sola cadena
La entrada es
accumulator
commands
como argumentos.Pruébalo en línea!
Por diversión, aquí hay una línea recursiva de 50 bytes ( TIO ):
fuente
Python 3 , 52 bytes
Pruébalo en línea!
Se corrigió el tipo de retorno inconsistente gracias a Chas Brown
Toma entrada como dos cadenas; El acumulador y el código.
fuente
f(1,'11')==f(1,'01')
esFalse
; a veces devuelve unint
y a veces unstr
. Entonces, ¿tal vez especifique que toma acc input como una cadena?Brachylog ,
119 bytesPruébalo en línea!
Dado que ha pasado tanto tiempo que he podido olvidar la noción de imprimir el acumulador después de cada comando , he formulado una solución significativamente menos ingenua con algo de inspiración de la respuesta de Perl de Jo King.
Vieja solución:
Brachylog ,
1816 bytesPruébalo en línea!
-2 bytes de cambiar el formato de entrada.
fuente
JavaScript (ES6), 27 bytes
Toma entrada como
(a)(code)
, donde el código es una lista de enteros de 2 bits.Pruébalo en línea!
JavaScript (ES6),
4740 bytesToma entrada como
(a)(code)
, donde el código es una cadena.Pruébalo en línea!
¿Cómo?
fuente
sed -E,
2619 bytesUn enorme -7 bytes de @Cowsquack al darse cuenta de que eliminar todos los pares también funciona.
Toma datos concatenados juntos en stdin. Inspirado por la respuesta de Perl de Jo King . Elimine los pares
finalesElimine todos los pares, luego obtenga el último dígito.Pruébalo en línea!Pruébalo en línea!fuente
s/.*\B//
, pero de todos modos cambiar ligeramente el enfoque da 19 bytes aún más cortos. ¡ Pruébelo en línea!s/(.)\1//g
funcionaría, ya que podría eliminar el final de un par y el comienzo del siguiente, pero aún funciona. ¡Excelente!s/(.)\1//g
es equivalente as/00|11//g
como se muestra en mi solución.Retina 0.8.2 ,
1811 bytesPruébalo en línea! El enlace incluye casos de prueba. Toma entrada concatenada. Ahorré 6 bytes gracias a @CowsQuack por señalar que eliminar todos los caracteres duplicados y luego tomar el último carácter restante funciona, aunque, de hecho, el puerto de la respuesta original de @ JoKing podría haber sido mejorado por 3 bytes incluso sin ese truco.
fuente
!`.$
, y luego otros 4 bytes porque no tienes que limitar a los pares finales ...Python 3 , 38 bytes
Pruébalo en línea!
Basado en la solución de Joel . Toma la entrada como una lista del valor del acumulador inicial (cadena de longitud uno) seguido de los comandos (cadenas de longitud dos). Encuentra el último comando con dos valores desiguales y genera su segundo carácter.
Para hacer que esto caiga al valor del acumulador inicial cuando no hay tales comandos, hacemos que la cadena de valor inicial de un solo carácter pase la prueba. Lo hacemos comprobando si una lista singleton con el último carácter es desigual a una lista de todos los caracteres anteriores, que se pasa por cualquier cadena de longitud uno o cadena de longitud dos con dos caracteres diferentes.
fuente
Perl 5
-p
,3733 bytesPruébalo en línea!
La entrada es de dos líneas: la primera línea es la secuencia de comandos, la segunda es el acumulador.
fuente
Python 2 , 56 bytes
Pruébalo en línea!
fuente
Jalea ,
86 bytesPruébalo en línea!
-2 bytes gracias a que Nick Kennedy me informó de un cambio de reglas. (Su propuesta de golf
EÐḟFȯṪ
parece algo más inteligente pero tiene la misma longitud que mi solución anterior menoss2
). El formato de entrada ahora toma los comandos como una lista de cadenas de dos caracteres, pero el pie de página de prueba se traduce del formato anterior por conveniencia.Traducido de mi nueva solución Brachylog.
Versión antigua:
Jalea , 13 bytes
Pruébalo en línea!
No estoy 100% seguro de que esto sea correcto, pero tiene éxito en los tres casos de prueba. Toma los comandos como argumento izquierdo y el acumulador inicial como argumento derecho.
fuente
EÐḟFȯṪ
con la entrada como, por ejemplo[[0,0],[0,1],[1,1],[1,1],[0,1]]
.Haskell , 29 bytes
Define una función sin nombre en la primera línea con tipo
(Foldable t, Eq b) => b -> t [b] -> b
. Para los propósitos de este código de golf, podemos instanciarlo comoChar -> [String] -> Char
donde el primer argumento es el acumulador y el segundo es una lista de cadenas con cada cadena como un solo comando.Pruébalo en línea!
fuente
Python, 111 bytes
Sin golf. EDITAR: AHHH ¡Alguien me ganó!
fuente
Haskell , 36 bytes
Pruébalo en línea!
Toma datos como
f(string)(char)
donde el personaje es el acumulador y la cadena es la lista de comandos.fuente
05AB1E , 3 bytes
Pruébalo en línea!
Zip, volcar en la pila, reemplazar.
fuente
Stax , 3 bytes
Ejecutar y depurarlo
Para cada instrucción, realice la traducción de caracteres.
fuente
Barrilete ,
-ir
, 16 bytesPruébalo en línea!
Explicado:
Toma la entrada implícita y la derecha desplaza el valor de los acumuladores hacia abajo
Repita lo siguiente (longitud de la pila - 1 dividido por 2) veces
2.1. Mueva el acumulador de regreso a la parte superior
2.2. Compare por igualdad con la primera parte del comando
2.2.1. Si es cierto, reemplace el acumulador, de lo contrario, haga estallar el reemplazo
La entrada se toma como el valor acc inicial concatenado con la fuente. P.ej
fuente
Bash ,
5840 bytesAgregue un byte para un programa completo: cambie
f
a$0
.58 bytes ¡Pruébelo en línea!El ternario devolverá falso cuando
$1
se establece en0
, pero,1
al final asegura que todo((expression))
volverá verdadero, excepto un error de sintaxis.Cuando se consumen todos los argumentos, se produce un error de sintaxis y finaliza la recursividad.
fuente
Carbón , 16 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma argumentos separados. Explicación:
Divide las instrucciones en pares de dígitos y repítelos.
Si el acumulador es igual al primer dígito ...
... luego asignarle el segundo dígito.
Imprima el acumulador al final del ciclo.
fuente
MATL ,
1312 bytesToma la entrada como una matriz de 2 columnas donde cada fila es un comando y un número
Pruébalo en línea! O verificar todos los casos de prueba
fuente
Jalea , 7 bytes
Un enlace diádico que acepta el programa como una lista de enteros a la izquierda y el acumulador inicial a la derecha que produce un entero.
Pruébalo en línea! O ver un conjunto de pruebas
fuente
PHP , 38 bytes
Pruébalo en línea!
Básicamente puerto de la idea de Jo King .
fuente
Encantamientos rúnicos , 28 bytes
Pruébalo en línea!
Toma la entrada como una serie de bytes separados por espacios (Runic no entiende las listas). El primer byte es el estado inicial y cualquier otro byte es el programa. No se realiza ninguna validación (es decir, se supone que solo se proporcionan programas válidos como entrada y no le importa qué valor se usa para representar
0
y1
).fuente
Asamblea x86, 33 bytes
Toma el estado inicial del acumulador en
CL
(entero0
o1
) y la dirección de los comandos como una cadena ASCII terminada en ceroESI
. Deja el estado final del acumulador enCL
.Apunte la instrucción de llamada al desplazamiento
0x1B
(etiquetainterpret
en la Explicación).Explicación (Uso de la sintaxis de Intel):
fuente
C (gcc) ,
4541 bytesPruébalo en línea!
¡4 bytes eliminados gracias a @ErikF!
fuente
Cristal , 46 bytes.
Con comandos en un
Array(Tuple(Int32,Int32))
, como[{0,0}, {0,1}, {0,0}]
.def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end
Pruébalo en línea!
Es bastante simple de entender en una forma más legible:
La función recorre cada comando, desempacando automáticamente los valores de tupla en
c
yv
. Luego establece elstate
por la fórmulaa lo que llegué principalmente por prueba y error. Una vez que se han procesado todos los comandos, devuelve el valor del estado.
fuente
C (clang) ,
6862 bytesPruébalo en línea!
Lleva un puntero al inicio de la cadena de origen, un puntero al final de la cadena de origen (inicio + strlen (inicio)) y el valor del acumulador inicial.
Versión anterior (imprime ASCII 48/49 para 0/1):
fuente
Java (JDK) , 38 bytes
Pruébalo en línea!
Las entradas son una
int
y unaIntStream
de0
,1
,2
o3
, que corresponden a00
,01
,10
,11
de binario.fuente