Powiązane z: Make a; # interpreter
W powyższym powiązanym wyzwaniu zadaniem było stworzenie tłumacza dla ezoterycznego języka ;#
.
;#
język
Język ma dokładnie dwie komendy: ;
i #
(wszystkie inne znaki są ignorowane przez tłumacza):
;
: Zwiększ akumulator
#
: Zmoduluj akumulator o 127, wydrukuj odpowiedni znak ASCII i zresetuj akumulator do 0.
Wyzwanie
Ponieważ jestem leniwy, ale nadal chcę testować więcej przypadków testowych, potrzebuję programu lub funkcji, która konwertuje zwykły tekst na ;#
kod.
Wkład
Dane wejściowe są ciągiem, traktowanym jako argument lub przez stdin. Będzie zawierać tylko drukowalne znaki ASCII i znaki nowej linii.
Wydajność
Dane wyjściowe to wygenerowany ;#
program, zwracając lub drukując na standardowe wyjście. Tak długo, jak program jest poprawny, może zawierać nadmiar znaków innych niż #
i ;
wszystkie inne znaki są ignorowane.
Przykłady
Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Tabela liderów
źródło
;#
ignoruje wszystkie inne znaki, więc wygenerowany program nadal będzie działał.;
. Po drugie, 127 jest poprawne, jak stwierdzono w łączonym pytaniu, które zawiera specyfikację języka; #.Odpowiedzi:
; # + , 61 bajtów
Outgolfed przez Conor O'Brien
Wypróbuj online!
Zauważ, że wejście ma końcowy bajt zerowy.
źródło
; # + , 40 bajtów
Wypróbuj online! Wejście jest zakończone bajtem zerowym.
Wyjaśnienie
Kod podzielony jest na dwie części: generację i iterację.
Generacja
To wprowadza stałe
;
i#
do pamięci jako takiej:Iteracja
źródło
#
@tuskiomi. Wypróbuj online!pieprzenie mózgu ,
5954 bajtówWypróbuj online!
źródło
Galaretka ,
1087 bajtówWypróbuj online!
-2 bajty dzięki @Emigna
-1 bajtów dzięki @Dennis
źródło
O”;ẋ;€”#
zamiast tego zrobić ?;€
może zostaćp
.GS2 , 6 bajtów
Wypróbuj online!
Odwracalny zrzut heksadecymalny (xxd)
Jak to działa
źródło
■
= co do cholery?2
jest to polecenie mnożenia? GS2 jest dziwny: P■
jest po prostu mapą , a GS2 implementuje ciągi jako listy liczb całkowitych.2
jest XOR ...Taxi, 779 bajtów
Wypróbuj online!
Nie golfowany:
Wyjaśnienie:
źródło
05AB1E , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Brainfuck, 43 bajty
Bajt zerowy kończy program.
Wyjaśnienie
źródło
Python 3 , 39 bajtów
Wypróbuj online!
źródło
for s in input():print(";"*ord(s)+"#")
jest o jeden bajt krótszy.> <> , 22 bajty
Wypróbuj online lub na placu zabaw dla ryb
Wejście to STDIN, wyjście to STDOUT. W> <> znaki i kody ASCII są tym samym, więc wszystko, co musimy zrobić, to odczytać znak, wydrukować
";"
i zmniejszyć znak do zera, a następnie drukować"#"
i zapętlać, dopóki nie pozostanie więcej danych wejściowych.źródło
F #, 79 bajtów
Wypróbuj online!
Rozszerzony
konwersja pobiera ciąg wejściowy i wyprowadza program; #
Stosowanie
źródło
Python 2 - 36 bajtów
Wypróbuj online!
źródło
PowerShell,
292725 bajtówCałkiem proste. Pobiera dane wejściowe jako argument wiersza polecenia. Dane wyjściowe to poprawny program #, który drukuje żądany tekst.
źródło
#
i;
wszystkie inne znaki są ignorowane.«$args
wystarczy.pieprzenie mózgu , 47 bajtów
Wypróbuj online!
Zobacz także: odpowiedź ovsa , która przyjmuje podobne podejście, ale z inną metodą generowania stałych i innym układem komórek.
Wyjaśnienie:
To wyzwanie całkiem nieźle się zgadza ze specyfiką pieprzenia mózgu, co oznacza, że rozwiązanie jest w zasadzie banalne. Brainfuck pobiera dane wejściowe jako wartości ASCII, co jest dokładnie tym; # trzeba wyprowadzać jako.
Schemat transpilacji jest prosty: wygeneruj wartość ASCII dla
;
i#
wypisz;
równą wartości ASCII znaku wejściowego, wydrukuj#
, powtórz dla każdego wejścia.źródło
Mathematica, 49 bajtów
Wyjaśnienie
Konwertuje ciąg wejściowy na listę kodów znaków, następnie
Map
s funkcjaStringRepeat[";",#]<>"#"&
nad listą, a następnieStringJoin
wynik z pustym ciągiem.źródło
<>""
?StringJoin
ing (<>
) pusty ciąg łączy każdy ciąg.Aceto , 19 bajtów
Ponieważ w Aceto jest tłumacz , pomyślałem, że odpowiedź Aceto na to wyzwanie również będzie możliwa. Pasuje idealnie do krzywej Hilberta drugiego rzędu:
Przede wszystkim odczytujemy pojedynczy znak (
,
), duplikujemy go i negujemy, aby sprawdzić, czy jest to nowa linia (d!
podczas czytania nowej linii zwykle pusty znak jest umieszczany na stosie). Następnie używam czegoś, co moim zdaniem jest dość sprytną sztuczką, aby poradzić sobie z nowym przypadkiem kompaktowo:`'\n
Jeżeli wartość na stosie jest
True
(czytamy nowej linii), co oznacza, że kod: nie (`
) umieścić znak literalny na stosie ('
), która jest znak nowej linii:\n
.Jeśli wartość na stosie to
False
(nie czytaliśmy nowego wiersza), ten kod oznacza: nie (`
) czytaj literału znaku ('
). Oznacza to, że następny znak jest wykonywany jako polecenie. Na szczęście ukośnik odwraca się od następnego polecenia (powoduje, że nie można go wykonać), więcn
nie drukuje nowego wiersza (con
zwykle robi).Reszta kodu jest prosta; konwertujemy znak na stosie na liczbę całkowitą jego kodu Unicode (
o
), wciskamy literał średnik (';
), mnożymy liczbę przez ciąg znaków (*
podobnie jak w Pythonie),p
rintujemy wynik, push literal ('
)#
,p
rintujemy i wróć doO
rutyny.Uruchom,
-F
jeśli chcesz zobaczyć natychmiastowe wyniki (ponieważ buforowanie), ale działa również bez.źródło
Perl, 24 bajty
Uruchom z
perl -pe
.Alternatywne rozwiązanie:
Uruchom z
perl -nE
.źródło
Pociecha , 11 bajtów
Tak, nowe języki.
Wyjaśnienie
źródło
Fourier , 19 bajtów
Wypróbuj na FourIDE!
Aby uruchomić, musisz ująć ciąg wejściowy w cudzysłów.
Objaśnienie pseudokod
źródło
Befunge-98 (FBBI) ,
231710 bajtów-5 bajtów dzięki Jo King .
Wypróbuj online!
źródło
JavaScript,
5554515048 bajtówWypróbuj online
Alternatywy
Jeśli możemy przyjąć dane wejściowe jako tablicę pojedynczych znaków, można zapisać 5 bajtów.
Jeśli możemy również wyprowadzać dane jako tablicę, można zapisać jeszcze 2 bajty.
źródło
\n
powinno stać się;;;;;;;;;;#
..
na[^]
, co wciąż pozostawiałoby bajt krótszy niżmap/join
?join()
poprzednia odpowiedź była niepotrzebna, biorąc pod uwagę specyfikację;#
, i możesz również zadeklarować, że dane wejściowe dla twojej funkcji to tablica znaków, chociaż druga sugestia jest nieco rozciągnięta. Tak czy inaczej, obniża to maksymalnie 48 bajtów.Właściwie 11 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
APL (Dyalog) , 18 bajtów
Wypróbuj online!
⎕UCS
Konwertuj na punkty kodowe Unicode';'⍴¨⍨
użyj każdego punktu kodowego, aby zmienić kształt ( ⍴ = Rho ≈ R ; R eshape) średnikiem#',¨⍨
dodaj skrót do każdego łańcuchaźródło
Rubinowy,
2825 bajtów24 bajty plus
-n
przełącznik wiersza poleceń do wielokrotnego działaniastdin
.3 bajty zapisane (i dane wyjściowe poprawione na nowych liniach!) Dzięki manatwork.
źródło
.ord
przez pracę bezpośrednio z kodów znakowych$_.bytes{|b|$><<?;*b+?#}
. Jest różnica: ta również koduje nowy wiersz na wejściu. Nie jestem pewien, co właściciel pytania chce powiedzieć przez „Będzie zawierać tylko drukowalne znaki ASCII i znaki nowej linii”, ale dla mnie brzmi to tak, jakby znaki nowej linii również powinny zostać zakodowane.bytes
. Zapytałem OP o nowe linie na górze i będę to później edytować.PHP, 54 bajtów
Wypróbuj online!
źródło
Alice , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
PHP, 48 bajtów
źródło
jq, 30 znaków
(26-znakowy kod + 4-znakowe opcje wiersza poleceń)
Przykładowy przebieg:
Test online
źródło
Pyth, 10 bajtów
Spróbuj!
źródło
Röda , 24 bajty
Wypróbuj online!
źródło