Twoim zadaniem, jeśli chcesz to zaakceptować, jest napisanie programu, który wyświetli własny kod źródłowy w binarnej reprezentacji UTF-8 .
Zasady
Źródło musi mieć co najmniej 1 bajt.
Twój program nie może przyjmować danych wejściowych (lub mieć nieużywane, puste dane wejściowe).
Dane wyjściowe mogą być w dowolnym dogodnym formacie.
Opcjonalny końcowy znak nowej linii jest dozwolony.
Zauważ, że jeden bajt ma 8 bitów, a długość binarnej reprezentacji UTF-8 jest koniecznie wielokrotnością 8.
To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Standardowe luki są zabronione.
Przykład
Powiedzmy, że twój kod źródłowy to Aä$$€h
odpowiadająca mu reprezentacja binarna UTF-8 010000011100001110100100001001000010010011100010100000101010110001101000
.
Jeśli uruchomię, Aä$$€h
wyjście musi być 010000011100001110100100001001000010010011100010100000101010110001101000
.
A --> 01000001
ä --> 1100001110100100
$ --> 00100100
$ --> 00100100
€ --> 111000101000001010101100
h --> 01101000
Aä$$€h --> 010000011100001110100100001001000010010011100010100000101010110001101000
01011110
lub0010011100100010
w UTF-8 (wyglądają dość podobnie:^
vs∧
)01111100
i0010001100100010
koduj|
i∣
.Odpowiedzi:
V , 28 (lub 16?) Latin 1 bajtów (35 UTF-8 bajtów)
Wypróbuj online!
Hexdump (po łacinie 1):
Dane wyjściowe (binarna reprezentacja tego samego kodu w UTF-8, a nie Latin 1):
Wyjaśnienie:
Lub...
V , 16 bajtów
Wypróbuj online!
Wynik:
OP powiedział:
Dane wyjściowe są w znacznie wygodniejszym formacie dla V: P (ale nie jestem pewien, czy to rozszerza reguły)
źródło
CJam , 20 bajtów
Wypróbuj online!
Zaskoczony wygraną CJam! zobaczymy, jak długo to potrwa ...
źródło
05AB1E , 105 bajtów
05AB1E nie ma wbudowanych funkcji konwersji UTF-8, więc muszę zrobić wszystko ręcznie .
Wypróbuj online lub sprawdź, czy jest to quine .
Wyjaśnienie:
quine -part:
Najkrótsza quine dla 05AB1E to:
0"D34çý"D34çý
( 14 bajtów ) zapewniona przez @OliverNi . Moja odpowiedź wykorzystuje zmodyfikowaną wersję tego Quine'a dodając u...
tutaj:0"D34çý..."D34çý...
. Krótkie wyjaśnienie tego quinu:Część wyzwania:
Teraz część kodu wyzwania. Jak wspomniałem na górze, 05AB1E nie ma wbudowanych funkcji konwersji UTF-8, więc muszę to zrobić ręcznie. Użyłem tego źródła jako odniesienia do tego, jak to zrobić: Ręczne przekształcanie punktów kodowych Unicode w UTF-8 i UTF-16 . Oto krótkie podsumowanie tego dotyczące konwersji znaków Unicode na UTF-8:
"dЖ丽"
Staje się[100,1046,20029]
)[100,1046,20029]
Staje się["1100100","10000010110","100111000111101"]
)0x00000000 - 0x0000007F
(0-127):0xxxxxxx
0x00000080 - 0x000007FF
(128-2047):110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF
(2048-65535):1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF
(65536-2097151):11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Istnieją również zakresy dla 5 lub 6 bajtów, ale na razie pomińmy je.
Postać
d
będzie w pierwszym zakresie, więc 1 bajt w UTF-8; znakЖ
znajduje się w drugim zakresie, więc 2 bajty w UTF-8; a znak丽
należy do trzeciego zakresu, więc 3 bajty w UTF-8.x
We wzorcu za to są wypełnione binarnego tych znaków, od prawej do lewej. Tak więcd
(1100100
) ze wzorem0xxxxxxx
staje się01100100
;Ж
(10000010110
) z wzór110xxxxx 10xxxxxx
staje11010000 10010110
; i丽
(100111000111101
) o wzorze1110xxxx 10xxxxxx 10xxxxxx
się1110x100 10111000 10111101
, po czym pozostałex
są zastępowane0
:11100100 10111000 10111101
.Takie podejście zastosowałem również w moim kodzie. Zamiast sprawdzać rzeczywiste zakresy, po prostu patrzę na długość
x
pliku binarnego i porównuję go z ilością wzorców, ponieważ pozwala to zaoszczędzić kilka bajtów.Zobacz moją odpowiedź 05AB1E (sekcje Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego tak
•Xó•18в
jest[1,8,12,17]
.źródło
JavaScript (Node.js) , 60 bajtów
-15 bajtów od @Neil i @Shaggy
Wypróbuj online!
źródło
padStart(8,0)
oszczędza 2 bajty.map
i porzucić,join
aby wyprowadzić tablicę bitówRdza , 187 bajtów
Wypróbuj online!
źródło
Perl 6 , 46 bajtów
Wypróbuj online!
Standardowy quine z
.fmt("%08b",'')
formatuje listę wartości porządkowych na binarne o długości 8 i łączy się z pustym łańcuchem.źródło
Perl 5, 42 bajtów
TIO
źródło
Java 10,
339308265227225186184 bajtów-8 bajtów dzięki @NahuelFouilleul usuwających niepotrzebne
&255
(i dodatkowe -35 za zwrócenie mojej uwagi, że pełna specyfikacja programu wyzwania została odwołana i funkcja jest teraz dozwolona ..)-41 bajtów dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
quine -part:
var s
zawiera niesformatowany kod źródłowy String%s
służy do umieszczenia tego ciągu w sobies.format(...)
%c
,%1$c
I34
są wykorzystywane do formatowania cudzysłowia ("
)s.format(s,34,s)
łączy to wszystko razemCzęść wyzwania:
źródło
c&255
nie jest potrzebne&255
jednak nie potrzebować, ponieważ nie używamy żadnych znaków spoza ASCII, dzięki!BigInteger
że jestem dość krótki do konwersji na ciągi binarne. I 2 więcej bajtów, zmieniającreturn'0'+
sięreturn 0+
. Hmm, dlaczego to prowadzenie jest0
niezbędne? Myli mnie to, że wszystkie wewnętrzne ciągi binarne mają tę wiodącą0
funkcję, ale ta pierwsza nie jest używana, gdyBigInteger.toString(2)
...Python 2 ,
6867 bajtówWypróbuj online!
Modyfikacja tej odpowiedzi
-1 bajtów poprzez usunięcie spacji po 'in' (dzięki @mdahmoune)
źródło
in
'%08b'%ord(i)
zamiastbin(256|ord(i))[3:]
, ale z jakiegoś powodu to nie zadziałałoR ,
138114 bajtówWypróbuj online!
Wykorzystuje zdolność R do analizy funkcji do ich reprezentacji postaci. Te
rev
są potrzebne, ponieważrawToBits
na pierwszym miejscu stawia najmniej znaczący bit.as.integer
jest potrzebne, ponieważ w przeciwnym razie bity są wyświetlane z wiodącym zerem.Edytowane, gdy zdałem sobie sprawę, że dozwolone są dowolne wygodne wyniki. Został również wyłączony przez jeden na oryginalnej liczbie bajtów.
źródło
C # (interaktywny kompilator Visual C #) , 221 bajtów
Wypróbuj online!
C # (interaktywny kompilator Visual C #) z flagą
/u:System.String
, 193 bajtówWypróbuj online!
źródło
Narzędzia Bash + GNU, 48 bajtów
TIO
źródło