To jest kod golfowy. W przypadku tego wyzwania zaakceptuję metodę (nie potrzebujesz pełnego programu), ale podpis metody wlicza się do liczby bajtów i chcę zobaczyć pełny podpis (nie lamdba). Dane wejściowe dla metody to tablica liczb całkowitych z 81 elementami. Wartością wyjściową / zwracaną z metody jest ciąg znaków reprezentujący tablicę jako tablicę ascii sudoku.
Jeśli używasz ezoterycznego języka lub czegoś, co absolutnie nie ma metod, możesz się dostosować, ale jeśli język w ogóle to obsługuje, chcę zobaczyć, że coś może być faktycznie podłączone do „prawdziwego” programu bez golfa, nawet jeśli metoda sama w sobie jest uciążliwa. Wymaganie nie ma na celu blokowania języków takich jak Jelly lub 05AB1E, ale ułatwienie językom takim jak Java tworzenia czegoś, co ma sens dla tej platformy.
Dla danych wejściowych wartości całkowite 1-9 powinny mieć oczywiste znaczenie. Wartość 0 należy zawsze interpretować jako pustą komórkę. Możesz również interpretować wszystko inne poza zakresem 1-9 jako pustą komórkę, ale nie jest to wymagane. Pozycjonowanie od tablicy do układanki rozpoczyna się w lewym górnym rogu i wypełnia każdy rząd od lewej do prawej przed przejściem do następnego rzędu.
W przypadku pudeł chcę podwójne linie na zewnątrz i między każdym regionem 3x3 oraz pojedyncze linie między innymi komórkami. Powinny być narysowane przy pomocy znaków do rysowania linii (jeśli twój format I / O reprezentuje ciągi jako sekwencję bajtów zamiast sekwencji znaków, powinieneś je przedstawić w znanym kodowaniu, takim jak UTF-8 lub strona kodowa 347).
W przypadku tego wyzwania NIE proszę o wygenerowanie układanki sudoku. To jest dane wejściowe dla funkcji. Ja NIE prośbą, aby rozwiązać zagadkę. Po prostu proszę cię o napisanie ciągu, aby „narysować” to, co otrzymałeś (w jak najmniejszej liczbie bajtów).
Przykładowe dane wejściowe:
Wartości dla tablicy:
{ 8, 5, 0, 0, 0, 2, 4, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 2, 3, 0, 5, 0, 0, 0, 9, 0, 0 ,0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 4, 0}
Wartości mogą wykorzystywać dowolny mechanizm naturalny dla Twojego języka: int [], ArrayList, sekwencję, krotkę, ciąg cyfr, cokolwiek, o ile masz wartość wejściową dla każdej komórki (brak map tylko dla zapełnionych komórek do pozycji ). Pamiętaj, że dane wejściowe są dostarczane ... nie są one częścią twojej liczby bajtów. Ale dane wejściowe mogą reprezentować dowolną łamigłówkę sudoku, a układanka może nawet nie mieć prawidłowego rozwiązania . Zakładasz, że puzzle można wydrukować. Na przykład nie dostaniesz czegoś z 82 elementami.
Możesz także założyć rozsądną czcionkę o stałej szerokości.
Odpowiadające wyniki:
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ ║ 8 │ 5 │ ║ │ │ 2 ║ 4 │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 7 │ 2 │ ║ │ │ ║ │ │ 9 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ │ 4 ║ │ │ ║ │ │ ║ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ ║ │ │ ║ 1 │ │ 7 ║ │ │ 2 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 3 │ │ 5 ║ │ │ ║ 9 │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ 4 │ ║ │ │ ║ │ │ ║ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ │ │ │ ║ │ 8 │ ║ │ 7 │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ 1 │ 7 ║ │ │ ║ │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ │ ║ │ 3 │ 6 ║ │ 4 │ ║ ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Odpowiedzi:
Python 3 , 232 bajty
Dzięki tym, którzy pomogli w golfa.
Szyfrowanie w ramach szyfrowania ...
Wypróbuj online!
Do gry w golfa.
źródło
i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]
oszczędzając 4 bajtyC (gcc) ,
398395291 bajtówZaoszczędzono 3 bajty, pracując w odwróconym łańcuchu, a 104 (!) Bajtów dzięki Leaky Nun.
Wypróbuj online!
C (gcc) , 395 bajtów
Zatrzymam to tutaj, aby było bardziej oczywiste, jak działa program.
Wypróbuj online!
Praca z Unicode w C jest ... kosztowna. Pobiera dane wejściowe jak
int*
pokazano w łączu i specyfikacji.Zobaczę, czy mogę zapisać bajty za pomocą magii liczb zamiast zakodować ciąg znaków.
źródło
PHP , 297 bajtów
Wypróbuj online!
Rozszerzony
używane funkcje dla obu wersji
vsprintf , strtr , str_pad , array_slice , array_chunk
PHP , 313 bajtów
Wypróbuj online!
źródło
T-SQL,
445437 bajtów (381 znaków)Wprowadzanie odbywa się za pomocą ciągu cyfr przechowywanych w kolumnie a wcześniej istniejącej tabeli t , zgodnie z zatwierdzonymi metodami .
Format i objaśnienie :
W górnym wierszu pętli otrzymuję kolejne 9 cyfr ciągu wejściowego z kolumny a istniejącej tabeli t .
Przekształcam ten ciąg cyfr na liczbę całkowitą i używam
FORMAT
funkcji .Net, aby wyświetlić je przy użyciu niestandardowego szablonu tekstowego'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'
.Następnie po prostu dołączam odpowiednią linię podziału i robię zamienniki oszczędzające bajty przed wyjściem.
Dane wyjściowe są wyświetlane w panelu wyników:
Wcześniej miałem dodatkowe zamienniki niektórych innych postaci rysunkowych, ale ostatecznie nie uratowały mnie bajty.
EDYCJA 1 : Zapisano 8 bajtów, zaczynając
@r
od zera zamiast 1 i usuwając niepotrzebne spacje.źródło
Retina ,
196167 bajtówWypróbuj online! Pobiera dane wejściowe jako ciąg długości 81. Objaśnienie: Ponieważ znaki rysujące w ramce kosztują trzy bajty, punkty kodu Unicode
═-╬
są reprezentowane w kodzie za pomocą=|#A-Z
(nie wszystkie znaki są używane, ale przyleganie do zakresów oszczędza bajty). Dodatkowo wiersze są kompresowane za pomocą#
znaków:a#bcd#e
rozwija się doabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe
.Wkładki
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
dla co trzeciego rzędu plus plus║
na początku każdej grupy 27.Wstawia
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
między innymi rzędami plus║
s na początku tych rzędów.Wstawia
║
s po każdych trzech cyfrach. Wszystkie║
s zostały już wstawione.Wstawia
|
s między wszystkimi pozostałymi parami cyfr. (Ten jest faktyczną postacią rysującą pole, a nie potokiem. Niestety znaki─│┼
mają zbyt odległe od siebie kody i znaki podwójnego pola, aby było warto podczas używania symboli zastępczych).Zmienia pierwszy wiersz na
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
(pozwala to zaoszczędzić 1 bajt bez dodawania pierwszego wiersza w pierwszej kolejności).Dodaje
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
po ostatnim wierszu.Rozwija się
a#bcd#e
najpierw doa#bc#d#bc#d#bc#e
, a następnie doa#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e
.Zmiany
#b#
nabbb
. To kończy dekompresję.Usuwa wszystkie wpisy zerowe i zastępuje symbole zastępcze znakami rysującymi ramki.
źródło
0
spacją.SOGL V0.12 ,
174172164160158 bajtówZbyt długie wyjaśnienie:
Uruchomiony program:
gdzie są wszystkie oprócz ostatniej linii
in the entire program replace occurrences of the last char of this line with the rest of this line
. To jest powód, dla którego połowa znaków była po prostu losowa ascii (ale uzyskanie użytecznych spacji, myślników i cudzysłowów zajęło trochę czasu).Wypróbuj tutaj!
Kod tłumacza online jest bardziej poprawny, ponieważ tabulatory nie działają z SE
-8 bajtów: zastąpienie brutalnej siły kompresowaniem całej tablicy, a następnie zastąpienie obcych znaków (do strony kodowej) ich punktami kodowymi. Wykonanie tego zajęło godzinę krócej niż stary program ...
-4 bajty: kompresowanie skompresowanego ciągu ...
-2 bajty: użycie zmiennej + łańcucha zamiast tablicy
źródło
JavaScript (ES6), 246 bajtów / 198 znaków
Dane wejściowe to tablica liczb całkowitych. Skończyło się na użyciu tych samych dwóch funkcji pomocnika, co odpowiedź Pythona Dziurawej Zakonnicy , więc idź tam.
W razie
function
potrzeby 263 bajtów / 215 znakówTest Snippet
Obsługiwane jest wprowadzanie 81 liczb (
1234
,1, 2, 3, 4
.[1 2 3 4]
Itd.). Najlepiej oglądać jako pełną stronę.źródło
Partia, 332 bajty
Potrzebuje konsoli w wersji CP437. Jeśli nie jest to domyślne, możesz to zmienić za pomocą
CHCP 437
polecenia, jeśli w konsoli ustawiono czcionki TrueType. (Będzie działać tylko z czcionkami rastrowymi, jeśli CP437 jest już domyślną stroną kodową.) Tak wygląda kod w CP437:źródło
Z pomysłami zebranymi na podstawie innych odpowiedzi:
C # (.NET Core) , 401 bajtów, 349 znaków
Nie golfowany:
Wypróbuj online!
Moja odpowiedź:
C # (.NET Core) ,
509 430418 bajtów, 328 znakówNie golfowany:
Wypróbuj online!
źródło
Chip , 3645 bajtów
... to nie literówka ...
Wypróbuj online! , w pewnym sensie. Wersja TIO zawiera odcięcie około jednej trzeciej wejścia (
t
po 4.oooooo
), więc powinno zakończyć się w mniej niż 60 sekund. Pełna wersja zajmuje około 1m25s na moim komputerze, a TIO wydaje się o połowę szybsze. Oznacza to również, że TIO pokazuje tylko pierwsze 7 linii wyjścia.Mój pierwszy projekt ważył 19758 bajtów i zabrał mnie około 8m30. Ostatecznym rozwiązaniem, przed golfem, było szybkie 5980 bajtów, zajmujące tylko 2m07s.
Więc jak to działa?
Zajmuje to ciąg 82 bajtów, 81 cyfr, po których następuje terminator.
\0
lub\n
nawet zrobi to inny numer. (Ta implementacja faktycznie sprawdza tylko pierwsze 81, ale wymaga co najmniej jeszcze jednego, ponieważ Chip skończy się, jeśli wyczerpałby swoje dane wejściowe. Jeśli jest to niedopuszczalne,-z
można użyć flagi , która skutecznie dodaje nieskończoną liczbę\0
bajtów do koniec danych wejściowych.) Skrócony kod TIO tak naprawdę nie dociera do wszystkich 81 bajtów, więc jest tam kwestia sporna.Sposób, w jaki to zaimplementowałem, polega tylko na niskich 4 bitach danych wejściowych, więc wszystko może być „łamigłówką” sudoku, od surowych danych binarnych po mniej znane dzieła Szekspira. Każdy znak, którego wszystkie 4 małe bity są zerowe, pojawi się jako spacja (specjalny przypadek), do którego odwzorowane są wszystkie pozostałe znaki
123456789:;<=>?
. (Tak więc kilka ostatnich nie jest cyframi, ale 10 nie jest poprawną liczbą w normalnym sudoku).W przypadku znaków rysujących ramkę tworzy UTF-8, co odpowiada 3 bajtom każdy.
Co z faktyczną implementacją?
Chip to język 3D inspirowany układami scalonymi. Ma przewody, bramki logiczne i komórki pamięci. Większość rzeczy odbywa się na płaszczyznach 2D, ale płaszczyzny te mogą być układane jeden na drugim. Tak zbudowano ten program.
Linie, które zaczynają się,
=
to separatory warstw. Następnie warstwy są układane w stosy, wyrównując górną i lewą stronę. Wo
'S służyć jako kołki, dzięki czemu sygnały przechodzą z jednej warstwy do drugiej.Każda warstwa tutaj ma swój cel, możesz myśleć o nich jak o funkcjach. Pierwsza warstwa kontroluje wszystko; „wywołuje” kolejno każdą z pozostałych warstw. Istnieje tutaj powtarzający się schemat od lewej do prawej. Ten wzór śledzi, który z 19 wierszy wydruku aktualnie drukujemy.
Druga warstwa jest raczej niewielka i ma bardzo drobną robotę. Ustawia
0x80
bit dla wszystkich linii wyjściowych, z wyjątkiem linii zawierających liczby.h
to element Chip, który odpowiada0x80
bitowi. (Dolny koniec alfabetuh
poprzeza
określenie wszystkich ośmiu bitów wyjściowych.)Warstwa trzecia to miejsce, w którym naprawdę docieramy do druku. Ta warstwa odpowiada za linię pierwszą. Wersja bez golfa ma osiem rzędów
x
„i)
”, odwzorowujących na 0 i 1 dla każdego z ośmiu bitów każdego bajtu. Możemy jednak wykorzystać wzorce w bitach, aby wykonać to samo zadanie w mniejszej liczbie rzędów.Warstwa czwarta jest bardzo podobna do trzeciej. Obsługuje poziome podwójne linie.
Warstwa piąta obsługuje ostatnią linię. Zauważ, że brakuje drutu wzdłuż góry, który mają inne warstwy. Jest tak, ponieważ nie musimy zwracać kontroli nad sekwencerem. Zamiast tego możemy po prostu zakończyć wykonywanie tutaj
t
.Warstwa szósta obsługuje poziome pojedyncze linie.
W warstwie siódmej drukowane są liczby. Jest „wywoływany” dla każdej dziewięciu linii numerycznych. Zużywa 9 bajtów danych wejściowych w ramach wykonywania.
źródło
JavaScript (ES6), 222 bajty
Używając krótkiej składni dla funkcji ES6 - 174 znaków zakodowanych w utf8, 222 bajty ( https://mothereff.in/byte-counter ). Korzystanie
function ...
wymaga 16 dodatkowych bajtów.Mniej golfa
źródło
Java (OpenJDK 8) , 279 bajtów
Wypróbuj online!
Do liczenia bajtów użyj CP-437, który jest natywnie obsługiwany przez Javę jako
IBM437
(najnowsze API) lubCp437
(starsze API); więc użyj systemu, który ma ten zestaw znaków, który ma ten zestaw znaków jako domyślny zestaw znaków.Ten kod jest zgodny z Javą 5 i nowszymi, ale został przetestowany tylko na Javie 8.
Wyjaśnienie
źródło
Tcl , 599 bajtów (295 znaków)
Bardzo naiwne podejście, ale musiałem to zrobić, nawet nie będąc zwycięzcą pod żadnym względem:
Wypróbuj online!
źródło