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ć:
- Od lewej do prawej, od góry do dołu (LTR-TTB):
ABCDEF
- Od góry do dołu, od lewej do prawej (TTB-LTR):
ADBECF
- Od lewej do prawej, od dołu do góry (LTR-BTT):
DEFABC
- Od dołu do góry, od lewej do prawej (BTT-LTR):
DAEBFC
- Od prawej do lewej, od góry do dołu (RTL-TTB):
CBAFED
- Od góry do dołu, od prawej do lewej (TTB-RTL):
CFBEAD
- Od prawej do lewej, od dołu do góry (RTL-BTT):
FEDCBA
- 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 ABCDEF
wyjście potęga 5
i FEDCBA
moc moc 2
, a pozostałe sześć programów byłoby wyjście 1
, 3
, 4
, 6
, 7
, i 8
w 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/> <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 code-golf .) 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.
źródło
String.prototype.repeat()
to, że wciąż jest nowy. Potwierdzono także, że działa teraz w IE. nowe skrzypceOdpowiedzi:
J, 3 * 3 = 9
Wykonanie wszystkich kierunków:
Wyjaśnienie:
[
(left
) Wykonuje lewą stronę jej dwóch argumentu więc zasadniczo anuluje cała prawa strona naszej ekspresji np1+2[2+2+2
staje1+2[6
, a potem1+2
.n
wyrażenia -operand, jedno z liczbą,1
a drugie tylko z2
s. Dodatki z1
generują liczby nieparzyste, a pozostałe generują parzyste.źródło
[
się;
i powinno działać w środowisku REPL większości języków.Befunge-98 ,
5x5 = 255x3 = 15Napisał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
Stara wersja
Podprogramy
Wypisz odpowiednio cyfry 1-8.
źródło
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:
źródło
TECO, 3 * 5 = 15
=
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+ +
15 \ 4 4=1+2+ +
45 4+ 4=2+\ 1+
8źródło
piet - 12x12 = 144
Ponieważ program jednowierszowy nigdy się nie kończy, załóżmy, że kończy się po pierwszym wyjściu.
8 podprogramów na jednym obrazie:
źródło
GolfScript, 4x4 = 16
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źródło
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źródło
Preludium , 5x3 = 15
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:Alternatywnie istnieje również
Który popycha liczby nieparzyste na ścieżkach pionowych i zwiększa je
1
na ścieżkach poziomych:źródło
CJam - 7 × 7
Nie imponujące, ale nie było odpowiedzi na CJam i podoba mi się jego wygląd :)
Wykorzystuje to głównie fakt, że
];
usuwa stos.Wypróbuj online
źródło
Rubin - 7x7
Nie imponująca, ta sama taktyka jak odpowiedź Haskella.
źródło
R, 9x9
Bez białych znaków, bez komentarzy.
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.
źródło
Ten język programowania, 5 * 9 = 45
Co przekłada się na to:
Ponieważ
;
kończy działanie programu, powyższe przekłada się na to:Objaśnienie: dowolna liczba od,
0
aby9
wypchnąć odpowiednią cyfrę na stos.+
wyskakuje z dwóch górnych wartościx
iy
wyłącza stos i przesuwax + y
się na stos.i
wyprowadza stos jako liczbę całkowitą.źródło