Чтение кода за 8 способов вывода 8 чисел


21

Английский язык и большинство языков программирования пишутся и читаются слева направо, сверху вниз, но это не обязательно так .

На самом деле для блока текста

ABC
DEF

Я могу думать о восьми связанных способах, которыми это могло бы быть прочитано:

  1. Слева направо, сверху вниз (LTR-TTB): ABCDEF
  2. Сверху вниз, слева направо (TTB-LTR): ADBECF
  3. Слева направо, снизу вверх (LTR-BTT): DEFABC
  4. Снизу вверх, слева направо (BTT-LTR): DAEBFC
  5. Справа налево, сверху вниз (RTL-TTB): CBAFED
  6. Сверху вниз, справа налево (TTB-RTL): CFBEAD
  7. Справа налево, снизу вверх (RTL-BTT): FEDCBA
  8. Снизу вверх, справа налево (BTT-RTL): FCEBDA

Вызов

Напишите прямоугольный блок текста, который можно прочитать каждым из восьми указанных выше способов, в виде восьми однострочных программ на выбранном вами языке. Каждая из этих программ должна вывести различное целое число от одного до восьми.

Неважно, какое направление чтения выводит какое число, они не должны совпадать с числами выше. Например, если ваш текстовый блок все еще

ABC
DEF

то программа ABCDEFвывода может 5и FEDCBAвывод может 2, и остальные шесть программ будет выводить 1, 3, 4, 6, 7, и 8в некотором порядке.

Текстовый блок может содержать любые символы, кроме разделителей строк .

Вывод должен идти в стандартный вывод или аналогичную альтернативу, если ваш язык не имеет правильного стандартного вывода. Там нет ввода. Вы можете предположить, что программы работают в среде REPL.

Pietu1998 милостиво написал JSFiddle, который дает 8 различных однострочных программ, когда передается блок текста. Я сделал это во фрагменте стека:

<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/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

Вы все еще можете найти версию CJam Мартина здесь .

счет

Ваша оценка - это область вашего блока текста (ширина, умноженная на высоту). Представление с самым низким счетом выигрывает. (По сути, выигрывает наименьший код, следовательно, тег .) Tiebreaker переходит к ранее опубликованному представлению.

Пример - 2 на 3, поэтому его оценка равна 6. Оценка менее 4 (2 на 2) невозможна, потому что тогда некоторые из 8 программ будут идентичными и не смогут вывести два разных значения.


6
Почему правило "только для печати ascii"? Это означает, что APL не может конкурировать в этом соревновании. :(
Морис Зукка

3
Я сделал скрипку, которая конвертирует кодовый блок в 8 программ. Может быть включен в качестве фрагмента, хотя хотите узнать мнение OP по этому поводу.
PurkkaKoodari

3
@ MartinBüttner Хорошо, я исправил это. Кажется, String.prototype.repeat()это все еще что-то новое. Также подтвердили работу в IE сейчас. новая скрипка
PurkkaKoodari

@MorisZucca Теперь разрешены все символы, кроме разделителей строк.
Увлечения Кэлвина

@ Pietu1998 Спасибо за скрипку, я добавил ее как фрагмент.
Увлечения Кэлвина

Ответы:


21

J 3 * 3 = 9

1[2
+2+
2+2

Выполнение всех направлений:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

Объяснение:

  • В J выполнение идет справа налево и оператор не имеет приоритета.
  • [( left) Берет на левую сторону его два операнда , так что по существу отменяет вся правая сторона нашего выражения , например , 1+2[2+2+2становится 1+2[6затем1+2 .
  • Левые выражения - это дополнения с 1, 2, 3 и 4 операндами. Есть два nвыражения каждого из операндов: одно с номером, 1а другое только 2с s. Дополнения с 1генерируют нечетные числа, а остальные генерируют четные.

5
Это действительно мило. Замените [на, ;и это должно работать в среде REPL большинства языков.
Оптимизатор

18

Befunge-98 ,5х5 = 25 5х3 = 15

1+4+2
$.@.$
3+4+4

Я написал небольшой сценарий, который нашел правильные номера для меня. Это заняло некоторое время, но эй, я просто победил GolfScript! : D

Сценарии, которые я использовал, здесь и здесь , но я не предлагаю их рассматривать, так как стиль кода чрезвычайно канцерогенный.

Подпрограммы

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

Старая версия

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

Подпрограммы

Выведите числа 1-8 соответственно.

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $ , 4x3 = 12

Brainfuck $ очень похож на Brainfuck , но содержит еще несколько команд, включая команду для вывода текущего значения ячейки в виде числового вывода, что было очень полезно для этой задачи.

++:+
  ++
++++

Однострочные команды:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

Я бы сказал, что вам не нужны Brainfuck $; команда. Я хотел бы рассмотреть возможность просто. и вывод 0x01-0x08 совершенно корректен. Это Брэйнфак, ради всего этого. +1.
matega

Я был бы в порядке с двоичным выходом.
Captncraig

7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=печатает значение последнего числового выражения. \используется для чтения или записи чисел из строк, но я использую его только как сброс здесь.

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8

7

Пит - 12x12 = 144

введите описание изображения здесь

Так как однострочная программа не может завершиться, предположим, что она завершается после первого вывода.

8 подпрограмм в одном изображении:

введите описание изображения здесь


6

GolfScript, 4x4 = 16

1})7
)  }
}  )
3)}5

Использует старый добрый «супер комментарий»: непревзойденный }игнорирует остальную часть кода (фактически, в этом случае нормальный комментарий #сработал бы так же хорошо, так как весь код запускается одной строкой). Таким образом, из каждого угла есть либо только одно число, либо (в другом направлении) это число увеличивается на 1, потому что выполнение прекращается и содержимое стека печатается. 8 программ

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

Haskell, 26x26 = 676

Использует комментарии ( --), чтобы скрыть биты назад и в сторону. Это делает это ужасно долго

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
Мне кажется, что это можно распространить на большинство языков с помощью встроенных комментариев
Sp3000

4

Прелюдия , 5х3 = 15

12 34
  !  
56 78

Это предполагает интерпретатор Python , который печатает значения в виде чисел, а не кодов символов.

Это не побеждает Befunge $, но оно побивает мои представления о GolfScript, и мне нравится его простота. Также обратите внимание, что в нем используются только 9 непробельных символов, что меньше, чем в любой другой отправке (J снова наносит удар :)). В Prelude каждая цифра помещается в стек по отдельности, и, в зависимости от пути, перед цифрой находится другая цифра !, которая просто печатает верхний элемент стека. 8 программ:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

Кроме того, есть также

 1 3 
1+!+1
 5 7 

Который толкает нечетные числа на вертикальных путях и увеличивает их 1на горизонтальных путях:

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1

2

CJam - 7 × 7

Не впечатляет, но ответа CJam не было, и мне нравится, как это выглядит :)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

В основном используется тот факт, что ];очищает стек.

Попробуйте онлайн


1

Рубин - 7х7

Также не впечатляет, та же тактика, что и у ответа на Haskell.

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

Нет пробелов, нет комментариев.

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

Я думаю, это можно расширить до любого размера, который вы хотите. Я думал, что оператор по модулю является наиболее гибким из доступных операторов, поскольку он предотвращает слишком большие значения независимо от размера данных, и нет никакого эффекта от наличия действительно больших чисел между ними.

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

Это язык программирования, 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

Что переводится в это:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

Поскольку ;завершает программу, вышесказанное переводится в это:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

Пояснение: любое число от 0до9 помещает соответствующую цифру в стек. +выскакивает два верхних значения xи yиз стека и помещает x + yв стек. iвыводит стек как целое число.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.