Odczytywanie kodu na 8 sposobów, aby uzyskać 8 liczb

21

Język angielski i większość języków programowania są pisane i czytane od lewej do prawej, od góry do dołu, ale nie musi tak być .

W rzeczywistości dla bloku tekstu

ABC
DEF

Mogę wymyślić osiem powiązanych sposobów, w jakie można to przeczytać:

  1. Od lewej do prawej, od góry do dołu (LTR-TTB): ABCDEF
  2. Od góry do dołu, od lewej do prawej (TTB-LTR): ADBECF
  3. Od lewej do prawej, od dołu do góry (LTR-BTT): DEFABC
  4. Od dołu do góry, od lewej do prawej (BTT-LTR): DAEBFC
  5. Od prawej do lewej, od góry do dołu (RTL-TTB): CBAFED
  6. Od góry do dołu, od prawej do lewej (TTB-RTL): CFBEAD
  7. Od prawej do lewej, od dołu do góry (RTL-BTT): FEDCBA
  8. Od dołu do góry, od prawej do lewej (BTT-RTL): FCEBDA

Wyzwanie

Napisz prostokątny blok tekstu, który można odczytać na każdy z ośmiu powyższych sposobów, jako osiem programów jednowierszowych w wybranym języku. Każdy z tych programów powinien wypisywać inną liczbę całkowitą od jednego do ośmiu.

Nie ma znaczenia, który kierunek odczytu generuje numer, nie muszą one odpowiadać powyższym liczbom. Na przykład, jeśli twój blok tekstowy był nadal

ABC
DEF

Następnie program ABCDEFwyjście potęga 5i FEDCBAmoc moc 2, a pozostałe sześć programów byłoby wyjście 1, 3, 4, 6, 7, i 8w pewnym porządku.

Blok tekstowy może zawierać dowolne znaki oprócz terminatorów linii .

Dane wyjściowe powinny przejść do standardowego wyjścia lub podobnej alternatywy, jeśli Twój język nie ma odpowiedniego standardowego wyjścia. Brak danych wejściowych. Możesz założyć, że programy działają w środowisku REPL.

Pietu1998 dobroczynnie napisał JSFiddle, który daje 8 różnym programom jednowierszowym, gdy otrzymuje blok tekstu. Zrobiłem z niego fragment kodu:

<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>

Nadal możesz znaleźć wersję Martina CJam tutaj .

Punktacja

Twój wynik to obszar bloku tekstu (szerokość razy wysokość). Zgłoszenie o najniższym wyniku wygrywa. (Zasadniczo wygrywa najmniejszy kod, stąd tag .) Tiebreaker przechodzi do wcześniej opublikowanego zgłoszenia.

Przykład to 2 na 3, więc jego wynik to 6. Wynik mniejszy niż 4 (2 na 2) jest niemożliwy, ponieważ wtedy niektóre z 8 programów byłyby identyczne i nie byłyby w stanie wyprowadzić dwóch różnych wartości.

Hobby Calvina
źródło
6
Dlaczego reguła „tylko ascii do wydruku”? Oznacza to, że APL nie może konkurować w tym wyzwaniu. :(
Moris Zucca
3
Zrobiłem skrzypce, która konwertuje blok kodu na 8 programów. Może być dołączony jako fragment, ale poproś o opinię OP w tej sprawie.
PurkkaKoodari
3
@ MartinBüttner W porządku, naprawiłem to. Wygląda na String.prototype.repeat()to, że wciąż jest nowy. Potwierdzono także, że działa teraz w IE. nowe skrzypce
PurkkaKoodari
@ MorisZucca Dozwolone są teraz wszystkie znaki oprócz terminatorów linii.
Calvin's Hobbies
@ Pietu1998 Dzięki za skrzypce, dodałem go jako fragment.
Calvin's Hobbies

Odpowiedzi:

21

J, 3 * 3 = 9

1[2
+2+
2+2

Wykonanie wszystkich kierunków:

       ". '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

Wyjaśnienie:

  • W J wykonanie przebiega od prawej do lewej i nie ma pierwszeństwa operatora.
  • [( left) Wykonuje lewą stronę jej dwóch argumentu więc zasadniczo anuluje cała prawa strona naszej ekspresji np 1+2[2+2+2staje 1+2[6, a potem 1+2.
  • Lewe wyrażenia są dodatkami z 1, 2, 3 i 4 operandami. Istnieją dwa nwyrażenia -operand, jedno z liczbą, 1a drugie tylko z 2s. Dodatki z 1generują liczby nieparzyste, a pozostałe generują parzyste.
randomra
źródło
5
To jest naprawdę miłe. Wymień [się ;i powinno działać w środowisku REPL większości języków.
Optymalizator
18

Befunge-98 ,5x5 = 25 5x3 = 15

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

Napisałem mały skrypt, który znalazł dla mnie prawidłowe liczby. Minęło trochę czasu, ale hej, właśnie pobiłem GolfScript! :RE

Skrypty, których użyłem, są tu i tutaj , ale nie sugeruję, aby na nie patrzeć, ponieważ styl kodu jest wyjątkowo rakotwórczy.

Podprogramy

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

Stara wersja

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

Podprogramy

Wypisz odpowiednio cyfry 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
PurkkaKoodari
źródło
14

Brainfuck $ , 4x3 = 12

Brainfuck $ jest bardzo podobny do Brainfuck , ale ma jeszcze kilka poleceń, w tym polecenie do wyświetlania bieżącej wartości komórki jako wyjścia liczbowego, co było bardzo przydatne w tym wyzwaniu.

++:+
  ++
++++

Polecenia jednowierszowe:

++:+  ++++++   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
ProgramFOX
źródło
Twierdziłbym, że nie potrzebujesz Brainfuck $; dowództwo. Rozważałbym użycie po prostu. i wyprowadzenie 0x01-0x08 doskonale poprawne. To Brainfuck, na miłość boską. +1.
matega
Byłbym w porządku z wyjściem binarnym.
captncraig
7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=wypisuje wartość ostatniego wyrażenia liczbowego. \służy do odczytywania lub zapisywania liczb z ciągów, ale używam go tylko jako odrzucenia.

  • +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
feersum
źródło
7

piet - 12x12 = 144

wprowadź opis zdjęcia tutaj

Ponieważ program jednowierszowy nigdy się nie kończy, załóżmy, że kończy się po pierwszym wyjściu.

8 podprogramów na jednym obrazie:

wprowadź opis zdjęcia tutaj

captncraig
źródło
6

GolfScript, 4x4 = 16

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

Korzysta ze starego dobrego „super komentarza”: niedopasowane }ignoruje resztę kodu (w tym przypadku normalny komentarz #działałby równie dobrze, ponieważ cały kod jest uruchamiany jako pojedynczy wiersz). Tak więc z każdego rogu jest albo tylko jedna liczba, albo (w innym kierunku) liczba ta jest zwiększana o 1, ponieważ wykonywanie kończy się, a zawartość stosu jest drukowana. 8 programów to

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
Martin Ender
źródło
5

Haskell, 26 x 26 = 676

Wykorzystuje komentarze ( --) do ukrywania bitów do tyłu i na boki. To sprawia, że ​​jest to strasznie długie

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
HEGX64
źródło
2
Wydaje mi się, że można to rozszerzyć na większość języków za pomocą wbudowanych komentarzy
Sp3000,
4

Preludium , 5x3 = 15

12 34
  !  
56 78

Zakłada się interpreter Pythona , który drukuje wartości jako liczby zamiast kodów znaków.

To nie bije Befunge $, ale bije moje przesłanie GolfScript i podoba mi się jego prostota. Zauważ też, że używa tylko 9 znaków spacji, co jest mniej niż jakikolwiek inny jak dotąd zgłoszenie (J uderza ponownie :)). W Preludium każda cyfra jest wypychana na stos indywidualnie i zależnie od ścieżki, przed nią jest inna cyfra !, która po prostu drukuje element górnego stosu. 8 programów to:

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

Alternatywnie istnieje również

 1 3 
1+!+1
 5 7 

Który popycha liczby nieparzyste na ścieżkach pionowych i zwiększa je 1na ścieżkach poziomych:

 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
Martin Ender
źródło
2

CJam - 7 × 7

Nie imponujące, ale nie było odpowiedzi na CJam i podoba mi się jego wygląd :)

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

Wykorzystuje to głównie fakt, że ]; usuwa stos.

Wypróbuj online

aditsu
źródło
1

Rubin - 7x7

Nie imponująca, ta sama taktyka jak odpowiedź Haskella.

p 1#2 p

3     7
#     #
4     8

p 5#6 p
sj26
źródło
1

R, 9x9

Bez białych znaków, bez komentarzy.

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

Wydaje mi się, że można go rozszerzyć do dowolnego rozmiaru. Pomyślałem, że operator modulo jest najbardziej elastycznym spośród dostępnych operatorów, ponieważ zapobiega zbyt dużym wartościom niezależnie od wielkości danych i nie ma żadnego efektu pomiędzy naprawdę dużymi liczbami.

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
freekvd
źródło
1

Ten język programowania, 5 * 9 = 45

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

Co przekłada się na to:

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

Ponieważ ;kończy działanie programu, powyższe przekłada się na to:

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

Objaśnienie: dowolna liczba od, 0aby 9wypchnąć odpowiednią cyfrę na stos. +wyskakuje z dwóch górnych wartości xi ywyłącza stos i przesuwa x + ysię na stos. iwyprowadza stos jako liczbę całkowitą.

BobTheAwesome
źródło