El idioma inglés y la mayoría de los lenguajes de programación se escriben y leen de izquierda a derecha, de arriba a abajo, pero ese no es necesariamente el caso .
De hecho para el bloque de texto
ABC
DEF
Puedo pensar en ocho formas relacionadas en que podría leerse:
- De izquierda a derecha, de arriba a abajo (LTR-TTB):
ABCDEF
- De arriba a abajo, de izquierda a derecha (TTB-LTR):
ADBECF
- De izquierda a derecha, de abajo hacia arriba (LTR-BTT):
DEFABC
- De abajo hacia arriba, de izquierda a derecha (BTT-LTR):
DAEBFC
- De derecha a izquierda, de arriba a abajo (RTL-TTB):
CBAFED
- De arriba a abajo, de derecha a izquierda (TTB-RTL):
CFBEAD
- De derecha a izquierda, de abajo hacia arriba (RTL-BTT):
FEDCBA
- De abajo hacia arriba, de derecha a izquierda (BTT-RTL):
FCEBDA
Reto
Escriba un bloque rectangular de texto que se pueda leer en cada una de las ocho formas anteriores como ocho programas de una sola línea en el idioma que elija. Cada uno de estos programas debe generar un número entero diferente de uno a ocho.
No importa en qué dirección de lectura salga qué número, no tienen que coincidir con los números anteriores. Por ejemplo, si su bloque de texto todavía
ABC
DEF
entonces el programa de ABCDEF
salida de fuerza 5
y FEDCBA
de salida de fuerza 2
, y los otros seis programas emitiría 1
, 3
, 4
, 6
, 7
, y 8
en algún orden.
El bloque de texto puede contener cualquier carácter, excepto los terminadores de línea .
La salida debería ir a stdout o una alternativa similar si su idioma no tiene una stdout adecuada. No hay entrada Puede suponer que los programas se ejecutan en un entorno REPL.
Pietu1998 escribió caritativamente un JSFiddle que le da a los 8 programas diferentes de una sola línea cuando se le da un bloque de texto. Lo he convertido en un fragmento de pila:
<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+" "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/> <label for="b">Show directions</label><br/><pre id="a"></pre>
Todavía puedes encontrar la versión de Martin CJam aquí .
Tanteo
Su puntaje es el área de su bloque de texto (el ancho multiplicado por el alto). La presentación con la puntuación más baja gana. (Esencialmente, el código más pequeño gana, de ahí la etiqueta de código de golf ). Tiebreaker va al envío publicado anteriormente.
El ejemplo es 2 por 3, por lo que su puntaje es 6. Un puntaje menor a 4 (2 por 2) es imposible porque algunos de los 8 programas serían idénticos y no podrían generar dos valores diferentes.
fuente
String.prototype.repeat()
que todavía es un poco nuevo. También confirmado para trabajar en IE ahora. nuevo violínRespuestas:
J, 3 * 3 = 9
Ejecutando todas las direcciones:
Explicación:
[
(left
) toma el lado izquierdo de sus dos operandos, por lo que esencialmente cancela todo el lado derecho de nuestra expresión, por ejemplo, se1+2[2+2+2
convierte en1+2[6
y luego1+2
.n
expresiones de cada operación y una con el número1
y una con solo2
s. Las adiciones con1
generan los números impares y los otros generan los pares.fuente
[
con;
y debería funcionar en el entorno REPL de la mayoría de los idiomas.Befunge-98 ,
5x5 = 255x3 = 15Escribí un pequeño guión que encontró los números correctos para mí. Me tomó un tiempo, pero bueno, ¡acabo de vencer a GolfScript! :RE
Los scripts que utilicé están aquí y aquí , pero no sugiero mirarlos ya que el estilo del código es extremadamente cancerígeno.
Subprogramas
Versión antigua
Subprogramas
Salida de los números 1-8 respectivamente.
fuente
Brainfuck $ , 4x3 = 12
Brainfuck $ es muy similar a Brainfuck , pero tiene algunos comandos más, incluido un comando para generar el valor actual de la celda como salida numérica, lo cual fue muy útil para este desafío.
Comandos de una línea:
fuente
TECO, 3 * 5 = 15
=
imprime el valor de la última expresión numérica.\
se usa para leer o escribir números de cadenas, pero lo uso solo como un descarte aquí.+4 5+2=4 +1 \
7 7+ +2+4=1 4 5 \
6 6+ +2+1=4 4 \ 5
3+1 \+2=4 +4 5
2\ 1+ 4=2+5 4+
5 5\ 5 4 1=4+2+ +
15 \ 4 4=1+2+ +
4 45 4+ 4=2+\ 1+
8fuente
piet - 12x12 = 144
Dado que un programa de una línea nunca puede terminar, suponga que termina después de la primera salida.
8 subprogramas en una sola imagen:
fuente
GolfScript, 4x4 = 16
Hace uso del buen viejo "super comentario": un incomparable
}
ignora el resto del código (de hecho, en este caso un comentario normal#
habría funcionado igual de bien, ya que todo el código se ejecuta como una sola línea). Entonces, en cada esquina hay un solo número o (en la otra dirección) ese número se incrementa en 1, porque la ejecución termina y se imprime el contenido de la pila. Los 8 programas sonfuente
Haskell, 26x26 = 676
Utiliza comentarios (
--
) para ocultar los bits hacia atrás y hacia los lados. Esto lo hace terriblemente largofuente
Preludio , 5x3 = 15
Esto supone el intérprete de Python , que imprime los valores como números en lugar de códigos de caracteres.
Esto no supera a Befunge $, pero supera mi presentación de GolfScript, y me gusta su simplicidad. Tenga en cuenta también que utiliza solo 9 caracteres
queno son espacios, loque es menos que cualquier otro envío hasta el momento(J golpea de nuevo :)). En Prelude, cada dígito se inserta en la pila individualmente, y dependiendo de la ruta, hay un dígito diferente justo antes del!
, que solo imprime el elemento superior de la pila. Los 8 programas son:Alternativamente, también hay
Lo que empuja los números impares en las rutas verticales, y los incrementa
1
en las rutas horizontales:fuente
CJam - 7 × 7
No es impresionante, pero no hubo respuesta de CJam y me gusta cómo se ve :)
Utiliza principalmente el hecho de que
];
borra la pila.Pruébalo en línea
fuente
Rubí - 7x7
Tampoco es impresionante, la misma táctica que la respuesta de Haskell.
fuente
R, 9x9
Sin espacios en blanco, sin comentarios.
Supongo que esto podría ampliarse al tamaño que desee. Pensé que el operador de módulo era el más flexible de los operadores disponibles, ya que evita que los valores sean demasiado grandes, independientemente del tamaño de los datos, y no tiene ningún efecto tener números realmente grandes en el medio.
fuente
Este lenguaje de programación, 5 * 9 = 45
Lo que se traduce en esto:
Como
;
termina el programa, lo anterior se traduce en esto:Explicación: cualquier número desde
0
hasta9
empuja el dígito correspondiente a la pila.+
saca los dos valores superioresx
yy
sale de la pila y empujax + y
a la pila.i
saca la pila como un entero.fuente