En el Tetris tradicional , hay 7 ladrillos de tetromino distintos , cada uno denotado por una letra similar a su forma.
#
# # #
# ## # # ### ## ##
# ## ## ## # ## ##
I O L J T Z S
Considere las disposiciones de estos ladrillos que pueden formar un rectángulo W × H sólido, para algunos enteros positivos W y H. Por ejemplo, usando 2 I's, 1 L, 1 J, 2 T's y 1 S, un rectángulo 7 × 4 puede hacerse:
IIIITTT
LIIIITJ
LTTTSSJ
LLTSSJJ
Se pueden reorganizar los mismos ladrillos (moviéndolos y rotándolos pero sin voltearlos ) en un patrón diferente de 7 × 4
IJJTLLI
IJTTTLI
IJSSTLI
ISSTTTI
Ahora considere usar un bloque rectangular de código en lugar de la primera disposición. Por ejemplo, este 7 × 4 bit de Python 3, que se imprime Tetris
en stdout:
p=print
x='Tet'
y='ris'
p(x+y)#
Según el primer acuerdo de Tetris, sus 7 "ladrillos" son ...
x '
int y ' ='r is
p=pr t p( ='Te )# x +y
En el otro arreglo (uno de los muchos posibles) son ininteligibles como código:
r#)x(x=
p'r'=y'
='istpT
p+ytnie
Pero, dados los ladrillos por separado, podría ser posible reconstruirlos correctamente. Esta es la base del desafío.
Reto
Este es un desafío de policías y ladrones . Hay dos roles en competencia, los Jumblers y los Rebuilders .
Los Jumblers envían respuestas con bloques de código que se han desglosado en bloques de Tetris.
Los reconstructores intentan reconstruir estos bloques en la pregunta separada dedicada a ellos: Jumblers vs Rebuilders: Coding with Tetris Bricks - Area for Rebuilder Answers .
Jumblers
Usando solo ASCII imprimible (códigos hexadecimales 20 a 7E) escriba un programa rectangular W × H. Cuando se ejecuta, debe generar la única palabra Tetris
para stdout (o la alternativa más cercana). No publique este código en su respuesta; no le des W ni H tampoco. Divídalo en una disposición de ladrillos de Tetris como el ejemplo anterior y publíquelos en su respuesta. (Su código puede contener espacios, pero como son difíciles de distinguir, es mejor usar algún otro carácter en lugar de espacios y decirle a la gente lo que usó).
Cuanto más difícil sea reconstruir su programa, mejor. Puede haber muchas formas de reorganizar sus ladrillos de código en un rectángulo, posiblemente con diferentes dimensiones. Lo que hace el código cuando se ejecuta en estos arreglos diferentes no importa siempre que al menos un arreglo se imprima Tetris
en stdout.
La única otra restricción es que W * H sea inferior a 1025.
Los Jumblers deben especificar su lenguaje de programación (y versión).
Reconstructores
Su objetivo es tomar los ladrillos de código de un Jumbler y volver a ponerlos en su orden original, por lo que Tetris
se imprime cuando se ejecuta el código. Si el arreglo de trabajo que encuentra no es el que el Jumbler tenía en mente, es demasiado malo para ellos.
Recuerde que solo se permite la traslación y la rotación en reordenamientos, no en espejo.
Tanteo
Cada vez que se reconstruye un envío, se considera "agrietado" y ya no está en ejecución. El primer Reconstructor en reconstruir un envío obtiene el crédito por ello. Si una respuesta no se descifra durante 72 horas, el Jumbler debe revelar la solución y, en adelante, será inmune a ser descifrado. Un Jumbler debe hacer esto para ganar, ya que de lo contrario no estará claro si incluso hubo una solución.
El Jumbler ganador es la respuesta no descifrada con el área más pequeña (W * H = 4 * número de ladrillos). En caso de empate, gana la respuesta más votada. La respuesta aceptada para esta pregunta será el Jumbler ganador.
El reconstructor ganador es el usuario que descifra la mayor cantidad de envíos. En caso de empate, va a quien haya roto el área más acumulativa.
Notas
- No puede reconstruir sus propios envíos. (Pero de lo contrario, puede asumir ambos roles).
- Los reconstructores no pueden intentar descifrar la misma respuesta más de una vez.
Marcador
Ordenado de la presentación más antigua a la más reciente.
+--------------+-------------+------------------+---------+----------+----------------+-------------------------------------------+-------------------------------------------+
| Jumbler | Language | Area | Immune? | Rebuilt? | Rebuilder | Link | Solution Link |
+--------------+-------------+------------------+---------+----------+----------------+-------------------------------------------+-------------------------------------------+
| xnor | Python 3 | 212 | no | yes | foobar | https://codegolf.stackexchange.com/a/40142 | https://codegolf.stackexchange.com/a/40203 |
| xnor | Python 3 | 340 | no | yes | feersum | https://codegolf.stackexchange.com/a/40146 | https://codegolf.stackexchange.com/a/40189 |
| es1024 | C | 80 | no | yes | user23013 | https://codegolf.stackexchange.com/a/40155 | https://codegolf.stackexchange.com/a/40210 |
| Ethiraric | Brainfuck | 108 | yes | | | https://codegolf.stackexchange.com/a/40156 | |
| Qwertiy | JavaScript | 420 | yes | | | https://codegolf.stackexchange.com/a/40161 | |
| user23013 | Befunge | 360 | yes | | | https://codegolf.stackexchange.com/a/40163 | |
| user23013 | CJam | 80 | yes | | | https://codegolf.stackexchange.com/a/40171 | |
| Geobits | Java | 360 | yes | | | https://codegolf.stackexchange.com/a/40180 | |
| Dennis | CJam | 60 | yes | | | https://codegolf.stackexchange.com/a/40184 | |
| xnor | Python 3 | 160 | yes | | | https://codegolf.stackexchange.com/a/40192 | |
| COTO | C | 72 | yes | | | https://codegolf.stackexchange.com/a/40198 | |
| es1024 | C | 780 | yes | | | https://codegolf.stackexchange.com/a/40202 | |
| Gerli | Mathematica | 72 | no | yes | Martin Büttner | https://codegolf.stackexchange.com/a/40230 | https://codegolf.stackexchange.com/a/40242 |
| Hydrothermal | JavaScript | 80 | yes | | | https://codegolf.stackexchange.com/a/40235 | |
| Sam Yonnou | GolfScript | 48 (frontrunner) | yes | | | https://codegolf.stackexchange.com/a/40239 | |
| feersum | Matlab | 48 | | | | https://codegolf.stackexchange.com/a/40310 | |
| Beta Decay | Python 3 | 484 | | | | https://codegolf.stackexchange.com/a/40312 | |
| potato | Python 3 | 176 | | | | https://codegolf.stackexchange.com/a/40341 | |
+--------------+-------------+------------------+---------+----------+----------------+-------------------------------------------+-------------------------------------------+
(Gracias a http://www.sensefulsolutions.com/2010/10/format-text-as-table.html por el formato de la tabla).
El usuario COTO hizo una excelente herramienta para jugar con ladrillos de código. Lo he convertido en un fragmento conveniente:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>function parseSpec(s){function first(){var e,t;t=S.findIndex(function(t){return(e=t.findIndex(function(e){return/\S/.test(e)}))!=-1});return t==-1?null:[e,t]}function at(e){var t=e[0],n=e[1];return n>=0&&n<S.length&&t>=0&&t<S[n].length?S[n][t]:" "}function wipe(e){var t=e[0],n=e[1];if(n>=0&&n<S.length&&t>=0&&t<S[n].length)S[n][t]=" "}var P,S=s.split("\n").map(function(e){return e.split("")});var oPats=$(".proto-tet [pat]").get().map(function(e){return{sPat:eval("["+$(e).attr("pat")+"]"),e:e,block:function(e){return[at(e)].concat(this.sPat.map(function(t){return at([e[0]+t[0],e[1]+t[1]])}))},wipe:function(e){this.sPat.forEach(function(e){return wipe([P[0]+e[0],P[1]+e[1]])})},match:function(e){return!/\s/.test(this.block(e).join(""))}}});window.oPats=oPats;while(P=first()){var oPat=oPats.find(function(e){return e.match(P)});if(!oPat){orphan(at(P));wipe(P);continue}createPiece(oPat.e,oPat.block(P));wipe(P);oPat.wipe(P)}}function createPiece(e,t){function r(e){var t=$(this).position();G.isIgnoreClick=false;G.eDrag=this;G.iOffsets=[e.clientX-t.left,e.clientY-t.top]}function i(){if(G.isIgnoreClick)return;var e=$(this);s($(".proto-tet ."+e.attr("rr")),function(e,t){return n[t-1]},e.css("left"),e.css("top"));e.remove()}function s(e,t,n,s){e.clone().html(e.html().replace(/@(\d)(\d)/g,t)).appendTo("body").on("mousedown",r).click(i).css({left:n,top:s})}var n=[];s($(e),function(e,r,i){return n[r-1]=t[i-1]},18+G.iSpawn%8*18*4+"px",18+~~(G.iSpawn/8)*18*4+"px");G.iSpawn++}function init(){$(document).on("mouseup",function(){return G.eDrag=null}).on("mousemove",function(e){if(G.eDrag){var t=$(G.eDrag),n=Math.round((e.clientX-G.iOffsets[0])/18)*18,r=Math.round((e.clientY-G.iOffsets[1])/18)*18,i=t.position();if(n!=i.left||r!=i.top)G.isIgnoreClick=true;t.css({left:n+"px",top:r+"px"})}})}function orphan(e){error("Spec character not a part of any block: '"+e+"'")}function error(e){$(".error").css("display","block").append("<div>"+e+"</div>")}function go(){$(init);$(function(){parseSpec($("#spec").val())});$("#spec").remove();$("#info").remove();$("#go").remove()}var G={eDrag:null,isIgnoreClick:true,iSpawn:0};Array.prototype.findIndex=function(e){for(var t=0;t<this.length;t++){if(e(this[t]))return t}return-1};Array.prototype.find=function(e){var t=this.findIndex(e);if(t==-1)return;else return this[t]}</script><style>.proto-tet, .spec{display: none;}.tet-I{color: darkgreen;}.tet-J{color: orangered;}.tet-L{color: navy;}.tet-T{color: darkred;}.tet-O{color: darkcyan;}.tet-S{color: darkviolet;}.tet-Z{color: darkorange;}body > .tet{position: absolute;cursor: move;-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;border-collapse: collapse;}.tet td{width: 18px;height: 18px;font: bold 14px "Courier New",monospace;text-align: center;vertical-align: middle;padding: 0;}.error{z-index: 1024;position: absolute;display: none;color: red;font-weight: bold;background-color: white;}textarea{font-family: "Courier New", Courier, monospace;}</style><div id='info'>Put code-bricks here and hit OK. Re-run the snippet to restart.<br>(You may need to replace spaces in code-bricks with some other character first.)</div><textarea id='spec' rows='16' cols='80'>ABCD a b Oo c oo d E h F efg hg GFE GH f H e I IJK J l L LK kji kl j i t OP p QR rs MN on ST q m W z XY zxw yx Y Z y w WXZ</textarea><br><button id='go' type='button' onclick='go()'>OK</button><div class="proto-tet"><table class="tet tet-I tet-I0" rr="tet-I1" pat="[1,0],[2,0],[3,0]"><tr><td>@11</td><td>@22</td><td>@33</td><td>@44</td></tr></table><table class="tet tet-I tet-I1" rr="tet-I2" pat="[0,1],[0,2],[0,3]"><tr><td>@11</td></tr><tr><td>@22</td></tr><tr><td>@33</td></tr><tr><td>@44</td></tr></table><table class="tet tet-I tet-I2" rr="tet-I3" ><tr><td>@40</td><td>@30</td><td>@20</td><td>@10</td></tr></table><table class="tet tet-I tet-I3" rr="tet-I0"><tr><td>@40</td></tr><tr><td>@30</td></tr><tr><td>@20</td></tr><tr><td>@10</td></tr></table><table class="tet tet-J tet-J0" rr="tet-J1" pat="[0,1],[-1,2],[0,2]"><tr><td></td><td>@11</td></tr><tr><td></td><td>@22</td></tr><tr><td>@33</td><td>@44</td></tr></table><table class="tet tet-J tet-J1" rr="tet-J2" pat="[0,1],[1,1],[2,1]"><tr><td>@31</td><td></td><td></td></tr><tr><td>@42</td><td>@23</td><td>@14</td></tr></table><table class="tet tet-J tet-J2" rr="tet-J3" pat="[1,0],[0,1],[0,2]"><tr><td>@41</td><td>@32</td></tr><tr><td>@23</td><td></td></tr><tr><td>@14</td><td></td></tr></table><table class="tet tet-J tet-J3" rr="tet-J0" pat="[1,0],[2,0],[2,1]"><tr><td>@11</td><td>@22</td><td>@43</td></tr><tr><td></td><td></td><td>@34</td></tr></table><table class="tet tet-O tet-O0" rr="tet-O1" pat="[1,0],[0,1],[1,1]"><tr><td>@11</td><td>@22</td></tr><tr><td>@33</td><td>@44</td></tr></table><table class="tet tet-O tet-O1" rr="tet-O2"><tr><td>@30</td><td>@10</td></tr><tr><td>@40</td><td>@20</td></tr></table><table class="tet tet-O tet-O2" rr="tet-O3"><tr><td>@40</td><td>@30</td></tr><tr><td>@20</td><td>@10</td></tr></table><table class="tet tet-O tet-O3" rr="tet-O0"><tr><td>@20</td><td>@40</td></tr><tr><td>@10</td><td>@30</td></tr></table><table class="tet tet-L tet-L0" rr="tet-L1" pat="[0,1],[0,2],[1,2]"><tr><td>@11</td><td></td></tr><tr><td>@22</td><td></td></tr><tr><td>@33</td><td>@44</td></tr></table><table class="tet tet-L tet-L1" rr="tet-L2" pat="[1,0],[2,0],[0,1]"><tr><td>@31</td><td>@22</td><td>@13</td></tr><tr><td>@44</td><td></td><td></td></tr></table><table class="tet tet-L tet-L2" rr="tet-L3" pat="[1,0],[1,1],[1,2]"><tr><td>@41</td><td>@32</td></tr><tr><td></td><td>@23</td></tr><tr><td></td><td>@14</td></tr></table><table class="tet tet-L tet-L3" rr="tet-L0" pat="[-2,1],[-1,1],[0,1]"><tr><td></td><td></td><td>@41</td></tr><tr><td>@12</td><td>@23</td><td>@34</td></tr></table><table class="tet tet-S tet-S0" rr="tet-S1" pat="[1,0],[-1,1],[0,1]"><tr><td></td><td>@21</td><td>@12</td></tr><tr><td>@43</td><td>@34</td><td></td></tr></table><table class="tet tet-S tet-S1" rr="tet-S2" pat="[0,1],[1,1],[1,2]"><tr><td>@41</td><td></td></tr><tr><td>@32</td><td>@23</td></tr><tr><td></td><td>@14</td></tr></table><table class="tet tet-S tet-S2" rr="tet-S3"><tr><td></td><td>@30</td><td>@40</td></tr><tr><td>@10</td><td>@20</td><td></td></tr></table><table class="tet tet-S tet-S3" rr="tet-S0"><tr><td>@10</td><td></td></tr><tr><td>@20</td><td>@30</td></tr><tr><td></td><td>@40</td></tr></table><table class="tet tet-Z tet-Z0" rr="tet-Z1" pat="[1,0],[1,1],[2,1]"><tr><td>@11</td><td>@22</td><td></td></tr><tr><td></td><td>@33</td><td>@44</td></tr></table><table class="tet tet-Z tet-Z1" rr="tet-Z2" pat="[-1,1],[0,1],[-1,2]"><tr><td></td><td>@11</td></tr><tr><td>@32</td><td>@23</td></tr><tr><td>@44</td><td></td></tr></table><table class="tet tet-Z tet-Z2" rr="tet-Z3"><tr><td>@40</td><td>@30</td><td></td></tr><tr><td></td><td>@20</td><td>@10</td></tr></table><table class="tet tet-Z tet-Z3" rr="tet-Z0"><tr><td></td><td>@40</td></tr><tr><td>@20</td><td>@30</td></tr><tr><td>@10</td><td></td></tr></table><table class="tet tet-T tet-T0" rr="tet-T1" pat="[1,0],[2,0],[1,1]"><tr><td>@11</td><td>@22</td><td>@33</td></tr><tr><td></td><td>@44</td><td></td></tr></table><table class="tet tet-T tet-T1" rr="tet-T2" pat="[-1,1],[0,1],[0,2]"><tr><td></td><td>@11</td></tr><tr><td>@42</td><td>@23</td></tr><tr><td></td><td>@34</td></tr></table><table class="tet tet-T tet-T2" rr="tet-T3" pat="[-1,1],[0,1],[1,1]"><tr><td></td><td>@41</td><td></td></tr><tr><td>@32</td><td>@23</td><td>@14</td></tr></table><table class="tet tet-T tet-T3" rr="tet-T0" pat="[0,1],[1,1],[0,2]"><tr><td>@31</td><td></td></tr><tr><td>@22</td><td>@43</td></tr><tr><td>@14</td><td></td></tr></table></div><div class="error"></div>
fuente
Respuestas:
GolfScript 48
I
piezas:O
piezas:T
piezas:J
piezas:Solución
fuente
Java: área 360
Hecho de una mezcla de los siete tipos de piezas. Para facilitar las cosas (?) Me he asegurado de que todas las piezas del mismo tipo se roten en la misma orientación. Como Java tiene partes que no se pueden cambiar mucho, dejé las partes realmente obvias como simples bloques I para comenzar.
Nota: Dado que Java tiene algunos espacios obligatorios, los he reemplazado con guiones bajos (
_
) a continuación para fines de diseño. Hay 11 en total, y todos deben convertirse en espacios para ejecutar el código. Ningún otro espacio en blanco está presente en el código, cualquiera de los siguientes es solo para posicionamiento.Existen:
¡Que te diviertas!
fuente
Brainfuck, área 108
Este código estaba hecho de 27 piezas.
No sé si hay otra forma que no sea fuerza bruta para encontrar la respuesta. Si es así, me gustaría saber cómo.
fuente
Python 3: área 212 [Reconstruida]
Mi código se divide en las siguientes 53
I
piezas, que he escrito alfabéticamente por línea.¡Que te diviertas!
fuente
print('Tetris'* (3580048039607960824098110131314133014381502228523172479258529553116373838184169435643604632480050165153525653945598563157585840631264256539704571638903974876749009825073297156762481649%38941394))
%3894
?print('Tetris'* (358UNKNOWN94))
y, como estaba bastante seguro de que no rotaste ningún mosaico, todo lo que hice fue construir todas las permutaciones posibles de los mosaicos restantes, unirlos y evaluar si358UNKNOWN94
es igual a1
, mientras lo reemplazabaUNKNOWN
con la permutación . Así que no lo usé%3894
porque primero se encontró una permutación de coincidencia diferente;) No sé cuánto tiempo tardó exactamente, pero fueron alrededor de 20 minutos usando un solo núcleo. Así que en realidad usé algo menos sistemático, simplemente forcé la solución por fuerza bruta;)JavaScript - Área 80
Parece que muchas de estas respuestas solo usan muchas piezas I y tal vez una o dos o dos, así que agregué esto junto con algunas de las formas más interesantes.
Cada pieza está separada por dos espacios. Los dos signos hash son en realidad espacios en el código.
¡Que te diviertas!
fuente
Javascript, área 420
Solo bloques I
No se utilizaron ofuscadores estándar. Todo el código, incluida la ofuscación y la creación de esta lista ordenada de bloques, está compuesto por menos de 16 líneas de mi propio código.
Es hora de mostrar cómo se hizo:
Entonces, es solo llamar
eval
con un'console.log("Tetris")'
argumento ofuscado , que tiene 420 símbolos de longitud. Está dividido en 4 líneas de 105 símbolos y leído por columnas y ordenado alfabéticamente.La ofuscación de 10 dígitos está codificada, para otros símbolos se utilizan los primeros 10 símbolos de 4 combinaciones pasadas a la
add
función. Si no hay ofuscación para algún símbolo, se pasa como está.fuente
C, área 80
Hecho de 12
I
piezas y 8O
piezas. La sintaxis de C siempre es divertida.I
piezas en ningún orden particular:O
piezas:fuente
main(q){char c[]
={'/T','$"e','t'
,0162,'rIi>`:i',
'?#>s',q<q/**/};
return puts(c);}
CJam, 60 (15 O's)
Solución
fuente
Befunge, área 360
90
O
piezas.Puedes probarlo aquí .
fuente
Python 3: área 340 [Reconstruida]
Hecho de 85
I
piezas, dadas aquí alfabetizadas una por línea.Como una lista de Python:
fuente
Python 3: área 160
Después del crack de feersum , traté de ajustar mi código para que sea más difícil evitar el jumbo criptográfico. Está hecho de 40
I
piezas, enumeradas una por fila:Como una lista de Python:
Cambiado:
pow
uso1
'sSin embargo, estoy preocupado por los muchos factores del área.
fuente
C - Área 72
Bloques:
Dado que la única otra presentación de C fue descifrada. ;)
Un aseado 72 caracteres. Pura ofuscación. No hay problemas NP-difíciles de resolver o grandes números enteros para factorizar. Toma prestados algunos trucos de uno de los grandes. Los espacios se representan usando
.
s. No real.
aparecen s en la solución.He verificado tres veces la solución para garantizar la validez de las piezas.
fuente
CJam, área 80
20
O
piezas.fuente
C - Área 780
Hay 195 piezas en total. No se utilizaron comentarios. Nada particularmente complicado.
Nota: todas las barras invertidas (
\
) deben reemplazarse con espacios.95
I
piezas:35
O
piezas:18
L
piezas:25
J
piezas:10
T
piezas4
Z
piezas8
S
piezas:Solución
fuente
Wolfram, área 72
Donde quiera que vea un guión (-), reemplácelo con un espacio
yo
j
l
o
s
z
t
fuente
T
bloque deberían ser al revés. Me las arreglé para reconstruirlo .MATLAB, área 48
Desafortunadamente, no parece funcionar en Octave.
fuente
Área Python 3 176
No uso guiones bajos en este programa, así que decidí reemplazar todos los espacios con guiones bajos para mayor legibilidad. Asegúrate de volver a colocarlos en espacios cuando no puedas volver a armarlos.
I bloques:
O bloques:
L bloques:
Bloques J:
Bloques T:
Bloques Z:
Bloques S:
fuente
Python 3
Área - 484
Espacios reemplazados por
%
. Hay algunos comentarios utilizados como relleno. Bastante un poco de repetición de código. Puede ser bastante complicado.121 Os
fuente