Rozważ kwadrat drukowanych znaków ASCII (punkty kodowe 0x20 do 0x7E) dla długości boku N , podobnie jak poniżej (tutaj, N = 6 ):
=\
g \
7
m+y "g
L ~
e> PHq
Wymagamy również, aby każdy wiersz i każda kolumna zawierały co najmniej 1 spację i 1 znak spacji . (Powyższy przykład to spełnia.)
Definiujemy negatyw takiego kwadratu, aby był kwadratem tego samego rozmiaru, w którym każda spacja jest zastępowana spacją i odwrotnie. Np. Następujący przykład byłby prawidłowym negatywem powyższego przykładu:
1234
a b cd
ZYXWV
!
{} [ ]
?
Wybór znaków spacji nie ma znaczenia (o ile pochodzą one z drukowanego zakresu ASCII).
Wyzwanie
Musisz napisać program z kwadratowym kodem źródłowym o długości boku N> 1 , który wypisuje swój negatyw na STDOUT. Przestrzenie końcowe mają być drukowane. Możesz wydrukować pojedynczy znak nowej linii lub nie.
Obowiązują również zwykłe reguły quine, więc nie wolno czytać własnego kodu źródłowego, bezpośrednio lub pośrednio. Podobnie nie wolno zakładać środowiska REPL, które automatycznie drukuje wartość każdego wprowadzonego wyrażenia.
Zwycięzcą jest program o najmniejszej długości boku N . W przypadku remisu wygrywa zgłoszenie z najmniejszą liczbą spacji w kodzie źródłowym. Jeśli nadal jest remis, wygrywa najwcześniejsza odpowiedź.
źródło
Odpowiedzi:
CJam, 4 x 4 (8 spacji)
Wypróbuj online w interpretatorze CJam .
Wynik
Jak to działa
L
wypycha pustą tablicę i_
wypycha jej kopię.Blok
wypycha ten blok na stos.
_
wypycha kopię bloku kodu ip
drukuje go, a następnie podaje wiersz.Na koniec interpreter drukuje wszystkie pozostałe elementy na stosie: dwie puste tablice, które nie wpływają na dane wyjściowe, oraz oryginalny blok kodu.
Alternatywna wersja
Wypróbuj online w interpretatorze CJam .
Wynik
Jak to działa
L
wypycha pustą tablicę i~
zrzuca ją. Stos jest znowu pusty.Blok
wypycha ten blok na stos.
_
wypycha kopię bloku i~
wykonuje kopię._
Wewnątrz kopii bloku pchnie kopię oryginalnego bloku, któryp
zostanie wydrukowana, a następnie wysuw.Na koniec interpreter drukuje pozostały element na stosie: oryginalny blok kodu.
źródło
Perl, 7 × 7 (42 bez spacji)
Wynik:
źródło
7
zrobiony z7
. :)CJam, 4X4 (
1210 spacji)Wynik:
Poprzednia wersja z 12 spacjami:
I wynik jest
Jak zauważył Martin, ta wersja ma
*
,4
,4
jako wynik;)
Wypróbuj online tutaj
źródło
Cudowny - 16x16
Sprawdź to tutaj! Wszystkie spacje jako puste miejsca, cylindryczna tablica i biblioteki zawierają wszystkie elementy.
Wynik
Wyjaśnienie
Są tutaj dwie płyty: główna (pokazana poniżej) i
ss
karta, która nie przyjmuje żadnych danych wejściowych i wysyła dwie spacje (0x20) do STDOUT.Pusta komórka jest równoważna a
..
, a wszystko po niej#
jest komentarzem.Każdy tyknięcie
ss
wysyła dwie spacje do STDOUT.Zielona ścieżka jest prostą pętlą, która generuje znak nowej linii (0x0A) na końcu każdego siódmego tiku.
Niebieska ścieżka wyświetli liczby (
Hp
drukuje marmur jako dwie cyfry szesnastkowe) obecne na wyjściu, na końcu każdego szóstego tyknięcia.Po wydrukowaniu
01
raz pętla kończy się i przesuwa się w dół czerwoną ścieżką, która powiela ten marmur.Jeden duplikat jest drukowany (drugi
01
), a drugi wysyłany czarną ścieżką, która kończy tablicę w!!
komórce. Ze względu na położenieHp
używane w tym ostatnim wydruku,01
pojawia się przed dwoma spacjami tego samego tika, a nie po zachowaniu każdego innegoHp
połączenia.źródło
Python - 11x11
Wynik
To dość niechlujne i nudne rozwiązanie, ale pomyślałem, że pokażę ...
To rozwiązanie wykorzystuje fakt, że jeśli znajdujesz się w parze nawiasów w Pythonie, możesz podzielić swój kod na kilka wierszy i dowolnie dodać spacje bez uzyskania
IndentationError
. Innym sposobem zrobienia czegoś takiego jest zakończenie linii odwrotnym ukośnikiem.źródło
Python - 7x7 (37 spacji)
Wynik
Wykorzystuje stare Pythona
%
operatora formatowania ciąg do pracy:+7
i-7
dbać o prawo / lewo usprawiedliwienia, a ostatnie miejsce, aby dopasować nawias zamykający dlaprint
w szczególności. Przygotowując ciąg formatu, mamy równieżźródło
JavaScript (9x9)
Wynik
Notatki
Stworzyłem i grałem w golfa (najlepiej jak potrafię) dla kwadratu o dowolnej przekątnej n:
zastępując liczby *** asdf *** stałymi w zależności od długości boku n, na przykład dla n = 6:
Ale mimo tego, że ten kod ma długość 46, nie mogłem uzyskać stałej przestrzeni do wyrównania ze spacją na przekątnej kodu, dopóki nie byłaby tak duża jak 9x9 z marnowaną linią (piąta)
Edycja: Zmieniono, aby dodać alert (). Przed:
źródło
CJam, 5x5, 12 spacji
Nie jestem zwycięzcą, ale chciałem dodać raczej niewielkie i rzadkie zgłoszenie, ponieważ większość odpowiedzi drukuje po przekątnej.
odbitki
Sprawdź to tutaj.
Ostatnie dwa znaki kodu nic nie rób, więc w rzeczywistości zawiera on tylko 10 bajtów prawdziwego kodu. W przypadku mniejszej siatki mogę nawet zmniejszyć ją o kolejne dwa bajty do 8, ale to nie pasuje do 3x3, a ten kod nie działa nawet dla rozmiarów siatki.
Jak to działa:
źródło
Befunge , 9x9
Nie mam pojęcia, dlaczego to zrobiłem. Zajęło sposób zbyt długo. Mam teraz ogromny ból głowy.
Wynik:
Jakieś wyjaśnienie
Kod używa
g
do odczytywania@
znaków z siatki „w locie” (a także ostatniej spacji, czyli@ / 2
) ip
do modyfikowania pętli w celu zapisania ostatniego wiersza wyjściowego.Każdy znak w kodzie jest używany w pewnym momencie, jako kod lub jako dane (
9
i@
na dwóch ostatnich wierszach).Zasadniczo musiałem zrobić wiele obejść, aby kod działał. Wskaźnik instrukcji wykonuje wiele przecięć podczas wykonywania, z których niektóre są przeskakiwane. (Nie mogłem użyć żadnej instrukcji dla różnych kierunków, ponieważ kolidowałyby. Nie ma NOP.) Gdzie indziej albo użyłem tej samej postaci, albo po prostu ją rozwiązałem (patrz
$:
środkowa część).Wykonałem też kilka kreatywnych prac na stosie:
n,0
. Potem muszę się zmniejszyćn
. Oczywistym rozwiązaniem byłoby$1-
, ale udało mi się go skrócić, używając!-
.0
. Następnie zorganizowałem zmieniacz kodów (20g46p7g46\p
), aby z niego korzystać0
, zamiast marnować 2 znaki$0
.źródło
!-
; to coś, co bym zrobił. Ciekawostka: w Funge-98z
jest NOP.z
nie znalazłem się na wiki i użyłem tego do kodowania, co oznaczało, że jakakolwiek komenda nie zmieniła kierunku IP. Prawie trzeba było refaktoryzować 70% kodu z powodu jednego miejsca, które powinno być NOP.Python 3, 8x8
Istnieje 50 znaków spacji i 14 spacji. Ostatnia linia ma jeden bezużyteczny znak, ale wszystko inne jest konieczne.
Wynik:
źródło
(a,*b,c)="12345"
...Rubinowy, 8x8
Wynik:
źródło
CJam, 5X5
I wynik jest
Byłem tak blisko rozwiązania 4X4.Zobacz moją drugą odpowiedź<sigh>
Wypróbuj online tutaj
źródło
C ++, 12x12
Edycja: Więc miałem trochę obsesji na punkcie tego wyzwania i udało mi się obniżyć go z 17 x 17 do 12 x 12. Trochę zajęło mi uświadomienie sobie, że mogę użyć go
/**/
jako separatora tokenów. Ten kod wykorzystuje fakt, że splajt linii nadal działa w Clang ze spacją po nim, chociaż daje ostrzeżenia i rujnuje kolorystykę kodu Xcode.Wynik:
źródło
Befunge-98 , 8x8 (56 spacji [11 nops])
Uwaga: W interesie dobrego sportowca-osoby, to czyta swoje własne źródło przez
'
, co dla niektórych jest oszustwem. Przeczytaj debatę tutaj .Program
Wynik
Wyjaśnienie
Wersja bez gry w golfa
(spacje i spacje są zastępowane literami „n” ze względu na czytelność).
To rozwiązanie opiera się na fakcie, że za pomocą indeksu [0, szerokość ^ 2) mod szerokość kwadratu może powiedzieć, czy jesteś na końcu rzędu, czy na przekątnej. Ponieważ wszystkie przestrzenie są umieszczone wzdłuż przekątnej, łatwo jest określić, kiedy należy wydrukować spację!
W pseudokodzie
Dyskusja
Jestem z tego bardzo dumny, choć żałuję, że nie mógłbym uczynić z każdej przestrzeni innej niż non-nop. Jestem również dumny z tego, że nie użyłem standardowej pułapki Befunge get-increment-put! Drukuje różne symbole non-space, ponieważ miałem na to miejsce i nie chciałem się nudzić.
Wypróbuj na Windowsie dzięki BefungeSharp !
źródło
CJam, 4 x 4 (8 spacji)
Wypróbuj online w interpretatorze CJam .
Wynik
Jak to działa
N
wypycha znak wiersza jako ciąg singletonu.a
zawija ten ciąg w tablicy.`
sprawdza wynik, tzn. wypycha ciąg znaków reprezentujący tablicę.Oto wynik:
S*
łączy wynikowy ciąg (tablicę znaków), oddzielając jego elementy spacjami. Innymi słowy, umieszcza znak spacji między wszystkimi parami sąsiednich znaków ciągu.Oto wynik:
N
popycha kolejny kanał.X$
kopiuje element stosu o indeksie 1 (licząc od góry), tj. ciąg wielu wierszy.Na koniec interpreter drukuje wszystkie elementy na stosie: oryginalny ciąg wieloliniowy, wysuw linii i kopię ciągu wieloliniowego.
źródło
SOGL V0.12 , 2x2 (2 spacje)
Wypróbuj tutaj!
Wynik
Wyjaśnienie
W SOGL wszystkie wiersze oprócz ostatniego zastępują wiersze - zamienia wszędzie w dalszym ciągu ostatni znak wiersza na wszystko przed nim. Więc pierwsza linia tutaj jest
replace space with 2 in the next line
.Następnie wykonywana jest następna linia
2╚
:2
popycha 2 i╚
tworzy przekątną wielkości 2.źródło
CBM BASIC v2.0 (8 × 8)
Ulepszenie w stosunku do mojej poprzedniej odpowiedzi , przy użyciu zupełnie innego podejścia:
Wynik:
źródło
Rubinowy,
8x87x7Wynik:
Poprzednia wersja, 8x8 z 20 spacjami:
Wynik:
źródło
Pushy , kwadrat 4x4
Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie:
Kod:
Wyjścia:
Wypróbuj online!
Ponieważ białe znaki nie mają znaczenia w Pushy, kod można łatwo ustawić tak, aby pasował do ujemnego wyniku. Rzeczywisty program wygląda następująco:
Ukośniki odwrotne rozpoczynają komentarz, więc końcowe
\o/
jest tylko po to, aby uzupełnić negatyw i wyglądać fajnie.Alternatywnie, dla tego samego wyniku, możemy mieć następujące rozwiązania:
źródło
Haskell, 10 × 10
Definiuje funkcję pomocniczą,
a ! b
która drukuje linię formularzabbbbbbbbba
, oraz funkcję rekurencyjną,n & c
która drukujen
linie formularza,ccccccccc␣
po której następuje jedna linia formularza␣␣␣␣␣␣␣␣␣c
.Używa
<$
(fmap const
ponownie) zakresu, aby powtórzyć znak. Należy pamiętać, że<$
jest dostępny tylko bez importu od GHC 7.10, który jest późniejszy niż to wyzwanie.Nie jestem całkowicie pewien, czy to sprawia, że to zgłoszenie jest niekonkurencyjne.Tutaj nie ma nic ekscytującego z wyborem układu lub algorytmu; Nie miałem zbyt wiele bajtów do stracenia i to po prostu szczęście, że można uzyskać przerwanie linii
putStrLn
tak, jak to zrobili.źródło
05AB1E , 3x3 (6 bajtów spacji )
Wynik:
Wypróbuj online.
Wyjaśnienie:
źródło
Perl, 6x6 (26 spacji)
Spojrzałem na to, przeglądając je i byłem pewien, że będzie jakieś rozwiązanie Perla mniejsze niż 7x7 ... Bardzo fajne wyzwanie! To rozwiązanie wymaga
-E
.Stosowanie:
Wynik:
źródło
CBM BASIC v2.0 (9 × 9)
Wynik:
źródło
C (gcc) ,
7x78x8EDYCJA: Poprzednia wersja miała nieprawidłowe zachowanie.
Wypróbuj online!
źródło
Galaretka , 4 x 4 (12 spacji)
Wypróbuj online!
Wynik:
To była niezła zabawa.
Jak to działa
Łatwa część: Galaretka ignoruje białe spacje (o ile używane są tylko wbudowane bajty).
Część trudna: Każda linia w Galaretce jest osobnym linkiem (lub funkcją), więc rozłożenie stałej instrukcji na wiele linii nie jest bardzo krótkie. Użycie literału łańcuchowego jest dobrym kandydatem, ale nie ma pojęcia, jak wygenerować przeczenie.
źródło