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.
String.prototype.repeat()
que todavía es un poco nuevo. También confirmado para trabajar en IE ahora. nuevo violín