Tytuł mówi wszystko. Twoim celem jest napisanie programu, który utworzy aw × h prostokąta znaków, który można obracać i ponownie uruchomić, aby wygenerować liczbę wykonanych obrotów o 90 ° w kierunku przeciwnym do ruchu wskazówek zegara (CCW).
Na przykład, jeśli program 3 × 2
abc
def
rozwiązany problem, początkowo generowałby 0, a kolejne obroty o 90 ° CCW
cf fed da
be cba eb
ad fc
wypisze odpowiednio 1, 2 i 3.
Używanie komentarzy sprawia, że jest to trywialne zadanie w większości języków. Na przykład w Ruby można to zrobić w prostokącie 7 × 7:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
Wyzwanie polega na zrobieniu tego bez żadnych komentarzy.
Punktacja
Twój wynik to w * h, obszar prostokąta. Nowe linie są wykluczone. Innymi słowy, code-golf, nowe linie nie są liczone.
Wynik dla przykładu Rubiego to 49 (choć oczywiście jest on nieprawidłowy, ponieważ zawiera komentarze).
Notatki
- Twój kod musi być naprawdę prostokątny bez brakujących znaków na końcu wiersza.
- Jeśli chcesz, możesz wypisać inne legalne wartości „mod 90 °” zamiast 0 1 2 3. Więc 8 jest w porządku zamiast 0, a -1 jest w porządku zamiast 3 itd.
- Dane wyjściowe mogą przejść do konsoli lub do pliku.
- Obowiązują standardowe luki.
Mam nadzieję, że moje pierwsze pytanie naprawdę intryguje niektórych ludzi. Cieszyć się!
źródło
echo 0;exit;e
w bash jest dozwolony?Odpowiedzi:
APL (1x3 = 3)
To rozwiązanie wykorzystuje dodatkową zasadę, że każde wyjście, które jest poprawne mod 4 działa.
W APL
x!y
jest liczbą sposobów wybieraniax
elementówy
, zwanych potoczniebinom(y,x)
lubchoose(y,x)
. Sprawdźmy, czy każdy obrót daje prawidłową odpowiedź.0 obrotów
Nie ma możliwości wybrania 5 elementów z 3, więc otrzymujemy 0, które jest automatycznie drukowane.
1 obrót w lewo
APL z radością ocenia każdą linię, uzyskując numer
3
, operator!
, a następnie numer5
, wypisując tylko ostatnią z nich (5
), czyli 1 mod 4.2 obroty w lewo
To jest
binom(5,3)
, czyli(5*4*3*2*1)/(3*2*1)/(2*1) = 10
2 mod 4.3 obroty w lewo
Tak jak poprzednio, tylko ostatnio oceniana wartość
3
to drukarka.Tak naprawdę nie znam APL, więc proszę powiedz mi, jeśli popełniłem błąd. Znalazłem to metodą prób i błędów jako pierwszego języka na tej stronie, który:
Dla (5) przeszedłem listę funkcji dyadycznych APL . Moją pierwszą operacją kandydującą była dzielenie całkowite
/
C i Python 2, ale podział APL÷
daje liczby zmiennoprzecinkowe . Potęgowanie jest kuszące, ale nie dlatego, żea
ia^b
mają ten sam parytet ale dostał przez kolejnych obrotów (chybab=0
, ale potemb^a=0
). Operatory logiczne, takie jak<
dawanie0
i1
odstęp 180 stopni, co nie działa. W końcu znalazłem operator dwumianowy!
i wypróbowałem liczby, dopóki nie dostałem takiej pracy.Dzięki Quincunx za jego pewność, że istnieje rozwiązanie mniejsze niż 2x2.
źródło
Rubinowy, 7 × 9 (63)
Trochę dłużej niż inne rozwiązanie, ale przynajmniej to rozwiązanie nie zależy od jakiegokolwiek niejawnego drukowania lub nadużycia reguł. Dla wszystkich czterech obrotów cały kod jest analizowany, a poza zwarciem wszystkie są wykonywane. Co zaskakujące, w kodzie absolutnie nie ma symetrii
To rozwiązanie polega na tym, że nadal można wywołać
p
funkcję (która służy do drukowania liczb), nawet jeśli zmienna o tej samej nazwie została już zdefiniowana. Na przykład coś takiegop p
wywołuje funkcjęp
ze zmiennąp
jako argumentem (w ten sposób wypisuje wartośćp
).Wyjaśnienie niektórych typowych wyrażeń używanych w kodzie:
p
: Jak wspomniano powyżej, jest to wywołanie funkcji lub zmienna. Gdy zmienna nie jest zdefiniowana, wywołuje to funkcjęp
bez argumentów, co nic nie robi i zwracanil
.p p
: Drukuje zmiennąp
.p|x
: Kiedyp
jest funkcją, jest identyczna znil|x
, która zwraca true / false w zależności od wartościx
. Jeślip
jest liczbą całkowitą, jest bitowa lub. Tak czy inaczej, to stwierdzenie nie ma skutków ubocznych.p=p||x
: Efektywnie taki sam jakp||=x
(przypisanie warunkowe) z tą zaletą, że jest poprawny pod względem składniowym i nie ma możliwości odwrócenia.Wersja symetryczna (9 × 10 = 90)
Jest to najkrótsze rozwiązanie symetryczne (C 2 przy ignorowaniu liczb do wydrukowania), jakie mogłem wymyślić.
Skrypt testowy
Oto skrypt testowy do weryfikacji powyższego kodu (
#
na końcu linii zostały dodane, aby białe znaki nie zostały usunięte i zostały usunięte przed wykonaniem):źródło
GolfScript, 4 (2x2)
Drukuje,
4312
co jest0
(mod 4). Drukowane są rotacje3241
(1 mod 4),2134
(2 mod 4) i1423
(3 mod 4).Zainicjowane przez:
W rzeczywistości istnieje wiele zestawów liczb, dla których to działa. Znalazłem je w tym programie Python:
Chociaż program wypisuje
0
s (co prawdopodobnie nie działałoby), prawidłowe rozwiązania mają formęGdzie
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. IE,(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
czyli 24 rozwiązania.źródło
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. Jest tak, ponieważ parzystość liczby całkowitej jest równa parzystości jej skrajnej prawej cyfry, ale obroty w odstępie 90 stopni muszą dawać różne parzystości. Tak,2*2
jest minimalna dla tego podejścia.Python - 23 x 23 = 529
Ok, to pytanie ma już zwycięzcę, ale nie ma jeszcze rozwiązania w języku Python. Więc pomyślałem o tym - ciężko! - i znalazł sposób na sprawienie, by nieporęczne
print
polecenie działało w dowolnym kierunku, nie powodując błędów po przeanalizowaniu z jednego z pozostałych kierunków.Przełomem była następująca linia:
Podczas
forward_code
wykonywaniabackward_code
jest częścią ciągu i dlatego nie jest drukowana. To jest dokładnie na odwrót podczas czytania wstecz.Tak więc w połączeniu z dwoma dodatkowymi kierunkami i dopracowanymi, aby uzyskać prawidłowe dopasowanie wszystkich cytatów, otrzymuję następujące rozwiązanie:
Edycja: Znalazłem sposób na poradzenie sobie z tą białą spacją. ;)
źródło
p=print
w pliku, skoro masz obecnie tyle białych znaków? (Python 3, oczywiście)p=print
jest również długa. A co ważniejsze: nie możesz użyć ponowniep
po obróceniu kodu!BASIC, 64
Nie wygra, ale i tak jest. (Testowany w Chipmunk Basic )
Uwaga:
?
jest skrótemPRINT
w różnych dialektach języka BASIC. Chociaż w kodzie jest wiele błędów składniowych,END
instrukcja w pierwszym wierszu uniemożliwia ich odczytanie przez interpretera.źródło
END
:)Pyth , 9 znaków (3x3)
W pyth wszystko jest drukowane domyślnie, chyba że jest poprzedzone spacją. Linie po pierwszym wierszu służą do wprowadzania danych przez użytkownika i nie są oceniane w tym programie.
Kolejny sposób na uzyskanie 9 znaków:
Pyth 1.0.5 , 4 znaki
Podczas gdy ostatnie zmiany w Pyth utrudniają generowanie liczb dwucyfrowych (zmiana, którą rozważam cofnąć), starsze wersje Pytha mają łatwe generowanie liczb dwucyfrowych, co w połączeniu z niejawnym drukowaniem i faktem, że wszystkie linie oprócz pierwszej są ignorowane, daje następujące rozwiązanie:
Drukuje 32,1,14,43.
źródło
Befunge, 16 lat
Objaśnienie: Cyfry od,
0
aby9
wypchnąć odpowiednią liczbę na stos,.
wyskakuje wartość ze stosu i drukuje ją jako liczbę całkowitą, a następnie@
kończy program.(testowane tutaj )
źródło
Piet, 49
Postanowiłem tylko użyć żółtych i czerwonych kolorów i postarać się, aby był mniej więcej symetryczny. Po obróceniu drukuje 0, 1, 2 lub 3. Wyjście z programu w Piet jest trudne i niestety zajmuje około połowy miejsca na zdjęciu.
źródło
GNU dc , 6 (3x2)
Myślę, że jest to najkrótsza odpowiedź, aby nie wymagać relaksacji reguły „mod 90 °”:
Wyjścia
0
,1
,2
albo3
na każdy obrót.Dla
0
,2
i3
rotacją pop
prostu wyskakuje i drukuje ostatni numer dosłownego zostały zepchnięte na stosie. W celu1
obrotuz
wypycha bieżącą głębokość stosu (1) na stos, a następniep
wyskakuje i drukuje go.źródło
311\n0p2
, gdzie\n
jest postać nowej linii. W przeciwnym razie byłoby to bez znaczenia w kontekście dc.GolfScript, 9 (3x3)
Coś w rodzaju nadużywania zasad.
}
Zdarza, aby zakończyć program, jeśli nie ma dopasowania{
, a zawartość stosu są drukowane na końcu programu.źródło
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
można to niezrównoważić. Niezła sztuczka.JavaScript, 4
Po uruchomieniu tego programu (lub rotacji tego programu) w konsoli javaScript, tylko ostatni wiersz jest oceniany i powtarzany w konsoli.
Więc:
Oto wszystkie podobne programy 2x2, które również działają:
Innymi słowy
gdzie a jest w [0,4,8], b jest w [3,7], c jest w [1,5,9], a d jest w [2,6]
źródło
CJam / GolfScript - 3 * 3
Średnik pokazuje poprzedni numer, dlatego drukowany jest tylko prawy dolny róg.
źródło
Aheui , 8
Ponieważ Aheui nie ma litery, która wypycha 1 na stos, postanowiłem wydrukować 0, 5, 2 i 3.
Objaśnienie: 바 i 반 wciskają odpowiednio 0 i 2 na stos i przesuwają kursor w prawo o jeden znak. 뷸 i 뷷 pchają odpowiednio 5 i 3 na stos i przesuwają kursor w dół o dwa znaki. 몽 wyskakuje i drukuje liczbę na stosie i przesuwa kursor o jeden znak w górę. 희 kończy program.
źródło
JavaScript
(Wprowadzony do konsoli przeglądarki, powłoki lub innej REPL, więc wynik jest drukowany)
Powinien działać dla każdego innego języka z wyrażeniami, nieistotnymi znakami nowej linii i automatycznym drukowaniem wyniku.
źródło
'2,3\n,0,\n1,0'
.Matlab / Octave -
144100Gra w golfa: 10 x 10 = 100
Alternatywne rozwiązanie: 15 x 15 = 225
źródło
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Potrzebujesz co najmniej trzech kropek na początku każdej linii, aby wskazać podział linii i zignorować pozostałe znaki.Perl 5x7 (35)
Trochę późno na imprezę. Samotnik
-
określa, która liczba jest drukowana.źródło
JavaScript, 3
Działa ... w bazie 7.
Wersja Base 9:
Wyjaśnienie
Gdy zostanie uruchomiony interaktywnie, np. Z konsoli debugowania, zostanie wyświetlona wartość ostatniej instrukcji / wyrażenia.
4 7 = 4 10 ≣ 0 (mod 4 )
412 7 = 205 10 ≣ 1 (mod 4 )
2 7 = 2 10 ≣ 2 (mod 4 )
214 7 = 109 10 ≣ 3 (mod 4 )
Podobne rozwiązania można znaleźć dla dowolnej nieparzystej bazy.
źródło
Befunge, 12 (6x2)
Udało mi się wprowadzić niewielką poprawę w stosunku do istniejącej odpowiedzi Befunge, wykorzystując w pełni dwuwymiarowy charakter Befunge i ustawiając ścieżkę kodu pionowo w dwóch orientacjach.
Wypróbuj online: od 0 , obrót 1 , obrót 2 , obrót 3 .
źródło
Cudowny, 7 * 14 = 98
źródło
Argh! / Aargh! (4 * 4 = 16)
O co chodziło z użyciem odpowiedniego narzędzia do pracy? Brak komentarzy (ogólnie w języku).
Cała rodzina programów (wygenerowana w J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
lub((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)obrócony raz:
obrócony dwukrotnie:
obrócony trzykrotnie:
Aby to wyjaśnić, najlepiej sprawdzić wersję „wciętą” (która działa również we wszystkich rotacjach):
Ta wersja pokazuje, że program składa się z 4 oddzielnych części, po jednej na każdy obrót.
h
- ustawić przepływ sterowania w lewop
- wydrukuj element w rastrze danych / kodu poniżejq
- wyjść z programuźródło
Pływak - 9 × 5 = 45
Drukuje 4, 1, 2 lub 3 na konsoli.
Zauważ, że „czarny” jest prawidłową instrukcją (NOP) i jest składniowy. Bez tego nie może znaleźć pozycji wyjściowej. Zatem wszystkie pozycje w prostokącie są zajęte.
źródło
Element, 2x3 = 6
Jest to poprawa w stosunku do naiwnego rozwiązania 3x3, które ma
`
pośrodku z liczbą po każdej stronie. Przypadek 0, pokazany powyżej, jest najbardziej interesujący, ponieważ*
służy do pomnożenia 3 przez nic, aby uzyskać 0. Poza tym, nie jest to takie skomplikowane.Jeśli uważasz, że przestrzeń jest niezręczna, możesz ją zastąpić dowolną inną postacią, z wyłączeniem
[]{}`_
.Dla porównania, oto pozostałe trzy obroty:
źródło
Chip, (2x5) 10
*
aktywuje wszystkie sąsiadujące elementy: północ, wschód, południe i zachód (źródło),~
jeśli nie jest aktywowane od zachodu, aktywuje wschodniego sąsiada (brama NIE) (nigdy tu nie aktywowana)t
przerywa wykonywanie po wydrukowaniu bieżącycha
zestawów bajtów bit zestawów0x01
wyjściowychb
bit0x02
wyjściae
ustawia bit0x10
wyjściaf
ustawia bit0x20
wyjścia+
jeśli jest aktywowany przez dowolnego sąsiada, uaktywnij wszystkich innych sąsiadów (drut)Chip wymaga
-w
flagi (aby umożliwić wykonanie bez danych wejściowych) lub danych wejściowych w celu uruchomienia.Reprodukcje
0
,1
,2
, lub3
w kodzie ASCII. Jeśli punkty kodowe0x00
do0x03
są pożądane, usunąće
if
, a następnie przenieść przestrzeń do wypełnienia luki.źródło
Japt , 3 * 1 = 3 bajty
Wypróbuj online: jak jest , obrócony raz , dwa razy , trzy razy .
Wyjścia odpowiednio 0, 5, 2, 11.
Zmienna
B
ma wartość 11 iNumber.z(other)
jest podziałem podłogi (wszyscy wyglądali najwyraźniej: p). W przypadku kodu wieloliniowego ostatni wiersz jest przekazywany do wyjścia, co jest tutaj po prostu stałą.2 * 2 = 4 bajty
Wypróbuj online: jak jest , obrócony raz , dwa razy , trzy razy .
Wyjścia odpowiednio 0, 21, 2, -1.
T
trzyma 0 iJ
trzyma -1.Sztuczka polega na tym, że jeśli dwa literały lub zmienne są umieszczone obok siebie, wstawiany jest przecinek, a wynik jest tylko ostatnim.
2 * 2 Rozwiązanie JS działa również w Japt.
źródło