В традиционном тетрис , есть 7 различных Tetromino кирпичей, каждый из которых, обозначаемые буквой , подобной его формы.
#
# # #
# ## # # ### ## ##
# ## ## ## # ## ##
I O L J T Z S
Рассмотрим расположение этих кирпичей, которые могут составлять сплошной прямоугольник W × H для некоторых натуральных чисел W и H. Например, используя 2 I, 1 L, 1 J, 2 T и 1 S, прямоугольник 7 × 4 можно быть сделано:
IIIITTT
LIIIITJ
LTTTSSJ
LLTSSJJ
Одни и те же кирпичи можно переставлять (перемещая и вращая, но не переворачивая ) в другой шаблон 7 × 4:
IJJTLLI
IJTTTLI
IJSSTLI
ISSTTTI
Теперь рассмотрим использование прямоугольного блока кода вместо первого расположения. Например, это 7 × 4 бит Python 3, который печатает Tetris
на стандартный вывод:
p=print
x='Tet'
y='ris'
p(x+y)#
Согласно первому расположению тетриса, его 7 "кирпичей" ...
x '
int y ' ='r is
p=pr t p( ='Te )# x +y
В другом расположении (одном из многих возможных) они не понятны как код:
r#)x(x=
p'r'=y'
='istpT
p+ytnie
Но, учитывая кирпичи по отдельности, можно было бы правильно собрать их вместе. Это основа проблемы.
Вызов
Это задача полицейских и грабителей . Есть две конкурирующие роли, Jumblers и Rebuilders .
Jumblers представляют ответы с блоками кода, которые были разбиты на кирпичи Tetris.
Перестройщики пытаются перестроить эти блоки в отдельном вопросе, посвященном им: Jumblers vs Rebuilders: Кодирование с помощью Tetris Bricks - область для ответов Rebuilder .
Jumblers
Используя только печатный ASCII (шестнадцатеричные коды от 20 до 7E), напишите прямоугольную программу W × H. При запуске он должен вывести единственное слово Tetris
в stdout (или ближайшую альтернативу). Не размещайте этот код в своем ответе; не давайте ни W, ни H. Разбейте его на несколько блоков Tetris, как в примере выше, и опубликуйте их в своем ответе. (Ваш код может содержать пробелы, но поскольку их трудно различить, лучше использовать какой-то другой символ вместо пробелов и рассказать людям, что вы использовали.)
Чем сложнее перестроить вашу программу, тем лучше. Может быть много способов переставить ваши кодовые блоки в прямоугольник, возможно, с разными размерами. То, что делает код при запуске в этих разных устройствах, не имеет значения, если хотя бы одно устройство печатает Tetris
на стандартный вывод.
Единственное другое ограничение - W * H меньше 1025.
Jumblers должен указать свой язык программирования (и версию).
модернизация
Ваша цель - взять кодовые блоки Jumbler и вернуть их в исходный порядок, чтобы они Tetris
печатались при запуске кода. Если найденная вами рабочая договоренность не та, о которой думал Джамблер, это слишком плохо для них.
Помните, что только перестановка и поворот допускаются в перестановках, а не в зеркалировании.
счет
Каждый раз, когда представление перестраивается, оно считается «взломанным» и больше не выполняется. Первый Rebuilder, который восстановит представление, получает кредит за это. Если ответ не будет получен в течение 72 часов, Jumbler должен найти решение и отныне будет защищен от взлома. Jumbler должен сделать это, чтобы победить, так как иначе будет неясно, было ли вообще какое-то решение.
Победивший Jumbler - это ответ без трещин с наименьшей площадью (W * H = 4 * количество кирпичей). В случае ничьих победит ответ, получивший наибольшее количество голосов. Принятым ответом на этот вопрос будет победитель Jumbler.
Победитель Rebuilder это пользователь, который взламывает большинство представлений. В случае связей это идет к тому, кто взломал самую совокупную область.
Заметки
- Вы не можете перестраивать свои собственные представления. (Но в противном случае вы можете взять на себя обе роли.)
- Восстановители не могут пытаться взломать один и тот же ответ более одного раза.
Табло
Отсортировано от самого старого представления до самого нового.
+--------------+-------------+------------------+---------+----------+----------------+-------------------------------------------+-------------------------------------------+
| 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 | |
+--------------+-------------+------------------+---------+----------+----------------+-------------------------------------------+-------------------------------------------+
(Спасибо http://www.sensefulsolutions.com/2010/10/format-text-as-table.html за форматирование таблиц.)
Пользователь COTO сделал отличный инструмент для игры с code-bricks. Я превратил его в удобный фрагмент:
<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>
источник
Ответы:
GolfScript 48
I
частей:O
частей:T
частей:J
частей:Решение
источник
Ява: 360 площадь
Изготовлен из смеси всех семи типов. Чтобы упростить задачу (?), Я позаботился о том, чтобы все части одного типа вращались в одинаковой ориентации. Поскольку в Java есть части, которые не могут быть изменены, я оставил действительно очевидные части как простые I-блоки, чтобы начать.
Примечание. Поскольку в Java есть несколько обязательных пробелов, я заменил их на подчеркивание (
_
) ниже для целей компоновки. Всего их 11, и все они должны быть преобразованы в пробелы для запуска кода. Никаких других пробелов в коде нет, любые ниже приведены только для позиционирования.Есть:
Повеселись!
источник
Brainfuck, 108 область
Этот код был сделан из 27 штук.
Я не знаю, есть ли другой способ, кроме грубой силы, найти ответ. Если есть, я бы очень хотел знать, как.
источник
Python 3: 212 зона [перестроен]
Мой код разбит на следующие 53 части
I
, которые я написал по одному в строке в алфавитном порядке.Повеселись!
источник
print('Tetris'* (3580048039607960824098110131314133014381502228523172479258529553116373838184169435643604632480050165153525653945598563157585840631264256539704571638903974876749009825073297156762481649%38941394))
%3894
?print('Tetris'* (358UNKNOWN94))
что сделал предварительную сборку, и, поскольку я был почти уверен, что вы не вращали никакие плитки, все, что я сделал, это построил все возможные перестановки оставшихся плиток, соединил их и оценил, если358UNKNOWN94
равен1
, в то время как я заменилUNKNOWN
перестановку , Поэтому я не использовал,%3894
потому что сначала была найдена другая подходящая перестановка;) Я не знаю, сколько именно времени это заняло, но это было около 20 минут с использованием одного ядра. Так что я на самом деле использовал что-то менее систематическое, я просто обманул решение;)JavaScript - область 80
Похоже, что многие из этих ответов просто используют множество фигур I и, возможно, одну или две, поэтому я добавил это вместе с некоторыми более интересными фигурами.
Каждый кусок разделен двумя пробелами. Два хеш-символа на самом деле являются пробелами в коде.
Повеселись!
источник
Javascript, область 420
Только я-блоки.
Никаких стандартных обфускаторов не использовалось. Весь код, включая обфускацию и создание этого отсортированного списка блоков, состоит из менее чем 16 строк моего собственного кода.
Пришло время показать, как это было сделано:
Итак, это просто вызов
eval
с запутанным'console.log("Tetris")'
аргументом длиной 420 символов. Он разбит на 4 строки по 105 символов и прочитан по столбцам и отсортирован по алфавиту.Запутывание для 10 цифр жестко закодировано, для других символов используются первые 10 символов из 4 комбинаций, переданных в
add
функцию. Если для какого-либо символа нет запутывания, оно передается как есть.источник
С, 80 площадь
Изготовлен из 12
I
штук и 8O
штук. Синтаксис C всегда весело.I
штуки в произвольном порядке:O
частей:источник
main(q){char c[]
={'/T','$"e','t'
,0162,'rIi>`:i',
'?#>s',q<q/**/};
return puts(c);}
CJam, 60 (15 O)
Решение
источник
Befunge, 360 площадь
90
O
штукВы можете попробовать это здесь .
источник
Python 3: 340 площадь [перестроен]
Изготовлен из 85
I
частей, здесь дано по алфавиту по одному на строку.Как список Python:
источник
Питон 3: 160 площадь
После взлома feersum я попытался ужесточить свой код, чтобы было сложнее избежать криптографического мумбо-юмбо. Он состоит из 40
I
штук, по одному в строке:Как список Python:
Изменен:
pow
использовать его1
«sЯ беспокоюсь о многих факторах этого района.
источник
С - Зона 72
Блоки:
Так как единственная другая подача С была взломана. ;)
Аккуратные 72 символа. Чистая запутанность. Никаких NP-трудных задач для решения или огромных целых чисел для учета. Занимает некоторые трюки от одного из великих. Пробелы представлены с помощью
.
s. Фактические.
s не появляются в решении.Я трижды проверил решение, чтобы убедиться в достоверности частей.
источник
CJam, 80 площадь
20
O
штукисточник
С - Зона 780
Всего 195 штук. Комментарии не были использованы. Ничего особенно сложного.
Примечание: все обратные косые черты (
\
) должны быть заменены пробелами.95
I
штук:35
O
штук:18
L
штук:25
J
штук:10
T
штук:4
Z
шт:8
S
штук:Решение
источник
Вольфрам, площадь 72
Везде, где вы видите тире (-), замените его пробелом
я
J
L
о
s
Z
T
источник
T
блоке должны быть наоборот. Мне удалось восстановить его .MATLAB, область 48
К сожалению, он не работает в Octave.
источник
Python 3 176 Площадь
Я не использую подчеркивания в этой программе, поэтому я решил заменить все пробелы подчеркиваниями для большей читаемости. Обязательно замените их обратно на пробелы, если не удается собрать их вместе.
Я блоки:
O Блоки:
L Блоки:
J блоки:
T блоки:
Z блоков:
S блоки:
источник
Python 3
Площадь - 484
Пространства заменены на
%
. Есть несколько комментариев, используемых в качестве отступов. Совсем немного повторения кода. Может быть довольно сложно.121 Os
источник