Jest to stycznie związane z moim dążeniem do wynalezienia ezoterycznego języka programowania .
Tabela liczb binarnych 0 .. 15 może być wykorzystana do implementacji Universal Binary Function przy użyciu operacji indeksowania. Biorąc pod uwagę dwa 1-bitowe wejścia X i Y, wszystkie 16 możliwych funkcji można zakodować w 4-bitowym kodzie operacyjnym.
X Y F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- - - - - - - - - - - - - - - - - -
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
- - - - - - - - -
0 ~X ~Y ^ & Y X | 1
ZERO NOT-Y AND OR
NOT-X XOR ONE
Tak więc ten zestaw 16 funkcji można zastosować do wejść binarnych jako funkcję
U (f, x, y): (f >> ((x << 1) | y)) i 1 ,
lub
U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,
lub z indeksowaniem lub partycjonowaniem macierzy.
Przydatna będzie znajomość najbardziej kompaktowego sposobu reprezentowania lub generowania takiej tabeli wartości dla dowolnych języków, które można zbudować na tego typu operacji binarnej.
Cel:
Wygeneruj ten dokładny wynik tekstowy:
0101010101010101
0011001100110011
0000111100001111
0000000011111111
Otóż to! Zwycięża najkrótszy kod.
źródło
Odpowiedzi:
J, 10 (13?) Znaków
Lista numerów:
do binarnego:
Transponować:
Rewers:
Czy musimy usunąć spacje? Patrząc na drugą odpowiedź J, wydaje się, że to robimy, więc będziemy musieli dodać 3 znaki i pożyczyć odpowiedź
1":
od Jana .źródło
Python 2, 40
źródło
APL (14)
Zakładając
⎕IO=0
(to ustawienie):Wyjaśnienie:
⍳16
: liczby [0,16)(4⍴2)⊤
: zakoduj każdy numer w bazie 2 za pomocą 4 cyfr⊖
: rewers poziomy (więc MSB kończy się na górze)⎕D[
...]
: wybierz te wartości, z⎕D
których jest ciąg0123456789
. (Macierz numeryczna jest wyświetlana ze spacjami między wartościami, matryca znaków nie. Więc to konwertuje każdy bit numeryczny na jeden z znaków'0' '1'
).źródło
(4⍴2)⊤
→2⊥⍣¯1
Galaretka ,
427 bajtów (niekonkurencyjna)Wypróbuj online!
Dzięki Dennisowi za pomoc. Oto pierwsza wiadomość, tutaj ostatnia (odbyły się również inne dyskusje). Z jego pomocą najwyraźniej (prawie) zrootowałem wynik.
źródło
/// , 51 bajtów
Wypróbuj online
źródło
GolfScript (
18 1715 znaków)(Dzięki dzięki Howardowi)
Nie rozumiem, dlaczego 10-char
nie działa; Podejrzewam, że błąd standardowego interpretera powoduje nieobsługiwane typy na stosie.
Alternatywą dla 18 znaków, które w pełni rozumiem, jest:
Bardziej matematyczne podejście jest nieco dłuższe, przy 28 znakach:
Wiele z nich dotyczy konwersji podstawowej i zerowania. Bez nich spada do 19 znaków,
z wyjściem
źródło
16,zip{n}/
działać?16,zip{','-~n}%
zip
powinno to zwrócić tablicę tablic, ale tak naprawdę wydaje się, że zwraca tablicę tablic Ruby (to moje najlepsze przypuszczenie). Niezależnie od elementów, zastosowanie do nich `` `` nie wpływa na sposób drukowania, co różni się od 4 typów danych GolfScript. Masz rację, która','-
wydaje się zamieniać je w normalne tablice: niezła sztuczka.CJam - 16
Równoważny kod Java (jako wyjaśnienie):
źródło
JavaScript (ECMA6), 67
Aby z tego skorzystać, zadzwoń
Bitshift!
A także XOR i trochę rekurencji.
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że jeśli weźmiemy jakąkolwiek linię i przesuniemy ją (# ciągłych zer) / 2 w lewo, otrzymamy niezły XOR, aby uzyskać następną linię w górę.
Na przykład,
XOR te bitowe dają nam
która jest następną linią w górę (linia 3).
Stosując ten sam proces dla linii 3, przesuń 2 w lewo i otrzymamy ...
XOR'ed daje
czyli wiersz 2.
Zauważ, że kwota, którą przesuwamy za każdym razem o połowę.
Teraz po prostu wywołujemy tę funkcję rekurencyjnie, z 2 argumentami. Wartość całkowita tej linii oraz N, czyli o ile musimy przesunąć. Kiedy wykonujemy rekurencję, po prostu podaj przesuniętą wartość XOR i n / 2.
polega na wstawianiu zer na początku każdej linii, ponieważ toString usuwa początkowe 0.
źródło
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 znaków
i.16
to lista 0..152^i.4
jest listą (1,2,4,8)%~/
tworzy tabelę podziałów, w której lewy argument tworzy wiersze, ale jest prawym argumentem do dzielenia2|
oblicza resztę po podzieleniu [każdej komórki] przez dwa<.
podłogi o wartości 0 lub 11":
formatuje tabelę za pomocą jednego znaku na komórkęźródło
floor
nie powinno to być konieczne. Domena2|
jest już 0 lub 1, prawda?|
działa na pływakach .2|3.25
jest1.25
. Nie chcemy tego.GolfScript, 19 znaków
Kolejne podejście do GolfScript
źródło
Rubin (44)
Nudne i długie: wystarczy wydrukować binarne reprezentacje liczb wypełnione zerami.
źródło
Postscriptum
108177126777470Odwrócono wartości dla prostszej metody mod- off.
151131119Stosując podejście bardziej APL . edycja: zastąpiono przerywanie ciągów i kompresowanie tablic indeksowaniem i pętlami for.
Zębaty:
Reimplementacja funkcji użytych w zwycięskiej odpowiedzi J prowadzi do tego (z dużą ilością kodu pomocniczego ).
i
tutaj jest wektor oparty na 1, opisany w elementarnych funkcjach Iversona , stąd-1 ... +
do wytworzenia0 .. 15
.źródło
Perl (36 + 1)
+1 za
say
, jak zwykle. podwójne0
nie jest literówką :)źródło
say
.perl -e'...'
jest standardem i wymaga toperl -E'...'
bez zwiększania liczby bajtów. W każdym razie, myślę, że zdecydowano się na Code Golf Meta , że-M5.01
jest wolny.JavaScript (ECMA6), 108
Spróbuj tutaj innego podejścia. Mimo że zachęcano mnie do korzystania z operatorów binarnych, pozwoliłem sobie na przesłanie tego rozwiązania, ponieważ wyzwaniem jest także złożoność kolmogorowa i zastanawiałem się - jak mogę zmniejszyć ilość kodu reprezentującego te wartości ...? Bazy .
(Podział linii dla wygody).
Szkoda, że musiałem zadzierać z wypełnianiem zerami wiodącymi, ale celem tego kodu jest po prostu reprezentowanie docelowego wyniku binarnego w bazie 36, które są dokładnie tymi
gut, a43, 2z3, 73
wartościami.Uwaga: zdaję sobie sprawę, że nie będzie blisko zwycięskiej odpowiedzi, ale tylko ze względu na pomysł ...
źródło
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. To podejście wykorzystuje znaki nowej linii zamiast czterechalert()
sekund.Szpary , 44 bajty
Odpowiedź Cedrica została przeniesiona do Sprects.
źródło
MATL ( niekonkurencyjny ), 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
CJam ( niekonkurencyjny ),
109 bajtówDzięki @Dennis za 1 bajt off!
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
5852 bajtówTworzy ciąg rekurencyjnie.
Jak to działa
Ta rekurencja opiera się na fakcie, że wzorzec składa się z pionowej reprezentacji binarnej skórek od 0x0 do 0xF:
Dlatego, każde stanowisko (X, Y), w układ ten może być wyrażony jako Y-tego bitu X:
X & (1 << Y)
. Możemy również izolowanie tego bitu z:(X >> Y) & 1
. Zamiast śledzenie X i Y, możemy iterate na pojedynczej zmiennejn
w zakresie od 0 do 63. Tak więc, wzór przyjmuje postać:(n >> (n >> 4)) & 1
. W rzeczywistości łatwiej jest iterować od 63 do 0, więc łańcuch jest budowany w odwrotnej kolejności. Innymi słowy, znak n-1 jest dołączany na lewo od znaku n .Na marginesie, rekurencja nie przynosi tu niczego oprócz krótszego kodu.
Bez podziałów liniowych kod ma długość 35 bajtów:
Potrzebujemy jeszcze 17 bajtów, aby wstawić podziały wierszy. Można to skrócić do 14 bajtów, jeśli dopuszczalny jest wiodący podział linii.
Próbny
źródło
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 bajty).replace(/.{16}/g,"$0\n")
ma tę samą długość. SzkodaBash + coreutils, 65 bajtów
Nie najkrótszy, ale też nie najdłuższy:
(Ostatnia postać to spacja)
Wypróbuj online .
źródło
NARS2000 APL, 22
Wywodzi się z odpowiedzi APL marinusa, która nie działa na NARS2000.
Generuj wektor
Zmień na zero
Wygeneruj kształt do kodowania
Kodować
Dostosuj do indeksowania 1
Odwróć oś pierwotną
Indeks
źródło
C, 73 znaki
Jest to tylko ogólne rozwiązanie do wysyłania 64 bitów w czterech 16-bitowych blokach; wystarczy zmienić liczbę,
0xFF0F0F33335555
aby wyprowadzić inną sekwencję bitów.uproszczony i nie golfowy:
źródło
Haskell, 73
Yikes, 73 znaki! Nie mogę, na miłość boską, zmniejszyć tego.
Naprawdę smutne jest to, że jeśli chcesz echa wyniku za pomocą bash, potrzebujesz tylko 74 znaków.
źródło
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
źródło
inca2 ,
332724Jest to oparte na odpowiedzi Jana Dvoraka . inca2 jest w stanie wykonać to od wczorajszych poprawek błędów. Technicznie nieważne, ponieważ język został wymyślony po pytaniu, ale wymyślenie języka było częścią mojego celu postawienia pytania. Oto niektóre zwroty wdzięczności za inne odpowiedzi. :)
Wyjaśnienie:
Niektóre nawiasy powinny być niepotrzebne, ale najwyraźniej pozostały pewne problemy z moją interpretacją gramatyki. A „ravel => mapa => zmiana kształtu” jest naprawdę niezdarna: mapa musi być mądrzejsza. Edycja: poprawki błędów pozwalają na eliminację parens.
Faktyczne przekształcenie podstawy w osobną funkcję
N:x|y%.x^~1+[]/x.y
daje to19Wersja 16 znaków.Mimo że i tak tutaj oszukuję, poszedłem do przodu i uczyniłem to funkcją wbudowaną. Ale chociaż jest to funkcja niladyczna (nie wymagająca argumentu), nie ma wsparcia dla funkcji niladycznych i musi być dostarczona z fikcyjnym argumentem.
inca2, 2
źródło
Pyth 24/26
Najkrótszą metodą była odpowiedź grc przetłumaczona na Pyth, która moim zdaniem była tania, więc zrobiłem własną metodę:
Mój: 26 znaków
grc's: 24 znaki
źródło
C ++ 130
Konwertuje liczbę szesnastkową na dwójkową
źródło
Haskell (Lambdabot), 47 bajtów
Trochę cheaty, ponieważ używa transpozycji z Data.List i replicateM z Control.Monad, jednak oba są ładowane domyślnie z Lambdabot.
Jestem też pewien, że jest miejsce na ulepszenia, chciałem tylko podzielić się tym pomysłem
źródło
Julia (39 bajtów)
Drugi scenariusz, który napisałem w Julii, muszę przyznać, że lubię Julię, ona jest ładną bestią.
Zwroty
Wyjaśnienie:
bin(x,4)
- Konwertuj liczbę całkowitą na binarną z dopełnieniem do 4 znaków.collect(_)
- Podziel ciąg znaków na tablicę znaków.map(x->_,0:15)
- Zrób to dla pierwszych 16 cyfr z zakresu.hcat(_...)
- Ikona i konkatenacja pozioma w matrycę.źródło
do
8377767471Całkiem proste.
źródło
?:
, i kolejny oszczędzasz 1, przesuwając a++
.main
naf
. lolR,
5341 bajtówTłumaczenie odpowiedzi python @ grc. Ogolił 12 bajtów z oryginalnego tłumaczenia dzięki zastosowaniu
rep()
„seach
ilength
argumentów (i częściowego dopasowania argument) i pamiętając, że0:1
jest równoważnyc(0,1)
.Możesz także spróbować przetłumaczyć odpowiedź J @ Garetha, mniej więcej tak (34 bajty):
Wykorzystuje jednak funkcję, która nie jest częścią podstawy R, i wyświetla matrycę, którą trudno sformatować w dokładnie wydrukowany tekst, jak w specyfikacji.
źródło