Код читання 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в деякому порядку.

Текстовий блок може містити будь-які символи, крім терміналів рядків .

Вихід повинен переходити до stdout або подібної альтернативи, якщо у вашій мові немає належної версії. Введення немає. Ви можете припустити, що програми запускаються в середовищі 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 програм. Можна включити як фрагмент, хоч думка ОП з цього приводу.
PurkkaKoodari

3
@ MartinBüttner Добре, я це виправив. Здається String.prototype.repeat(), все одно щось нове. Також підтверджено, що зараз працює в IE. нова скрипка
PurkkaKoodari

@MorisZucca Усі символи, крім терміналів рядків, тепер дозволені.
Захоплення Кальвіна

@ Pietu1998 Дякую за Fiddle, я додав її як фрагмент.
Захоплення Кальвіна

Відповіді:


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вирази -operand: один з числом 1і один з 2s. Доповнення з 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 $ 's; командування. Я б розглядав можливість просто використовувати. та вихід 0x01-0x08 цілком справедливий. Це Brainfuck, для (мозку) ебать. +1.
матега

Було б добре з двійковим виходом.
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

пієт - 12х12 = 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

Хаскелл, 26х26 = 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 повторюється :)). У прелюдії кожна цифра висувається на стек окремо, і залежно від шляху, перед початком стоїть інша цифра !, яка просто друкує верхній елемент стека. 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.