Deadfish es un "lenguaje de programación" de broma con cuatro comandos. Como la página de Esolang es un poco contradictoria y los intérpretes de esa página no funcionan exactamente igual, debe implementar la siguiente variación:
Especificación
- Hay un acumulador que tiene al menos 16 bits de tamaño, se permite más pero no menos. Los números negativos no necesitan ser compatibles. El acumulador es
0
cuando comienza el programa. - Existen los siguientes dos conjuntos de cuatro comandos, y su programa debe admitir ambos al mismo tiempo.
Deadfish estándar │ Variante XKCD │ Significado ─────────────────────┼──────────────────┼───────── ─────────────────────────── i │ x │ Incremento acumulador d │ d │ Decremento acumulador s │ k │ Cuadrado (acc = acc * acc) o │ c │ Acumulador de salida, como un número
- Si, después de ejecutar un comando, el acumulador es
-1
o256
, el acumulador debe restablecerse a cero. Tenga en cuenta que esto no es normal. Si, por ejemplo, el acumulador es20
, y els
comando se ejecuta, el acumulador debería estar400
después. Del mismo modo, si el acumulador es257
yd
se ejecuta el comando, el acumulador debería convertirse0
. - Cualquier entrada que no sea uno de estos comandos debe ignorarse.
Programas de prueba
xiskso
debería salir0
xiskisc
debería salir289
I / O
Su programa debe mostrar un mensaje: >>
. La solicitud debe estar al comienzo de una nueva línea. Luego debería leer una línea de entrada del usuario y ejecutar los comandos dados de izquierda a derecha. Al generar números, los números deben estar separados. Es decir, 12 34
está bien, 12,34
está bien,
12
34
está bien, pero 1234
no lo está.
Su programa debe seguir haciendo esto en un bucle, al menos hasta que EOF
se alcance.
Sesión de ejemplo:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
marinus
fuente
fuente
#{STDIN.gets}
funcionaría, pero de hecho no lo hace.Respuestas:
K, 77 bytes
Tenga en cuenta que esto es K4 . Una solución K6 es un poco más larga porque los verbos IO son más largos, incluso si todo lo demás es mejor:
""0:
imprime y devuelve su argumento. Tenga en cuenta que en K4 simplemente aplicamos a 1 .0 f/ args
demuestra reducir con un valor inicial, es decirf[f[0;first arg];second arg]…
{x*2=-1 256?x…
clasifica x en 0 (para -1), 1 (para 256) y 2 para todos los demás valores.2=
significa que obtenemos1
valores no clasificados y0
, de lo contrario, multiplicar porx
es más corto que un condicional. En K6 podemos hacerlo un poco mejor porque se{x*^-1 256?x:y@x}
basa en el hecho de que-1 256?x
devuelve0N
(nulo) y^
detecta nulos."xkcdiso"
lugar del orden sugerido porque7#
envolverá los cuatro argumentos, es decir,7#"abcd"
retornos, lo"abcdabc"
que mantiene nuestra tabla más pequeña"x"
y"i"
de la proyección1+
que es equivalente a la función{1+x}
pero más corto."d"
a la proyección-1+
que es equivalente a la función{-1+x}
pero más corta."k"
y"s"
a la función{x*x}
"c"
y"o"
de la función de salida{-1@$x;x}
que a su vez en K6 es un poco más largo:{""0:,$x;x}
pero ambos imprimir su salida seguido de una nueva línea, y luego devuelve el argumento.o`
cuál es más corto.fuente
Perl 5 , 90 bytes
Pruébalo en línea!
¡Gracias a @xfix por su ayuda en esto anteriormente! ¡Guardado 4 bytes gracias a @Xcali !
fuente
1
cuando el acumulador se desborda. Además, puede acortar su programa en cinco caracteres, cambiando$a
a$?
(que se inicializa0
y no cambiará hasta que ejecute algún programa externo desde Perl).issso
como un comando, no si ejecuta cada uno por separado ... Veré esto más adelante y ciertamente lo usaré$?
. ¡Gracias!''
lugar de""
hacerlo, cuando se usa conperl -e '...'
el mapa terminaría con el resultado des///
. ¡Gracias de nuevo!Powershell,
131126121114113for($x=0){...}
- establece el acumulador en 0 y repite para siempreread-host '>>'
- obtener la entrada del usuario con solicitud>>
[char[]](...)
- convierte la entrada del usuario en una matriz de caracteres|%{...}
- realiza lo que hay dentro{}
de cada personajeswitch -r($_)
- interruptor de expresiones regulares para cada personaje"i|x"{$x++}
- igualari
ox
- aumentar el acumulador"d"{$x-=!!$x}
- coincidird
- disminuir$x
en!!$x
, lo que será0
si$x
es0
, y de lo1
contrario. Esto asegura que el acumulador nunca llegue-1
."s|k"{$x*=$x}
- partidos
ok
- cuadrado"o|c"{$x}
- emparejaro
oc
- sacar el acumulador$x*=$x-ne256
- multiplique el acumulador por0
si es así256
o por1
otroSalida de ejemplo
Supongo que la implementación de
read-host
es específica del host, por lo que este host Powershell (ConsoleHost) se agrega:
al indicador especificado.fuente
!!$x
, lástima que no puedo utilizar eso ...Rebol 3,
178169161159 159Versión más bonita:
fuente
Haskell, 202
fuente
e
yv
en operadores. También intenté reescribirv
yg
para que el parámetrox
permanezca en IO y se elimine,print
etc. No pude hacer que funcionara, pero creo que ese podría ser un buen lugar para alguien que conoce sus problemas.IO
es que imprimen con demasiada frecuencia (es por eso que usé enr n
lugar dex
) o no lo suficiente porque el valor nunca se solicita ... Entonces, ¿cómo cambiaríae
yv
convertiría en operadores?'i'%x=x+1;'d'%x=x-1
... Y simplemente llámelo en vdo n<-x;r$w$o%n
. La razón por la que los operadores ahorran espacio es que no requieren espacios a su alrededor.Rubí,
140138Sesión de muestra (igual que la tuya):
fuente
K, 121
.
fuente
Ada
Aquí hay una implementación de Ada para los pocos interesados en este lenguaje. Me llevó bastante tiempo utilizar algunas de las mejores prácticas de Ada (como el uso de Indefinite_Holders en lugar de acceso) y también comprender completamente cómo debe funcionar Deadfish.
Y la salida:
Si algunas personas experimentaron en Ada podrían darme algunos consejos de optimización, estaría agradecido.
fuente
C, 159 caracteres
Intenté otro enfoque basado en configurar una tabla de búsqueda para la decodificación de instrucciones, pero desafortunadamente eso terminó más tiempo ( 169 ). Lo incluí ya que a alguien se le ocurre un ajuste inteligente para reducir el tamaño. (Debe ejecutarse sin ningún argumento)
fuente
C, 163
fuente
Pitón 3,
181175171162Esto genera una nueva línea después del¡Ya no!>>
, pero el OP no dijo que no estaba permitido.Gracias a
GlitchMr
,minitech
egolfer9338
!fuente
lambda
lugar dedef
para una función que vuelve inmediatamente.x in(-1,256)
Guarda dos personajes. Alternativamente,s=lambda x:"a=%d"%(x!=-1and x!=256and x)
podría salvar algunos.print(">>")
y usarfor i in input(">>")
en su lugar;input()
permite especificar un aviso. Entonces, no habrá nueva línea después>>
, y guardará caracteres.R,
161,148, 138Versión sin golf:
Ejemplo de sesión (en modo interactivo):
fuente
Pitón 3, 141
Sé que llego tarde, pero quería aprovechar la oportunidad para publicar una versión más corta de Python (y mi primer intento de CodeGolf). :)
La declaración impresa fue un poco complicada para esto. Si la solicitud tiene que terminar con un espacio en blanco, agregue un carácter al conteo. :)
Explicación
v
Es el acumulador.m
comprueba si el valor dado es-1
o256
. Si es así,0
se devolverá, el valor de lo contrario.En las siguientes líneas, las operaciones se asignan a las variables correspondientes (ya que algunas tienen el mismo significado (como
i
yx
) esto es más corto que crear instancias de un nuevo diccionario). Esos son luego utilizados en elexec
continuación.while 1:
es el bucle principalAhora comienza la diversión. Al igual que la solución de @jazzpi , itera sobre cada carácter de la entrada.
locals()
es el diccionario de todas las variables actuales (visibles). Con.get(n,'')
la clave correspondiente se colocará en la cadena de ejecución (una cadena vacía, si no se encontró la clave (= otra entrada)). Esto será, cuando se ejecute, se concatenev
y pase haciam
. El valor de retorno se almacenaráv
nuevamente.Repita esto hasta que esté aburrido. :)
fuente
y*(-1!=y!=256)
de -3 bytesPitón 2, 139
Esto es ordenado, pero también bastante sencillo. Aquí hay una versión más larga y fresca:
Con un peso de 190 caracteres, quizás no sea la respuesta más competitiva aquí. Por otro lado, las corutinas son bastante radicales y siempre estoy buscando una excusa para usarlas (y compartirlas)
fuente
TI-BASIC,
104 10710210098Para calculadoras de la serie TI-83 + / 84 +.
Nombra esto
prgmD
; eventualmente desborda la pila al llamarse a sí mismo. Reemplace la recursión con aWhile 1
, al costo de dos bytes, para arreglar esto.Y es 0 por defecto, así que ejecute esto con una calculadora recién borrada de memoria o almacene 0 a Y manualmente antes de ejecutar esto.
Lástima que las letras minúsculas (en los literales de cadena) sean de dos bytes cada una; de lo contrario, esto sería más corto que la respuesta de Dom Hastings.
EDITAR: se corrigió un error de división por cero (0 ^ 0) a costa de tres bytes.
107 -> 102: Utilicé el truco de exponenciación imaginaria para guardar cuatro bytes (incluido 1 de paréntesis y -1 de alargar la cadena de búsqueda) y utilicé Y en lugar de X, que toma un byte menos para inicializar.
fuente
Posdata 272
Sin golf:
fuente
C (
224212 caracteres)Esta es probablemente una mala elección de idioma, pero bueno. No es que un lenguaje como C pueda funcionar mejor que un lenguaje de programación dinámico. En Clang, deberá especificar un valor para
return
(esto no es necesario para gcc).fuente
define q
y usarprintf
?q
se usa 3 veces, por lo quedefine q
ahorra ~ 2 caracteres.Lua,
230228No lo peor, no lo mejor.
NOTA: según lo informado por @mniip
256or
puede no funcionar en su intérprete. Más información en comentarios.(más o menos) Versión legible:
Salida:
Editar: gracias a @mniip para la optimización de 2 caracteres:
until nil
->until _
fuente
repeat until x
(x es nulo como no se ha definido) es 2 caracteres más corto ywhile 1 do end
tiene exactamente la misma longitud, aparte de eso, ¿qué versión de lua es esa?256or
es una sintaxis no válida en mi intérpreterepeat until x
. Estoy usando el último binario de Windows desde aquí . Como puedes vera=a+1 elseif
tienes espacio. Eso es porquee
es un dígito hexadecimal, mientras queo
en256or
no lo es, por lo que mi intérprete tomaor
como otra declaración / bloque / howYouCallIt.256or
, también0repeat
y1then
; Estoy usando lua oficial de lua.org, su código no se compila en 5.1, 5.2 o 5.3Haskell ,
186178 bytesEsto tiene que ejecutar con
runhaskell
(o en el interiorghci
), ya que ambos establecen elBufferMode
queNoBuffering
por defecto que cajas fuertes un buen montón de bytes:Pruébalo en línea!
Explicación
Esto define un nuevo operador
state # source
(la declaración fijeza nos permite caer paréntesis, cuando se utiliza en conjunción con otros operadores(+)
,(-)
,(^)
,(:)
y(>>)
):-1
y256
r#_
), lee otros nuevos y comienza de nuevo manteniendo el estado anteriorPara comenzar el proceso, inicializamos el estado
0
y leemos una nueva línea de origen, es decir. Comience con una fuente vacía:fuente
Lote de Windows,
204256Ignora con éxito otros comandos. Realmente se hinchó sin tener
or
que trabajar con ...Editar:
fuente
Script de comando de Windows - 154
Abusin características desconocidas al máximo.
fuente
> <> , 258 bytes
He hecho otra respuesta> <> ya que no pude probar las fases y usó comandos preapilados en lugar de emular un shell de todos modos.
Ciertamente se puede jugar golf, ¡pero no estoy seguro de tener la valentía de
locuranecesaria !Lo probé con el intérprete oficial que se ejecuta en Python 3.5 en Cygwin en Windows 7 y pude reproducir la ejecución de prueba:
En caso de que no pueda ejecutarlo en su máquina (la entrada parece ser complicada) o simplemente desea probarlo sin ningún otro software, puede usar la siguiente versión en el intérprete en línea .
Obviamente, ignora \ ny EOF ya que no puede ingresarlos en el intérprete en línea, pero se comportará como si se hubiera presionado enter después de cada comando de salida.
fuente
C (gcc) , 139 bytes
Compilar con
-Dk="_nZZiaeY"
(incluido en el recuento de bytes). -2 bytes si>>\n
se permite la solicitud .Pruébalo en línea!
Degolf
fuente
Barril , 68B
fuente
Haskell, 230
¡Ojalá pudiera deshacerme de esa molesta
hFlush stdout
llamada! Sin él, la solicitud no se muestra hastao
que se realiza una operación. ¿Algún consejo?fuente
hFlush
usando enrunhaskell
lugar de compilar (ver mi respuesta ), pero en cuanto a esta solución, no es válida y hay errores.PHP + HTML 345
la salida es un poco incompleta (el historial / sesión se muestra en un área de texto, y con el informe de errores habilitado se imprimen muchas advertencias) pero todo funciona
fuente
> <>, 239
La pila inicial es la entrada. Puedes probarlo en línea aquí .
fuente
Golf-Basic 84, 88 caracteres
Solicita un comando a la vez, como en al menos otras 3 soluciones. Aquí hay una prueba de funcionamiento para
xiskisc
:También,
xiskso
salidas 0, como debería.fuente
JavaScript (Node.js), 204 bytes
Esto probablemente se puede jugar al golf. Node.js nuevamente demuestra que es extraño verbosidad disfrazada una vez más. Código explicado:
fuente
C #, 311 bytes
sería de 283 bytes si los usos y la declaración de clase, etc. pudieran omitirse simplemente proporcionando una definición de función
fuente