# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
es una pestaña literal, ␛
un carácter ESC literal; Stack Exchange destrozaría el programa de otra manera. Recomiendo copiar el programa desde el cuadro de "entrada" del enlace TIO a continuación, si desea trabajar en él.
Pruébalo en línea!
Puntuación VIP (Impresora entera versátil): 0.01329
Atropellar
Este programa imprime 41 en brainf ***, 40 en Minimal-2D, 39 en CoffeeScript, 38 en C, 37 en C ++, 36 en Labyrinth, 35 en INTERCAL, 34 en Rail, 33 en Incidente, 32 en Whirl, 31 en SNUSP modular, 30 en espacios en blanco, 29 en disparador, 28 en Brain-Flak, 27 en Perl 6, 26 en 05AB1E, 25 en Pip, 24 en Thutu, 23 en Hexagony, 22 en baja carga,21en Nim, 20 en Prelude, 19 en Reng, 18 en Cardinal, 17 en Julia, 16 en Pyth, 15 en Haystack, 14 en Turtlèd, 13 en Ruby, 12 en Fisión, 11 en Befunge-98, 10 en Befunge-93 , 9 en Perl 5, 8 en Retina, 7 en Japt, 6 en SMBF, 5 en Python 2, 4 en> <>, 3 en Minkolang, 2 en V / Vim y 1 en Python 3.
Verificación
La mayoría de los idiomas son probados por el controlador de prueba que se muestra arriba. Puede probar Reng aquí y Modular SNUSP aquí ; producen 19 y 31 respectivamente, según sea necesario.
El controlador de prueba se ha actualizado para incluir el Tokenizer, finalmente. Todo el código C se almacena como argumento desde la perspectiva de Bash Script. También cambié la salida para ajustar horizontalmente con un espacio final después de cada token en lugar de generar verticalmente. Esta fue solo mi preferencia, para que coincida con la salida de espacios en blanco. Pero cualquier otra persona puede cambiarlo si siente que es demasiado confuso.
También realicé un ajuste de Test Driver para manejar el espacio entre columnas para el carbón UFT8 de Turtlèd en el resumen. ¡Esa desalineación me estaba volviendo loco! El "arreglo" es bastante hack-ish ya que solo busca un è y cambia el ancho de columna para ese caso, pero hace el trabajo.
Explicación
En primer lugar, quiero decir cuán impresionante fue el fragmento de código de resumen de puntuación de la impresora de versátil entero de @ SnoringFrog de la última publicación. He estado calculando respuestas antes de publicar por un tiempo, y esto me ha inspirado a mantenerlo pequeño. Creo que con el tiempo podremos superar la respuesta de @ sp3000.
Así que comencé a trabajar en esta respuesta intentando descifrar lo que pude y tuve bastante éxito. Incluso tuve una respuesta en un idioma diferente con un recuento total de bytes menor que # 40. Pero cuando intenté jugar Minimal-2D, tuve que aprender BF para poder trabajar mejor con sus derivados y en el proceso encontré el récord de @ Primo ¡Hola, Mundo! . Me enamoré de la elegancia.
Resultó que Minimal-2D no era lo suficientemente eficiente como para utilizar la técnica de inicialización de cinta utilizada por @Primo, pero ahora creo que, de todos modos, probablemente sería demasiado pesado. Solo estamos tratando de imprimir un número entero después de todo. Pero @Primo me envió por el camino para aprender a multiplicar en BF, que traje al código Minimal-2D.
Luego de todo esto, volví a leer el comentario de @ SnoringFrog sobre cómo incluir BF y me di cuenta de que no solo podía hacerlo, sino que podía usar gran parte del código Minimal-2D que había escrito en la respuesta BF. Así que busqué para responder con BF, y aquí estamos.
Una cosa más antes de entrar en detalles. Hubo un par de cambios que hice por razones ajenas al golf. Primero, moví la mayor parte del código que @SnoringFrog agregó a justo debajo de los idiomas 2D en las varias filas superiores. Para mí, es un movimiento estratégico a largo plazo para evitar que los lenguajes 2D atraviesen el centro del políglota con el fin de evitar futuros errores cuando sea posible. El golpe de byte fue bajo para este movimiento, así que lo hice.
En segundo lugar, durante los diversos factores, aprendí que Begunges y Minkolang generan un espacio final después de las salidas numéricas y que esta fue la causa de los bytes nulos que hemos estado viendo en el controlador de prueba para estos idiomas. Lo arreglé enviando el valor de la pila como un código ascii (que no incluía la función de espacio final), en lugar del valor directamente. También hubo un pequeño byte para este cambio, pero ahora la salida del Test Driver es tan uniforme. ¿Cómo no iba a hacerlo?
SM / BF
Repasemos rápidamente lo básico. Estos son los únicos comandos válidos para SMBF y BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Ambos idiomas tienen una cinta de memoria donde los valores se almacenan y cambian. La única diferencia de SMBF es que cualquier código que se esté ejecutando también se almacena en la cinta de memoria a la izquierda del punto de partida. Como señaló @SnoringFrog, lograr que SMBF y BF produzcan resultados diferentes depende de mover el puntero de memoria a la izquierda del origen. En el intérprete BF de Tio, el puntero de memoria es capaz de moverse hacia la izquierda del origen y encontrará ceros en lugar de los códigos ascii de Polyglot que ve SMBF. Aquí hay un ejemplo que se puede ejecutar tanto en SMBF como en BF para ejemplificar la diferencia.
Al comienzo del políglota, los Befunges requieren que la >
segunda fila se ejecute hasta su finalización y Perl6 requiere que cada uno >
sea precedido por a <
. Entonces, SM / BF comienza con <>
dejar el puntero de memoria en el origen, luego golpea uno [
que salta algunos caracteres ofensivos para ambos idiomas a ]
la 6ta fila.
A continuación, incrementamos la celda de memoria de origen para ambos idiomas y movemos el puntero de memoria hacia la izquierda con +<
. (Para la convención conversacional, llamaremos a la celda de memoria de origen como celda 0, celdas a la derecha del origen 1, 2, ... Y celdas a la izquierda -1, -2, ...). La celda -1 contiene el código asci del último carácter en el políglota en SMBF y 0 en BF, por lo que cuando [
se encuentra el siguiente , solo BF salta al siguiente ]
mientras SMBF pasa al código.
A medida que SMBF atraviesa [.>-]
, imprime los 6 que se encuentran al final del políglota y luego mueve el puntero de memoria nuevamente a la celda 0, estableciendo su valor nuevamente en cero para salir del ]
. Para revisar, las cintas en esta pinta son: las celdas negativas de SMBF contienen el políglota, y es 0 y las celdas positivas tienen cero. Las celdas negativas y positivas de BF tienen cero mientras que su celda de origen tiene 1.
A continuación, >
mueve SMBF a la celda 1 y BF a la celda 0, lo que permite que BF ingrese su bloque de código privado: [<+++++[>++++++++++<-][<<<]>+.---.>]
(he eliminado los caracteres que no son BF de esto). Aquí, volvemos a la celda -1 e inicializamos nuestra variable de control de ciclo (celda -1) a un valor de 5. Luego ingresamos al ciclo donde agregamos 10 a la celda 0 y disminuimos la celda -1 cinco veces antes de salir del ciclo donde estaremos apuntando a la celda -1 con un valor de 0.
Luego nos encontramos [<<<]
mientras apuntamos a un cero, por lo que BF no pasa por esto. El propósito aquí es equilibrar un número de >
's con los anteriores <
para que Perl6 no se equivoque.
En este punto, la celda 0 tiene un valor de 51. El valor ascii de 4 es 52, por lo que movemos el puntero a la celda 0 y agregamos 1, luego imprimimos el valor. Y finalmente, disminuimos la celda 0 al carácter ascii 1 e imprimimos nuevamente antes de configurar el puntero de memoria en la celda 1 (valor 0) para salir más allá del ]
.
SMBF y BF ambos golpearon el último [
en la línea 8 siguiente mientras ambos descansan en un valor 0. Por lo tanto, ambos saltan el código Minimal-2D restante hasta que ]
se encuentra en la línea 11. Pero esto es de corta duración porque la línea 12 comienza con otra [
que lleva a ambos idiomas casi al final del políglota, donde no se encuentran más instrucciones.
Refactores
Minimal-2D
La reescritura de Minimal-2D fue principalmente para guardar algunos bytes de una manera similar al truco de multiplicación de BF. Sin embargo, Minimal-2D no tiene los caracteres [
y ]
para el control de bucle. En cambio, tiene estos comandos:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Estos pueden usarse para producir la misma estructura lógica, aunque en una mansión 2D, como la de BF. Por ejemplo, BF ++++++[>++++++<-]>.
es equivalente a esto en Minimal-2D.
Aquí hay una versión simplificada del código de Minimal-2D en el políglota, con todo el código extraño eliminado y todos los lugares que contienen caracteres reemplazados #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
La D
línea 1 envía el puntero de instrucciones a la L
línea 8 de la poliglota que envía el puntero a la izquierda. Aquí establecemos la variable de control de bucle (celda 0) en 7, movemos el puntero de memoria a la celda 1 e ingresamos un bucle. En el bucle, agregamos 3 a la celda 1, disminuimos la celda 0 y luego verificamos si el valor de la celda 0 todavía es cero. Si no, agregamos otros 8 a la celda 1, luego disminuimos y verificamos nuevamente. El resultado de este ciclo es que el valor de la celda 1 se establece en 51 al final del ciclo (6 * 8 + 3).
Salimos del bucle saltando U
, moviendo el puntero de memoria a la celda 1 y bajando hacia la derecha en la línea 11 del políglota. Y finalmente, incrementamos hasta el valor ascii para 4 y luego disminuimos hasta el valor ascii para 0 antes de correr hacia la derecha para finalizar el programa.
Retina
La retina tenía muchos requisitos con los que era difícil trabajar para todos los derivados de BF. No le gustan los consecutivos +
o no coincidentes ()
o []
. Pero estos son realmente requisitos para cualquier otra línea, por lo que gran parte del trabajo para BF, SMBF y Minimal-2D giraba en torno a poner la mayor parte del código en líneas pares.
Sin embargo, el único byte comprometido únicamente con Retina es |
al final de la línea 11. Para citar @ ais523 “la mayoría de las expresiones regulares que terminan en | coincidirá con cualquier cosa ". Sin esto, Retina devuelve 0. Por qué esto lo soluciona, no lo sé. No he tenido que profundizar demasiado en Retina, probablemente porque he estado evitando la larga cola. Pero al igual que Prelude, descubrí que no necesito entenderlo tanto como necesito entender cómo depurarlo, que en este caso consistió principalmente en eliminar líneas (en múltiplos de 2) hasta que encontré la línea eso hace que se rompa. Adiviné esta solución basada en el comentario de @ ais523, y fui recompensado. Soy demasiado genial para la escuela, supongo.
Cardenal
Me gustó la ubicación de @ SnoringFrog de Minimal-2D en relación con el código de Cardinal. Es una buena ubicación teniendo en cuenta que Cardinal no molesta a Retina, y parecía permitir entretejer con Minimal-2D. Entonces, cuando me propuse trasplantar tierra Minimal-2D a 2D, traje a Cardinal para el viaje. Sin embargo, hubo un par de cambios cosméticos en Cardinal. Primero, lancé >
casi al comienzo de su declaración #p x%>~~~+ +~*ttt*.x
para Minimal-2D para cambiar los punteros de memoria dentro de su ciclo / Segundo, moví todo un carácter a la derecha para dar espacio Minimal-2D para salir de su ciclo con gracia. En p
este aguijón es para este relleno de caracteres.
Befunge / 98
Los Befunges son en realidad donde comencé a intentar jugar golf en el políglota, ya que el refactor de C ++ cambió todos los demás códigos de lenguaje 2D, excepto este. Al tratar de saber que WTF estaba sucediendo en este código, encontré esto en la documentación de Begunge:
El .
comando sacará un valor de la pila y lo mostrará como un entero decimal, seguido de un espacio , algo así como Forth. ,
mostrará un valor, lo interpretará como el valor ASCII de un carácter y generará ese carácter ( no seguido de un espacio ) .
¡Santos humos! Podemos limpiar los bytes nulos en la salida. Después de esto, todo fue solo cuestión de descubrir cómo ingresar los valores asci más grandes y segregar el código. Befunge-98 tenía un código de salto ;
contando para saltarse la [77*,68*,@
de ;[77*,68*,@;'1,'1,q
, que nos dio la segregación.
Befunge-98 también tenía un comando ( '
) para tomar el código ASCII del siguiente personaje. Entonces, '1,
toma el código asci para el carácter 1
, lo coloca en la pila y luego imprime el carácter ascii para el valor superior en la pila con ,
. Solo tengo que hacer esto dos veces para imprimir 11 y soltar una q
para salir con gracia.
Befunge propiamente dicho es un poco menos conveniente, pero solo justo. Aquí tenemos que realizar un cálculo para poner el código deseado en la pila. Afortunadamente, nuestros códigos se multiplicaron fácilmente con 7 * 7 y 6 * 8 antes del mismo comando de salida ,
. Luego salimos de Befunge @
antes de que el código de su hermano mayor contaminara la salida.
Minkolang
Después de encontrar una solución para los espacios finales de Befunge, me entusiasmó la idea de encontrar una solución de Minkolang también y la documentación de Minkolang decía que el comando de salida que se había utilizado hasta este punto funcionaba de la misma manera que el Intérprete de Befunge. O
resultó estar documentado como otro comando de salida, que no se describió como compartir este Begunge-ness, así que solo tomé una foto en la oscuridad e intenté sacar la cadena "3"
. Victoria impecable.
> <>
Una de las primeras cosas que miré al mover el código Minimal-2D fue verificar que podía mover> <> junto con él. Si iba a tratar con el transversalismo políglota 2D, iba a tratar con todas las transgresiones. Básicamente, la suerte me abrió paso en la solución de poner ;n4
al final de la línea 1 y avanzar \D
más atrás en la línea 1. Por cierto, no sabía que> <> podría dirigirse hacia abajo antes de la respuesta 40, ya que está tan bien contenido . Me gustaría pensar que esto podría usarse más tarde para divergir> <> de otro lenguaje similar.
Perl6
He hablado sobre algunos de los problemas de <>
equilibrio de Perl6 en otra parte de esta respuesta, por lo que no volveré a analizarlo nuevamente. Pero sí quiero señalar que me mudé #>27.say#
a la penúltima línea. Esto no tiene un propósito funcional en esta respuesta. Realmente hice este movimiento para satisfacer una respuesta diferente que terminé no usando esta ronda. Decidí dejarlo ya que planeo publicar esa respuesta en mi próxima oportunidad y no quería molestarme en deshacerlo y volver a hacerlo.
Corrección de errores
05as1e
A 05as1e definitivamente no le gustó tanto el nuevo código de Begunge como la versión anterior. Supongo que es el ,
s ya que ese es el único personaje revolucionario. En cualquier caso, tuve que "
retroceder más en la línea dos para ocultar los comandos ofensivos, y sabía que "
tenía que ir antes de la ruta del código Befunge ya que "
era un sí en ambos idiomas. (Puedo inventar términos como yes-op ¿verdad?) La 2-dimensionalidad de Line 2 es bastante rígida, pero pude desplazar el <
camino anterior del código de Begunge con el "
. Sin <
embargo, era un requisito de Perl6. (Tiene que tener un s <
anterior >
.) Pude dejar la <
línea uno en un lugar adivinado por el instinto y la presciencia resolviendo 05ab1e y el desacuerdo de Perl6.
Giro
Los cambios de Befunge en la línea 2 agregaron un extra 1
al políglota antes de la línea Incidente / Torbellino. Este extra 1
hizo que Whirl comenzara a señalar las instrucciones incorrectas en la rueda. La primera 1
en la directiva de preprocesador de C / C ++ fue solo una referencia de número de línea en el código, y esto podría ser fácilmente cualquier otro número de línea, por lo que lo cambié arbitrariamente 4
para satisfacer Whirl.
Incidente
La cadena de destokenización al final del políglota es bien conocida en este punto, por lo que no voy a entrar en ella. Quité de la cadena lo que pude y agregué los nuevos tokens que se requerían. Hay 2 caracteres de destokenización que no están en esta cadena, aunque debo señalar. En primer lugar, el segundo R
en el #R+.----.R >]|
que se necesita aquí porque es un punto de fusión de partida, y que era más seguro en esta línea porque ya existía un encabezado punto de fusión de partida en la misma dirección. En segundo lugar, el x
de #= x
es eliminar una ficha involucrado en un ␉␊#
patrón, que se ha vuelto más común.
Otros
Hexagony, Whitespace y Prelude tuvieron todos los ajustes menores habituales, pero nada especial de lo que valga la pena hablar.
Pensamientos finales
Eso es todo lo que tengo para esta respuesta. Para aquellos que buscan un punto de partida en la próxima respuesta, sugeriría el mal. Parece viable, aunque no lo he mirado demasiado de cerca, pero sospecho que no sería demasiado difícil de integrar. Sé que tiene un comando de salto que debería ayudar a saltar la mayor parte del políglota. Buena suerte.