Zadanie
Biorąc pod uwagę ciąg wejściowy jednego lub więcej znaków ASCII, których punkty kodowe mają wartość od 0 do 128 (wyłączne), wykonaj następujące czynności:
- Konwertuj każdy znak na 7-bitowy kod ASCII (jeśli kod ASCII jest mniejszy niż 7 bitów, wstaw początkowe bity zerowe)
- Połącz wszystkie bity (powoduje to, że
7*n
bitn
jest liczbą znaków) - Dla każdego bitu w tym strumieniu bitów wydrukuj 1, jeśli różni się od poprzedniego bitu, i wydrukuj 0 w przeciwnym razie. Pierwszy bit wyjściowy to zawsze 1.
Przykład
Wejście:
Hi
Wynik:
11011001011101
Wyjaśnienie:
Ciąg „Hi” ma kody ASCII
72 105
które w bitach to:
1001000 1101001
I wskaźniki bitów przejścia:
11011001011101
To jest kod golfowy. Wygrywa najniższa liczba bajtów.
Przypadki testowe
Przypadek testowy 1:
Hello World!
110110010101110011010101101010110001110000111110000110000001011101101010101100110001
Przypadek testowy 2:
%% COMMENT %%
1110111111011111100001100010010100001010110101011010011101010011111110011000001101111110111
Przypadek testowy 3 (kredyt dla Luisa Mendo):
##
11100101110010
Gratulacje dla Luisa Mendo za najkrótsze rozwiązanie z 9 bajtami w MATL!
##
(wiodący0
bit; niektóre odpowiedzi obecnie nie udają się z tego powodu)Odpowiedzi:
MATL , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 58 bajtów
Wypróbuj online!
źródło
Japt
-P
, 11 bajtówKorzysta z faktu, że spacje można wymusić
0
w JavaScript podczas próby wykonania na nim operacji matematycznej lub, w tym przypadku, bitowej.Wypróbuj lub uruchom wszystkie przypadki testowe
źródło
0100000
. Również znak% (37) byłby0100101
CJam , 21 bajtów
Wypróbuj online!
Wyjaśnienie
Pokazuje stos z przykładowym wejściem
5
:Aby zobaczyć, czy bit różni się od poprzedniego, wykonujemy wektor (pod względem elementu) xor między tablicą bitów a tablicą bitów bez pierwszego elementu. Usuwamy również ostatni bit wyniku, ponieważ zawsze jest to ostatni bit dłuższej tablicy bez zmian.
źródło
APL (Dyalog Unicode) , 16 bajtów SBCS
Pełny program Monituje o ciąg znaków ze standardowego wejścia.
Wypróbuj online!
⍞
monit o wprowadzenie („cytat w konsoli”)11⎕DR¨
zmień każdy znak na bit-Boolean D ata R reprezentacja1↓¨
upuść pierwszy bit z każdego∊
ε nlist (spłaszczyć)2≠/
różnica par1,
przygotuj jedenźródło
Galaretka , 12 bajtów
Wypróbuj online!
źródło
Węgiel , 25 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Konwertuj wszystkie znaki na binarne i wstaw je na długość 7, a następnie wydrukuj, ale pozostaw kursor nad ostatnią cyfrą.
Powtarzaj, aż kursor znajdzie się nad pierwszą cyfrą.
Oblicz, czy cyfry są różne, i zastąp każdą cyfrę różnicą.
Zastąp pierwszą cyfrę znakiem
1
.źródło
PowerShell ,
735649 bajtówWypróbuj online!
-17 bajtów dzięki mazzy :)
źródło
Rubin
-p
,6857 bajtów-11 bajtów przez bezwstydne kradzież metody stosowanej w rozwiązaniu Python xnor .
Wypróbuj online!
Oryginalne rozwiązanie:
Wypróbuj online!
źródło
Oktawa ,
3630 bajtówNapraw dzięki Luis Mendo
-2 bajty dzięki Sanchises
Wypróbuj online!
źródło
de2bi
.Python 2 , 104 bajty
Wypróbuj online!
Szybkie dźgnięcie w to.
źródło
a*128+ord(c)
! Ale nie jestreduce
ilambda
niby kosztowne?Dart ,
213168 bajtówPoprzedni jednowarstwowy
Wypróbuj online!
Ta gadatliwość i brak łatwych do wbudowania naprawdę zabija to. Nadal jednak udało mi się wyciągnąć jedną wkładkę.
źródło
Stax ,
1312 bajtówUruchom i debuguj
Jeśli jest pewne, że wszystkie znaki wejściowe mają ustawiony 7. bit, jak zakładają niektóre odpowiedzi, można to zrobić w 10 bajtach
źródło
Kotlin , 182 bajty
Wypróbuj online!
Mam nadzieję, że uda mi się to wkrótce poprawić, wydaje mi się, że musi być kilka miejsc do poprawy, ale nie mogę teraz myśleć
źródło
Perl 5
-p
, 60 bajtówWypróbuj online!
źródło
C (gcc (MinGW)), 90 bajtów
Wymaga zapewnienia kompilatora
itoa()
.źródło
Rubinowy
-p
, 50 bajtówWypróbuj online!
Wyjaśnienie
Pierwszy wiersz, taki sam jak odpowiedź Value Ink :
Druga linia:
W Ruby można użyć interpolacji w literały wyrażenia regularnego, np
/Hello #{name}/
, a dla zmiennych, które rozpoczynają się$
lub@
można pominąć nawiasy klamrowe, więc jeśli na przykład$&
jest"0"
to grawlixy/#$&$/
staje/0$/
.źródło
K (ngn / k) ,
913 bajtówRozwiązanie:
Wypróbuj online!
Wyjaśnienie:
Uwagi:
źródło
#
na przykład to się nie udaje (dane wyjściowe mają tylko 6 bitów)Emojicode , 263 bajty
Wypróbuj online tutaj.
Nie golfowany:
źródło
JavaScript (V8) ,
15095 bajtów-55 dzięki @dana
Wypróbuj online!
źródło
Python3.8 , 72 bajty
Rozwiązanie:
Wyjaśnienie:
Odkąd Python 3.8 wprowadził wyrażenia przypisania (zamiast standardowych instrukcji przypisania), chciałem używać ich w zrozumieniu listy, która musi zapamiętać ostatni element. To nie jest najlepszy sposób, aby to zrobić, ale pokazuje ciekawą metodę użycia wyrażenia przypisania.
Kod tworzy funkcję lambda, która pobiera wymagany argument, którym jest ciąg znaków do konwersji. Po wywołaniu funkcja działa w następujący sposób. Każdy znak w a jest konwertowany na kod znakowy, do którego dodano 128, aby radzić sobie ze znakami 6-bitowymi (reprezentacja binarna zawsze będzie miała 8 bitów i możemy odciąć pierwszy bit). Liczba ta jest konwertowana na binarną, a nagłówek (0x) i początkowa 1 z dodania 128 są odcinane. Te nowe ciągi są następnie łączone w jeden większy ciąg.
Dla każdego znaku w tym nowym ciągu (który zawiera skonkatenowaną 7-bitową reprezentację tekstu) sprawdza się, czy znak jest taki sam jak poprzedni znak. Co dzieje się z pierwszą postacią? Pierwszym znakiem wynikowym zawsze powinna być „1”, więc musimy tylko upewnić się, że cokolwiek w zmiennej ostatniego znaku nie jest ani „1”, ani „0”. Robimy to poprzez ponowne użycie oryginalnego parametru, gdy już go nie używamy. Może to stanowić problem, jeśli oryginalny ciąg był pojedynczym „0” (pojedyncze „1” po prostu działa), ale to zignorujemy.
Podczas porównania poprzedni znak był oceniany jako pierwszy, więc kiedy używamy wyrażenia przypisania, aby ustawić zmienną poprzedniego znaku na bieżący znak, nie wpływa to na ocenę wyrażeń porównania.
Porównanie daje albo Prawdę, albo Fałsz, które mogą być również użyte jako 1 lub 0 odpowiednio w Pythonie, więc są one używane do wyszukiwania „1” lub „0” w ciągu
źródło
bin(ord(i)+128)[3:]
->f"{ord(i):07b}"
Tcl ,
215167140 bajtówWypróbuj online!
Używa przełączania jeden po drugim i wyłączności lub do wykrywania przejść. Przenosi lsb bieżącego znaku do msb następnego znaku. Łączy dane wyjściowe dla każdego znaku, dołączając do listy zwróconej przez lmap.
Wykorzystuje lambdas z domyślnymi argumentami do zapisywania bajtów podczas inicjalizacji i powtarzanych poleceń.
W dużym stopniu zależy od kolejności działania. Działa na pusty ciąg.
źródło
05AB1E (starsza wersja) , 12 bajtów
Używa starszej wersji 05AB1E, ponieważ
j
niejawnie łączy ze sobą ciągi znaków, co wymaga jawnego umieszczeniaJ
poj
nowej wersji 05AB1E.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Haskell , 137 bajtów
Wypróbuj online!
Największym problemem tutaj jest konwersja wartości logicznych (wynik XOR) na „0” / „1”.
źródło
Python 3 ,
8884 bajtówWypróbuj online!
Uważam, że zadań należy unikać, ale nie mogłem wymyślić żadnego sposobu, aby to zrobić.
Aktualizacja:
źródło
PHP , 90 bajtów
Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 80 bajtów
Wypróbuj online!
źródło
JavaScript (V8) , 73 bajty
Wypróbuj online!
źródło