Superando el tamaño del clúster

37

Harto de la fiabilidad del almacenamiento flash, decidió almacenar todos sus programas en uno de esos viejos y flexibles disquetes de 1,440 KiB. Sin embargo, después de copiar ni siquiera 3.000 programas, el disco estaba lleno. ¿Cómo es eso posible? Experto en el arte del código de golf como eres, la mayoría de tus programas no tienen ni siquiera 100 bytes de longitud, por lo que debería quedar mucho espacio ...

Después de preguntar sobre eso en Super User, descubres que te ha perjudicado el tamaño del clúster del sistema de archivos , una trama malvada de los diseñadores de FAT12 que deja una porción significativa de tu disquete sin usar y te obliga a comprar más de lo que realmente necesitas.

¿Comprar más disquetes? ¡Nunca! El tamaño del clúster será un problema menor si simplemente guardamos varios programas en un archivo, lo cual es posible porque diferentes compiladores / intérpretes se comportarán de manera diferente para el mismo código fuente.

Tarea

Escriba un políglota que se ajuste a un solo clúster (512 bytes o menos) y resuelva la mayor cantidad posible de las siguientes tareas.

  1. Lea todas las entradas e imprímalo.

  2. Imprimir Hola, mundo! .

  3. ¡Lea una línea / argumento ( nombre ) como entrada e imprima Feliz cumpleaños, [nombre]! .

  4. Lea todas las entradas e imprima ¡ Me encantan las pestañas! si contiene uno o más tabuladores (0x09) y odio los espacios! si no es así

  5. Lea dos líneas / argumentos e imprima un valor verdadero si el segundo es una subcadena del primero y un valor falso si no.

  6. Lea una línea / argumento e imprima un valor verdadero si sus caracteres están en orden estrictamente ascendente y un valor falso si no.

  7. Lea una línea / argumento y un carácter e imprima los índices de todas las apariciones de ese carácter.

  8. Lea una línea / argumento e imprima cualquiera de los caracteres con el mayor número de ocurrencias.

  1. Lea dos enteros entre 0 y 255 e imprima su suma.

  2. Lea un número entero entre 0 y 255 e imprima el cociente y el residuo de su división entre 7 .

  3. Lea un número entero entre 1 y 255 e imprima un valor verdadero si es un número compuesto (ni 1 ni primo) y un valor falso si no.

  4. Lea un número entero entre 1 y 255 e imprima un valor verdadero si es una potencia de 2 y un valor falso si no.

  5. Lea dos enteros entre 0 y 255 e imprima el más grande.

  6. Leer un entero decimal entre 0 y 255 imprime su representación hexadecimal.

  7. Lea un número entero entre 0 y 255 e imprima su peso de Hamming (número de 1 bits).

  8. Leer un solo número entero n entre 1 y 13 e imprimir el F n , el n ésimo número de Fibonacci .

    Por ejemplo, para la entrada 13, imprimir 233.

  1. Leer una línea / argumento de entrada y enmarcarlo.

    Por ejemplo, para la entrada Programming Puzzles & Code Golf, imprima esto:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Lea un bloque rectangular de caracteres y gírelo un cuarto de vuelta en el sentido de las agujas del reloj.

    Por ejemplo, para la entrada

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    imprime esto:

    This  text
    is  simply
    unreadable
    
  3. Leer un número entero entre 1 y 40 e imprima un diamante de esa longitud lateral.

    Por ejemplo, para la entrada 3, imprima esto:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Imprime esto:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

Tanteo

La respuesta que logra incorporar la mayor cantidad de programas en un solo archivo que cabe en un solo clúster de 512 bytes gana. Los empates se rompen por recuento de bytes (menor es mejor).

Reglas adicionales

  • Para cada tarea que reclame para su puntaje, el mismo archivo (byte por byte) debe constituir un programa completo, en el idioma que elija, que resuelva esta tarea en particular.

  • Cada tarea debe resolverse en un idioma diferente.

    Los idiomas cuentan como diferentes si no son versiones diferentes del mismo idioma. Por ejemplo, solo hay un JavaScript, un Python y un TI-BASIC, pero C, C ++, Octave y MATLAB son cuatro lenguajes diferentes.

  • El lenguaje seleccionado para cada tarea debe satisfacer nuestra definición habitual de lenguaje de programación .

    Además, el idioma debe haber sido publicado e implementado antes del 9 de septiembre de 2015.

  • Es posible que su compilador / intérprete no requiera ningún indicador no estándar para producir el comportamiento esperado.

    Las excepciones a esta regla incluyen los indicadores necesarios para especificar un idioma en particular, para leer el programa desde un archivo (único) o para suprimir un banner.

  • La entrada para cada tarea consistirá en caracteres ASCII imprimibles (0x20 a 0x7E) y avances de línea (0x0A), y no excederá los 255 bytes de longitud.

  • Todos los enteros se pueden leer en decimal o unario, a menos que se indique lo contrario en la tarea.

  • El comportamiento de la entrada no válida no está definido.

  • Puede leer la entrada de STDIN (o su alternativa más cercana) o como argumentos de línea de comandos.

    Si una tarea requiere leer dos entradas, puede leerlas, en cualquier orden, separadas por un delimitador de un byte de su elección, como argumentos de línea de comandos separados o uno de STDIN y el otro como argumento de línea de comandos.

    Si una de las piezas de entrada es una línea, el único delimitador posible es un salto de línea.

  • Imprima el resultado en STDOUT (o la alternativa más cercana). Toda la salida a STDERR será ignorada.

  • Para cada tarea, se aplican las reglas estándar de .

    En particular, esto incluye las lagunas que están prohibidas por defecto , con la excepción de la codificación de la salida , que está explícitamente permitida para este desafío.

Dennis
fuente
1
¿Son JavaScript y CoffeeScript lo suficientemente diferentes como para ser considerados diferentes idiomas?
Downgoat
Sí, esos cuentan como diferentes.
Dennis
17
su desafío # 4 no tiene sentido> :(
Pomo de la puerta
Cita: se ignorará toda la salida a STDERR. ¿Significa esto que cuando llamamos al script / programa con 2>/dev/nully obtenemos la salida correcta a stdout, está bien? Sólo para estar seguro.
Cabbie407
2
@ Cabbie407 Precisamente. Según el consenso sobre meta , esta regla en realidad se aplica por defecto a todos los desafíos. Solo quería asegurarme de que todos lo supieran.
Dennis

Respuestas:

17

12 idiomas, 418 bytes

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

Este es un desafío divertido. Se está haciendo difícil incluir más idiomas, pero con estos bytes restantes, probablemente podría hacer uno más.

Hace uso gratuito de lenguajes 2D. Tenga en cuenta que el carácter entre [ ]la @-[ ]e<línea es una pestaña. Además, esto requiere\n terminaciones de línea para que TRANSCRIPT funcione.

Preludio (Tarea 1 / Cat)

( 
      )?(!?)

?(!?)es solo una traducción directa de ,[.,]en BF. Los ()bucles Prelude actúan como []bucles BF , por lo que todo, desde la (columna situada más a la izquierda hasta )antes de que el programa principal no se ejecute.

Las reglas de sintaxis de Prelude significan que los paréntesis deben coincidir (lectura de columna de izquierda a derecha), y solo puede haber un paréntesis por columna. Aparte de eso, es un lenguaje bastante fácil de encajar.

Asegúrese de que NUMERIC_OUTPUTesté configurado en Falsesi está utilizando el intérprete de Python.

TRANSCRIPCIÓN (Tarea 2 / Hola mundo)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT es un esolang temático basado en ficción interactiva. Las líneas no reconocidas por TRANSCRIPT se ignoran, lo que facilita su adaptación.

Tr is here.declara una Trvariable de cadena y la segunda línea establece el contenido de la variable en Hello, World!. X Tr( Xpara examinar) luego genera la cadena.

Aunque TRANSCRIPT es muy fácil de encajar, es un lenguaje bastante detallado, por lo que hice que sea el desafío más fácil.

Fisión (Tarea 3 / Mensaje de cumpleaños)

R"Happy Birthday, "[?S"!"*
                   \!/

que imprime la primera parte, captura la entrada con un pequeño bucle 2D y luego muestra el signo de exclamación final. El Rsignifica que un átomo comienza aquí moviéndose hacia la derecha, lo cual es útil porque este programa se puede mover a cualquier lugar.

Carril (Tarea 4 / Pestañas)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Al igual que Fission, Rail es un lenguaje 2D que tiene la ventaja de poder moverse a cualquier lugar. La ejecución comienza desde $elmain función, en dirección sureste.

Primero nos dirigimos hacia abajo \, giramos a la izquierda en -, golpeando [<tab>]y empujando una pestaña. e<luego ramas basadas en EOF - si EOF, nos dirigimos hacia abajo e imprimimos "I hate spaces!"antes de detenernos, de lo contrario nos dirigimos hacia arriba. Si nos dirigimos hacia arriba, leemos el siguiente carácter y lo comparamos con la pestaña, una vez más bifurcando: si la pestaña, encabeza e imprime "I love tabs!"antes de detenerse, de lo contrario, dirígete hacia abajo y continúa el ciclo de entrada.

Este programa es bastante costoso, pero como TRANSCRIPT tomó Hello World, fue difícil elegir una tarea adecuada para Rail.

> <> (Tarea 6 / Entrada ascendente)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Imprime 1si es estrictamente ascendente,0 contrario.

> <> es otro lenguaje 2D, y la ejecución comienza desde la parte superior izquierda. "..."es el modo de cadena, empujando los caracteres internos uno a la vez. Después de la primera cadena que golpeamos #, que refleja la IP hacia la izquierda, empujando más cadenas y envolviendo (> <> es toroidal) antes de golpear \, un espejo que nos refleja hacia arriba.

En la parte inferior del programa está .91<, que nos teletransporta a (9, 1), donde está el programa central. Después de que esto 0[elimine toda la basura de las cadenas,0 empuja un cero para representar la última lectura de caracteres, y después de esto solo lee los caracteres uno por uno, asegurándose de que sigamos ascendiendo.

Probablemente sea mejor mover el programa central hacia abajo en lugar de teletransportarse, pero me ocuparé de eso más adelante si es necesario.

Befunge (Tarea 9 / Suma)

"1\"# &&+.@

Probado con el intérprete encontrado aquí . Este es un programa bastante sencillo, con el comienzo empujando una cadena inútil y #saltando sobre el espacio. Después de eso es solo el programa central &&+.@.

Laberinto (Tarea 10 / Divmod por 7)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Convenientemente, 'y "son NOPs en Labyrinth que actúan como un camino transitable en el laberinto. Me saltearé la navegación desordenada, pero básicamente hay muchas vueltas y vagabundeos antes de llegar al? , que es el comienzo del programa principal.

El programa no está completamente al ras para dar cuenta de Prelude (p. Ej. ? se lee la entrada en Prelude).

Python 2 (Tarea 14 / Hexadecimal)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

Los xxxs representan porciones irrelevantes comentadas por cadenas o comentarios multilínea. En el medio está print hex(input()), el programa central. Esto se muestra con un encabezado 0x, pero supongo que está bien (si no, entonces es una solución fácil de todos modos).

La primera línea es una cadena "1\"# &&+.@\""seguida de dos " "s. El analizador concatena estas tres cadenas y las deja sin usar (esta primera línea funciona de manera similar para Ruby y Julia más adelante).

GolfScript (Tarea 15 / Peso de Hamming)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

La primera línea empuja tres cadenas, y la segunda línea es un comentario. ''''empuja dos cadenas más, luego <<hace dos comparaciones ( sse ignora). Finalmente,""'("' empuja otras dos cuerdas.

Todo esto es basura y luego se elimina envolviéndolo en una matriz y obteniendo el primer elemento ( ]0=), que es la entrada inicialmente en la pila. Luego evaluamos la entrada con ~, la convertimos en binaria con y 2baseluego sumamos los bits con {+}*. El siguiente }no tiene comparación y supercomenta el resto del programa.

Julia (Tarea 16, Fibonacci)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=comienza un comentario multilínea y =#finaliza un comentario multilínea. El programa principal utiliza la exponenciación matricial para calcular los números de Fibonacci (tomados de Rosetta ).

Ruby (Tarea 17 / marco ASCII)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Este programa asume que la entrada no termina con una nueva línea final.

Tenemos una cadena inútil, un comentario, otra cadena inútil, luego un heredoc que comenta la mayor parte del programa. Después de eso es el programa central, seguido de un #comentario de una sola línea .

CJam (Tarea 19 / Diamante)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

Las dos cadenas de espacio al final de la primera línea son para satisfacer CJam, ya que #=son dos operadores binarios. No voy a entrar en demasiados detalles con este, pero básicamente es un desastre, con el programa central siendo el mero

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

entre.

El diferenciador clave entre GolfScript y CJam es que, en CJam, una comilla simple 'no comienza ni termina las cadenas, sino que empuja el siguiente carácter a la pila. Esto significa que en CJam

'("'

empuja un y (luego comienza una cadena con "(el primer carácter del cual es' ), mientras que lo anterior es solo una cadena simple en GolfScript.

Pruébalo en línea . 1>se usa en lugar de (dar cuenta de Prelude.


Aquí hay 12 idiomas, 373 bytes . Se han movido algunas tareas, se ha eliminado TRANSCRIPT (hacía que Rail fuera demasiado costoso) y se ha agregado Scheme (chicken). Este es solo mi campo de golf para futuras actualizaciones, ya que la actualización de la publicación principal lleva una eternidad.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Podría guardar algunos bytes para Julia ya que los comentarios de varias líneas sin terminar generan un error en STDERR.

Sp3000
fuente
Buena cosa. ¿Cuál es la tarea para TRANSCRIPT?
Cabbie407
@ Cabbie407 Todavía estoy tratando de optimizar qué idioma obtiene qué tarea, pero actualmente TRANSCRIPT ha tomado Hello World, y Rail ha cambiado a la tarea de pestañas.
Sp3000
Ah, ahora puedo ver que ;)estoy postergando cambiar cualquier cosa en mi respuesta, debido a la larga descripción. lol
Cabbie407
26

7 8 9 10 idiomas, 398 431 447 507 bytes

Esto es probablemente lo máximo que puedo encajar en la solución actual.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

La última línea contiene el código de espacio en blanco codificado para que SE no lo coma. Para ejecutar el código, reemplace todo Scon espacios, Tcon pestañas y Ncon nuevas líneas.

C89, tarea 16

Esto es lo que ve el compilador:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Todo lo demás se elimina como comentarios o dentro del #if 0.

C ++, tarea 14

Utilicé un truco robado de aquí para diferenciar entre C89 y C ++.

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Lua, tarea 2

Aquí está la estructura básica.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Brainfuck, tarea 1

Solo tenía que asegurarme de que no .,se encontraran bucles infinitos o extraviados . Los comentarios multilínea de Lua también funcionan como comentarios BF. Todo, aparte de los primeros 2 caracteres, es un gran bucle NOP.

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

Python, tarea 6

Nuevamente, estoy usando funciones específicas del idioma para NOP o comentar el otro código.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pyth, tarea 17

Pyth es bueno para esto. Toma el primero #como un while True:bucle que sale silenciosamente en caso de error . Entonces, simplemente hago que la mayoría del código sea una cadena (para evitar que ;finalice el bucle antes de tiempo), luego solo finalizo el bucle, salgo de otro creado por el comentario de Python y hago la tarea. Aquí está con todas las cadenas no vacías reemplazadas por " string ", todavía es funcionalmente equivalente:

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, tarea 3

Este es muy interesante. La ejecución rebota en el código, utilizando saltos cuando sea necesario para sortear obstáculos. Las partes relevantes:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Estrellado , tarea 9

Aquí tuve que comenzar a entrar en los idiomas "descartar todos los caracteres excepto". Cualquier otra cosa despojada, parece:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

El código omite la mayor parte de la puntuación con un salto para evitar un momento difícil, simplemente usando el inicio y el final del código. El código es funcionalmente equivalente a

      + +*,  + + +,*.*

Befunge-98, tarea 10

Funciona de manera similar al> <> uno. Afortunadamente, #es un espejo en> <> y un salto en Befunge, por lo que podemos implementar diferentes comportamientos. Además, 0/0 == 0.

#if      + 0+0/*^
                >&:7/.7%.@

Espacio en blanco , tarea 13

Esto fue lo último que encajé. Las primeras líneas solo están presionando ceros en la pila, ya que solo contienen espacios y líneas nuevas del código "normal". El código está codificado; reemplace todo Scon espacio, Tcon pestañas y Ncon líneas nuevas.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N
PurkkaKoodari
fuente
9

17 versiones diferentes de Pip, 383 bytes (inválido)

Si bien esta pregunta estaba en la zona de pruebas, revisé todas las revisiones de mi idioma Pip y se me ocurrió un políglota con 17 de ellas. Lamentablemente, las versiones del mismo idioma no están permitidas por las reglas de desafío ahora, pero con el permiso de Dennis y un descargo de responsabilidad, estoy publicando mi trabajo de todos modos.

El código en bruto

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

La estrategia

En Pip, las letras minúsculas son variables. Las letras mayúsculas son más complicadas: se dividen en series de dos caracteres como máximo, que pueden ser operadores o variables. Si un token en mayúscula no se define específicamente como una variable u operador, se supone que es una variable indefinida, que se evalúa como nula.

Entonces, para distinguir entre dos versiones de Pip, solo tengo que encontrar algún operador variable o alfabético que se haya agregado en el más nuevo de los dos. En el anterior, será nulo en su lugar. El código v:uIN[...]reúne una gran lista que contiene una de estas comprobaciones para cada versión que quiero probar, descubre cuántos nils hay en esa lista (la uvariable se inicializa explícitamente en nil) y almacena el número env (para "versión") .

Después de algunos otros cálculos, hay otra gran lista que calcula los resultados de 17 de las tareas del desafío y las utiliza vpara seleccionar una en función de la versión que sea.

Versiones y tareas

0.15.09.04

Diagnóstico: (oTM0,0i)(se corrigió un error con el operador Tri Mdonde recortar 0 caracteres de cada extremo de una cadena daría la cadena vacía; la indexación en una cadena vacía da cero)

Tarea 18: Iv<2W##YqlPBy(configuración: leer todas las líneas de stdin si ves menor que 2) seguido de ((J_M ZRVl)|0)Jn(invertir la lista de líneas, transponer y volver a unir en cadena)

0.15.08.06

Diagnóstico: EN1( ENoperador de umerate agregado )

Tarea 1: Iv<2W##YqlPBy(el mismo código de configuración que el anterior) seguido de l?lJnl(unirse en nuevas líneas)

0.15.08.03

Diagnóstico: 1N1(agregado Ncomo versión corta deIN operador)

Tarea 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(configuración: generar una lista que contenga las mitades superior e inferior del tablero de ajedrez y almacenarla c) seguido de cJn(unirse a la nueva línea)

0.15.08.01

Diagnóstico: Y1( Yoperador ank agregado )

Tarea 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(configuración: si ves 3, construir la mitad superior del diamante d) seguido de d.n.RVd(invertir para la mitad inferior y unirse en la nueva línea)

0.15.06.19

Diagnóstico: RCk( operador Randice hoice agregado C)

Tarea 17: m:'+.'-X#a+2.'+.n."| "(configuración: +----+\n| cadena de compilación m) seguida de m.a.RVm(entrada de entrada my reversa de m)

0.15.06.12

Diagnóstico: k( kvariable preinicializada a", " ; anteriormente no estaba definida y, por lo tanto, era nula)

Tarea 16: Iv=5La{i+:oSio}(si ves 5, generar el número de Fibonacci en i) seguido dei

0.15.06.08 (nota: el número de versión no se cambió hasta la siguiente confirmación)

Diagnóstico: w(preinicializadowvariable a`\s+` )

Tarea 15: h:$+TBa(convierta la entrada a dígitos binarios y de suma; guarde el resultado hpara la tarea 12 más adelante)

0.15.05.29

Diagnóstico: (hR`1.+0``&2o`)@>3@AB0

Esta versión se agregó &como un patrón de reemplazo para toda la cadena combinada en un reemplazo de expresiones regulares (inspirado en sed). El código anterior toma h( 100) y lo reemplaza con `&2o`(es decir, "1002o"en versiones más nuevas pero simplemente "&2o"en versiones anteriores). Luego corta todos los caracteres después del tercero ( "2o"en versiones más recientes,"" en versiones anteriores) e intenta indexar en esa cadena. La indexación en una cadena vacía da cero.

Tarea 7: j:ak:b(configuración: copia vars locales a, ba vars globales j, kpara que estén disponibles dentro de una función) seguido de ({j@aEQk}FI0,#a).s(filtrar los índices en los aque el carácter correspondiente es igual by unirse en el espacio)

0.15.05.26

Diagnóstico: `u`(tipo de patrón agregado; en versiones anteriores, los backticks se ignoran como caracteres no reconocidos y la expresión se evalúa como unula)

Tarea 14: aTB16(convertir To Base 16)

0.15.05.24

Diagnóstico: rZ4( rvariable especial creada que devuelve un valor aleatorio entre 0 y 1 cada vez que se hace referencia; anteriormente no estaba definida y, por lo tanto, la expresión se evaluó como nula)

Tarea 13: a>b?ab(expresión ternaria)

0.15.05.12

Diagnóstico: rZ4(agregadoZ operador de ip )

Tarea 12: h=1(la suma de bits de la tarea 15 debe ser igual a 1)

0.15.05.11

Diagnóstico: AB6( ABoperador de valor agregado de soluto)

Tarea 11: Pv=11?a>1&0INa%(2,a)[...]@v(si ves 11, salida 1si la entrada es mayor que 1 y un número menor lo divide exactamente 0; de lo contrario; si vhay algo más, úselo vcomo índice de la lista para decidir qué salida)

0.15.05.02

Diagnóstico: ({a}V7)( Voperador agregado ; cuando Vno estaba definido, esto envió argumentos nulo y 7 a una función {a}que devuelve su primer argumento)

Tarea 10: a//7.s.a%7(entrada int-dividida por 7 y mod 7, separada por espacios)

0.15.04.26

Diagnóstico: BN8(se agregó el operador de Begation N)

Tarea 9: a+b

0.15.04.23

Diagnóstico: AZ( AZvariable preinicializada al alfabeto en mayúscula)

Tarea 5: bINa( INda cuenta de ocurrencias)

0.15.04.20

Diagnóstico: m@0:0seguido de9@m

La mvariable se preinicializa a 1000. En esta confirmación, el @operador se arregló para devolver valores; anteriormente, asignando a m@0dio una advertencia y no hizo nada. Por lo tanto, después de la corrección de errores, la primera instrucción se establece men 0000, que es un índice legal para 9; pre-corrección de errores, se mqueda1000 , que no es un índice legal. (Los índices aún no eran cíclicos).

Tarea 3: "Happy Birthday, ".a.'!

0.15.04.18

Todos los diagnósticos anteriores hacen que se agregue un valor nulo a la lista de diagnóstico.

Tarea 2: "Hello, World!"


La mayoría del otro código son ajustes que tuve que hacer para evitar errores en varias versiones. Esta publicación ya es demasiado larga, así que si quieres saber algo que no te he explicado, pasemos a la sala de chat de idiomas esotéricos .

DLosc
fuente
4

6 idiomas, 226 bytes (¡229 según cómo \x1bse acepte!)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Por lo tanto, no creo que haya hecho la mejor elección de idiomas e imagino que esto no es particularmente competitivo, ¡pero de todos modos me pareció un desafío interesante! En general, no se completan muchos desafíos, pero probablemente podría calzar un desafío en espacios en blanco o algo similar, pero esto es lo que tengo hasta ahora:


1. Brainfuck

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

Probado en http://copy.sh/brainfuck/ y http://brainfuck.tk/ .

Después de eliminar todos los caracteres ignorados, el programa anterior es todo lo que nos queda, que es solo el programa cat de ejemplo con algunos bucles vacíos adicionales para omitir el uso de los símbolos en otros idiomas.

2. Ruby

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Uso:

ruby cluster

Lo anterior es el código después de eliminar todos los comentarios. La primera línea es totalmente inútil en Ruby como lo definimos algunas expresiones regulares para contener el código Befunge-93 y brainfuck, entonces se crea una matriz para contener Helloy Worlde imprimirlo usando printf(para añadir la ,y! ).

3. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Uso:

perl cluster <name>

Muy similar a Ruby, excepto que ya que estamos almacenando una referencia de matriz $a, cuando intentamos acceder $a[0]está vacía, por lo que podemos reemplazarla con el texto del desafío 3 Happy Birthdayy pop(que muestra el último argumento para el programa de línea de comandos )

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Uso: pegar en la consola del navegador y ejecutar.

Al igual que Ruby y Perl, la primera línea esencialmente crea RegExpobjetos inútiles , luego almacenamos una matriz inútil $ae instanciamos dos cadenas inútiles, una que contiene el código Ruby / Perl y otra que contiene una nueva línea y a #, luego prompt()ingresamos yalert() el resultado esperado por la mayoría de los humanos para el desafío 4. Terminamos con otro RegExpobjeto inútil para cerrar el circuito de brainfuck.

9. Befunge-93

/&&#[+.#]@

Probado en http://www.quirkster.com/iano/js/befunge.html .

Según tengo entendido, /divide la pila y empuja el resultado que no tiene efectos nocivos, excepto presionar NaNen el sitio anterior, &solicita la entrada de un número entero para que leamos los dos números requeridos por el desafío 9 en la pila, lo que #garantiza que omitimos el [que está ahí para brainfuck, +luego agrega los dos números superiores en la pila, los .genera, #]para brainfuck nuevamente y @sale.

13. PHP (ejecutándose en Bash)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Uso:

php cluster <x> <y>

En PHP, todo lo que no está incluido dentro de las <?etiquetas se genera literalmente, por lo que genera el código Befunge-93 y brainfuck, por lo que die()inmediatamente en el código, mostramos una pantalla clara ( \x1bc) y luego los max()dos primeros argumentos.

Dom Hastings
fuente
Puede poner el carácter literal ESCape en el literal de cadena, solo agregue una nota de que está allí ( the first character in the first string literal is the byte ASCII 27); su puntaje es 226.
gato
@cat Sí, creo que tienes razón, me he ido como está por ahora, pero puse 226 en el título. He olvidado lo mucho que disfruté este desafío, probablemente podría hacer un poco más ahora y usar ES6 podría .match'\x09'(donde están los 'son') ¡tal vez veré si puedo agregar más en algún momento!
Dom Hastings
4

6 idiomas, 450 404 bytes

bash, brainfuck, C, gawk4, JavaScript y Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Actualización: Golfed hacia abajo un poco. Todavía no estoy seguro de qué más agregar, y no estoy seguro de cómo pensarían los miembros competidores acerca de mí usando sus idiomas para diferentes tareas. Tratando de explicar el algoritmo brainfuck.

Bueno, esta es / fue mi primera experiencia políglota, así que tuve que aprender todo desde cero. Comenzar con awk no fue la idea más inteligente, creo, porque es relativamente implacable. Debido a que el número de tareas completadas es relevante, comencé con las tareas más fáciles primero. No estoy seguro si fue un movimiento inteligente. Esto no es mucho golf, porque tuve suficientes problemas para lograr que estos seis funcionen juntos, pero hice lo que pude para mantenerlo corto.

Aquí están los idiomas y lo que hacen en orden alfabético. Mostraré una manera fácil de probarlos todos más abajo. Debido a que algo de esto podría ser específico de la versión, le daré los números de versión de las herramientas que utilicé.

bash, tarea 3

Bueno, es obvio que usé sed. Traté de poner una secuencia de comandos sed en esto de alguna manera, pero no pude hacerlo funcionar, así que seguí la ruta bash. La forma en que lo hice, está dentro de un comentario en C y awk lo evalúa False.

sed --version da sed (GNU sed) 4.2.2

bash --version da GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Entonces la parte sed se reduce a

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Agrupa la entrada, la pega en una nueva cadena e imprime el resultado. Cosas bastante comunes.

brainfuck, tarea 20

Bueno, esto siempre es bastante fácil de ocultar, supongo. #//C y awk ignoran una línea que comienza con . O al menos pueden vivir con la basura detrás de eso.

bf da bf - a Brainfuck interpreter version 20041219

Este es el código condensado. La primera línea es solo la basura de los otros idiomas.

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

Trataré de explicar cómo funciona

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

esto organiza la cinta y el puntero a este

0 8 10 46 64 C2 C1
  ^

la celda que contiene 8 es el contador global para el siguiente ciclo
, es el número de veces que se imprimen 3 mismas líneas

[>>>>>+++

se establece C1en 3, el número de líneas iguales

    [<++++

se establece C2en 4, el número de " ....@@@@" en una línea (al principio)

        [<<....>....>-]<<<.>>>
    >-]

imprime una línea completa decrementando C2en el proceso
cuando C2es cero, imprime una nueva línea y disminuye C1.

si C1es cero la magia sucede

    <<<[>>+<<-]
    <[[>+<-]<]

el 46 se mueve detrás del 64
el 10 y el contador global se mueve uno a la derecha

>>-]

entonces se disminuye el contador global
si es cero, el programa sale

C, tarea 2

Agoto hasta la última pequeña habilidad de C aquí imprimiendo "¡Hola, mundo!". Bueno, alguien tenía que hacer el trabajo ...

gcc --version da gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

El código C real

#define func
func main(){puts("Hello, World!");}
#

El #define funcobjetivo es hacer bien a Awk con esto. Piensa que esta es una función awk. La abreviatura de func es una característica gawk.

gawk4, tarea 18

Como he usado awk para casi todo aquí, decidí que tenía que estar en esto.

awk --version da GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

awk ve esto

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

Los patrones de búsqueda incluyen \tevaluar a false. Elegí la pestaña aquí, porque creo que no puede estar en la entrada. sedevalúa a false. "the string"&&0se evalúa como falso La función está bien. El programa se ejecuta si coincide un patrón vacío, que es para cualquier entrada.

Hace esto

Entrada

elaic
parli
Ucfit
srigs

Salida

supe
rcal
ifra
gili
stic

Debe asegurarse de que todas las líneas de entrada tengan la misma longitud. Use espacios para llenarlos.

JavaScript, tarea 9

No estoy seguro de si esto es legítimo, porque fue demasiado fácil. Si le da al archivo del programa un final html y lo abre en un navegador (utilicé Firefox 40.0.3 y Chrome 45.0.2454.85), le pedirá una entrada. Debe ingresar dos números separados por espacio, y alertará la suma de esos.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Minimal-2D , tarea 1

Esto fue bastante fácil de encajar en las líneas de comentarios. Usé el intérprete , que se ejecuta en python, para probar esto. Imprime la entrada a la salida. El programa se ve así

R,+/D
UL.-L

RUDL son derecha, arriba, abajo e izquierda. Entonces comienza a ir bien, lee un carácter de stdin en la memoria y agrega uno. La barra oblicua omite el siguiente comando si la memoria tiene el valor 0. Esto es para finalizar esto. Si se lee un carácter con valor -1, la entrada ha finalizado. Entonces, si se lee -1, se salta la D y termina. Si se lee algo más, baja a la izquierda, agrega ese 1 de nuevo a la memoria e imprime el carácter en stdout. Luego va a la izquierda y arriba y comienza de nuevo.

Pruebas

Descargo de responsabilidad: no asumiré ninguna responsabilidad por los daños que pueda hacer a su sistema con esto.

Esto supone que tiene bash & co, gawk (al menos la versión 4, porque usa matrices multidimensionales), gcc, python, bf como un intérprete de brainfuck y Firefox instalado.

Para hacerlo más fácil, copie la fuente del programa en un archivo llamado cluster.html. Haga que el archivo sea ejecutable para la tarea bash. Copie y pegue el intérprete para Minimal-2d en un archivo nombrado minimal2D.pyen el mismo directorio. Luego copie y pegue el siguiente script en un archivo de script y colóquelo en el mismo directorio, hágalo ejecutable y ejecútelo ... bueno, ¿con quién estoy hablando? Si lees esto, probablemente no necesites tanta explicación y de todos modos lograrás que se ejecute de alguna manera.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Allí también encontrará el comando para ejecutar las pruebas individualmente.

¡Que te diviertas!

Cabbie407
fuente
El loco tiene un problema; el código tiene corchetes desequilibrados y no se ejecutará correctamente (debe ejecutar todo el archivo, no solo la parte relevante). Además, los cuadrados del tablero de ajedrez son en realidad 4x3 en lugar de 4x4 para parecer más cuadrados en el texto.
PurkkaKoodari
Gracias por la pista. Bueno, funciona bien aquí. Siempre ejecuto todo el archivo como puedes ver en mi script. No estoy seguro si el intérprete debe verificar los corchetes antes de ejecutar. A la mía no le importa. Pero pasé por alto ese recuento de líneas. Tengo que cambiar eso.
Cabbie407
Bueno, lo examiné nuevamente y espero haberlo arreglado.
Cabbie407