Związane z: Make a; # interpreter and Generate; # code
;#
- Przewodnik Whirlwind
Jest to prosty język z dwoma poleceniami. Jego jedyną strukturą danych jest akumulator, który jest inicjowany na 0.
;
Zwiększyć akumulator#
Oblicz wartość modułu 127 akumulatora i wydrukuj odpowiedni znak ASCII. Następnie zresetuj akumulator do 0.
Kod źródłowy może zawierać dodatkowe znaki (drukowalne ASCII + białe znaki), ale są one traktowane jako komentarze i nie mają wpływu na wykonanie programu.
Wyzwanie
Ponieważ większość komputerów nie jest ;#
fabrycznie zainstalowana, bardzo przydatne byłoby posiadanie narzędzia do konwersji ;#
kodu na inny język. W tym wyzwaniu napiszesz program, aby to osiągnąć.
Wkład
Trochę ;#
kodu źródłowego pobranego przez argument lub STDIN. Ten kod źródłowy może zawierać (komentarz) znaki inne niż ;
lub #
.
Wydajność
Kod w tym samym języku, co przesłanie, który po uruchomieniu drukuje / zwraca ten sam ciąg znaków, co oryginalny ;#
kod. Ten wynikowy kod może wyświetlać końcowy znak nowej linii po ciągu docelowym, jeśli jest to wygodniejsze dla twojego języka.
Notatki
Należy zwrócić uwagę na sekwencje specjalne, takie jak kod drukujący odwrotne ukośniki lub znaki cudzysłowu. Uważaj również na ;#
kod, który może zawierać rzeczy, które wyglądają jak słowa kluczowe lub polecenia w twoim języku.
Dodatkowe ograniczenia
Wszystkie programy muszą zostać zakończone (zwykle uważam to za domyślne, ale ktoś o to zapytał, więc tutaj to stwierdzam).
Przykłady
input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (python): print(";#")
input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (element): \'`
;#
fabrycznie zainstalowany ...;
lub#
?Odpowiedzi:
Python 2 ,
7669 bajtówKod
Dane wejściowe są otoczone cudzysłowami.
Wypróbuj online!
Wyjaśnienie
Pierwsza część danych wyjściowych jest zasadniczo wykonywana przez dane wejściowe przy użyciu
input('print')
. Podzieliliśmy dane wejściowe na hashtagi i odrzucamy ostatni element. Drukujemy reprezentację ord (y% 127) , gdzie y jest liczbą wystąpień średnika. Dołączamy,
na końcu wydruku, aby upewnić się, że nie zostanie wydrukowany nowy wiersz.Dałoby to następujący kod Python dla
Hello, World!
-programu:Które można wypróbować online .
źródło
pieprzenie mózgu , 126 bajtów
Wypróbuj online!
Program wyjściowy zawiedzie w implementacji TIO, jeśli wynik
;#
wyjściowy przekroczy 65536 znaków. Zrobiłem również 130-bajtową wersję, która wyświetla[+]
zamiast<
, unikając tego problemu:Wyjaśnienie
źródło
Biała spacja, 291 bajtów
Zamień S na spację, T na tab, a N na nową linię.
Generowanie białych znaków w białych znakach nie jest najbardziej wydajną rzeczą na świecie. Generowanie dowolnego rodzaju kodu dynamicznego wymaga znacznego kręcenia bitów, co w języku bez operacji bitowych spowodowałoby eksplozję rozmiaru kodu. Dlatego ten program nie próbuje zrobić czegoś mądrego, zamiast tego po prostu tłumaczy program źródłowy jeden na jednego. Rozkłada się na następujące:
Kod generowany przez program wygląda następująco:
źródło
V ,
192028 bajtówBugfix, zepsuł się, jeśli
#
na końcu nie byłoZaimplementowano poprawkę
mod 127
Wypróbuj online!
Spróbuj wygenerować kod
Wyjaśnienie:
W V, w trybie wstawiania, dowolny znak ASCII można wstawić kodem za pomocą
<C-v><Code>
. Kod V zastępuje wszystkie#
z<C-v>0
, przy czym zero pseudo-akumulator przypadający#
. Każdy#
resetuje akumulatora do 0 więc mając jeden na odrabia grzywny. Następnie kod wykonuje inkrementację dla każdego znalezionego średnika, co tylko inkrementuje kolejną znalezioną liczbę, która byłaby kolejnym akumulatorem.0
Dołączany jest do końca tak, że dyspozycja nie zawieść do;
s bez dalszej#
.Hexdump:
źródło
05AB1E ,
20 19 1816 bajtów-1 dzięki Adnan
-2 dzięki carusocomputing
-2 dzięki Kevin Cruijssen
Wypróbuj online! (obejmuje dane wyjściowe wykonanego kodu 05AB1E)
źródło
';¢
może byćg
,žy
popycha 128, może jakoś działać i dlaczego nie przeliterować całego słowa i otoczyć je cudzysłowami?';¢
ponieważ istnieją postacie inne niż;
.žy<
jest taki sam jak127
. Drukowanie słowa otoczonego cytatami zostanie przerwane, jeśli jeden ze znaków będzie cytatem.ƵQ
to skompresowana wersja 127 .Python 2 , 75 bajtów
Wypróbuj online! (obejmuje dane wyjściowe z wykonania transpilowanego kodu Python)
Dzięki ovs dla wielu wielu bajtów!
Wyjaśnienie
Ten program transponuje #; kod dzieląc na #s (
s.split('#')[:-1]
), licząc liczbę średników w każdej porcji mod 127 (x.count(';')%127for x in ...
) i konwertując ją na odpowiedni znak ASCII (chr(...)
). Ta lista jest następnie konkatenowana (''.join(...)
), konwertowana na reprezentację łańcucha znaków w Pythonie (backticks) i wstawiana do szkieletowego programu Python do drukowania łańcuchów ("print"+...
).źródło
Galaretka ,
25 2416 bajtówPełny program drukujący ekwiwalent kodu Jelly (jako monadyczny link zwraca listę list typów mieszanych).
Pierwszy przykład to wypróbuj online! co daje ten program .
W jaki sposób?
Zlicza
;
s w każdym przebiegu między#
s bierze każdy moduł 127 i dołącza rzut do instrukcji porządkowej,Ọ
atomu monadycznego , po każdym.Galaretka niejawnie przesyła każdą wartość do STDOUT, ponieważ jest uruchamiana przez taki program, tj .
72Ọ101Ọ108Ọ108Ọ111Ọ44Ọ32Ọ119Ọ111Ọ114Ọ108Ọ100Ọ33Ọ
Drukuje sięHello, world!
.Uwaga dotycząca wprowadzania: Jelly pobiera ciąg znaków w formacie Python. Pusty program może być wprowadzona jako
""
i programy hash tylko jak"#"
,"##"
itp Inne manipulacja może być wymagane dla wejściowych zawierających ukośniki i cytatów.źródło
Kubiczną ,
138137 bajtówWypróbuj online!
Uwaga: Być może trzeba wymienić
&6
z?6&
go do pracy na TIO.&6
jest jednak w specyfikacji językowej.Jak to działa
Program wyjściowy:
źródło
@6
,%6
a-6
. Polecenia, które wcześniej nie działały, gdy zostały wywołane niejawnie, teraz korzystają z notatnika. Więc@
jest taka sama jak@6
,%
jest taka sama jak%6
, itd.JavaScript (ES6), 101 bajtów
Podany ciąg wejściowy usuwa wszystkie niepotrzebne znaki, a następnie zwraca źródło następującej funkcji:
Gdzie
...
reprezentuje oczyszczone;#
źródło.źródło
C,
9896999897 bajtów+3 bajty, ponieważ zapomniałem, że C nie jest interpretowane :(
Działa z:
Wydrukuje:
źródło
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
produkujef(){puts(""");}
, co jest nieprawidłowe. Wyzwanie w szczególności woła: „Należy zwrócić uwagę na sekwencje specjalne, takie jak kod drukujący odwrotne ukośniki lub znaki cudzysłowu”.Galaretka , 26 bajtów
Wypróbuj online!
I wypróbuj ten kod Jelly tutaj!
Wyjście Jelly staje się kodem
Ọø‘‘‘‘‘‘‘‘‘‘‘‘‘Ọø‘‘‘‘‘‘‘‘‘‘Ọø
, który wypisuje chr (13) + chr (10)źródło
PHP, 72 bajty
źródło
> <>,
1068177 bajtówTo jest mój pierwszy golf w> <> (ryba)! Całkiem interesujący język muszę powiedzieć. Dużo zabawy!
źródło
i:1+?!
doi:0(?
, a także czuję, że możesz zaoszczędzić kilka bajtów, jeśli zbudujesz wynik na stosie i czekasz na koniec danych wejściowych, aby go wyprowadzić. Mam na myśli, to dużoo
s;)C # 169 bajtów
Gra w golfa:
Wersja czytelna dla człowieka:
źródło
Haskell ,
106102 bajtówWypróbuj online!
Nie golfił
źródło
Brachylog , 33 bajty
Wypróbuj online!
Czuję się trochę zbyt zmęczony, aby to wyjaśnić, jeśli ktoś to zobaczy i zastanowi się, jak to działa, zostaw komentarz, aby mi przypomnieć.
źródło
MathGolf , 17 bajtów
Wypróbuj online!
Wyjaśnienie
Ponieważ dowolny znak można umieścić na stosie (a tym samym na wyjściu) za pomocą
'<char>
, spowoduje to wygenerowanie sekwencji takich bloków kodu.źródło
Þ
.Þ
. ( Dokumenty, których używam, nadal podają jednak starą wartość. )MATL ,
3228 bajtówWypróbuj online!
Zupełnie inne podejście oparte na
strsplit
programie automatycznym niż na programie.źródło
Właściwie 25 bajtów
Wypróbuj online!(obejmuje dane wyjściowe z wykonania transponowanego kodu faktycznie)
Wyjaśnienie:
źródło
shortC , 48 bajtów
źródło
Fourier, 32 bajty
Wypróbuj na FourIDE!
Było to dość łatwe wyzwanie, ponieważ Fourier jest w zasadzie nadzbiorem; #:
źródło
CJam, 14 bajtów
Wyjaśnienie:
źródło
APL, 31 bajtów
Wydajność:
Wyjaśnienie:
⌽
: odwróć wejście{
...}
: przekaż to do tej funkcji:⍵⊂⍨'#'=⍵
: podział na każdy#
w ciągu (od początku, dlatego najpierw trzeba było go odwrócić)+/¨';'=
: policz;
s w każdej partycji127|
: modulo 127⌽
: odwróć to jeszcze raz'⎕UCS',
: dodaj ciąg⎕UCS
, który jest funkcją Unicode.⍕
: reprezentacja ciąguźródło
⍕
ponieważ rzeczywiste wyjście do STDOUT jest takie samo.Rubinowy , 47 + 1 = 48 bajtów
+1 bajt dla
-p
.Wypróbuj online!
-30 bajtów dzięki @manatwork !
źródło
;
lub#
.”/;+#/
→/.*?#/
i blok kodus.length-1
→s.count(?;)
. BTW, twoja matematyka jest również błędna, ponieważ%
ma wyższy priorytet niż-
powinna(s.length-1)%127
. I w.gsub
bloku kodu możesz uzyskać dostęp do przechwyconych grup za pomocą$&
,$1
... więc|s|
parametr blok kodu zazwyczaj nie jest możliwe. A stringifies interpolacji ciąg:{"$><<#{$&.count(?;)%127}.chr;"}
. Wypróbuj online!gsub
modyfikuje$_
bezpośrednio, co oznacza, że nie trzeba go ponownie przypisywać. JEDNAK masz problemy, jeśli masz komentarze po swojej ostatniej#
... patrz tutajPyth,
252324 bajtów+1 bajtów dzięki @FryAmTheEggman
Spróbuj!
radzi sobie ze znakami, które muszą być poprzedzane znakami 1-znakowymi.
Przykładowe wyniki:
Korzysta z mojego; # tłumacza .
źródło
#
wejścia, ponieważ zostanie wydrukowane0
. Możesz to naprawić za pomocąjk
zamiasts
.C, 150 bajtów
Rozszerzony:
Jest to kompletny program, który (powinien) zakończyć, zignorować komentarze i zawsze generować poprawny kod wyjściowy. Zakładam EOF = -1
Testowany na SystemResque-Cd 4.9.6, skompilowany z gcc 4.9.4
źródło
braingasm , 40 bajtów
Muszę powiedzieć, że to zaskakująco krótko.
Wygenerowany kod dla
;
to+
, który zwiększa bieżącą komórkę.Wygenerowany kod
#
zawiera działającą, ręczną operację moduloźródło
Braingolf , 55 bajtów
Wypróbuj online!
Zasadniczo zastępuje
;
się1+
,#
ze#~1+%@
i pre-pends całość z0
ponieważ monadycznego+
operatora jest zepsuty teraz.1+
dodaje 1 do ostatniego elementu na stosie.#~1+%@
przesuwa wartość char~
(126), dodaje 1, aby uzyskać 127, moduł z innym przedmiotem na stosie, a następnie pop i drukuj jako char.Wyjaśnienie
źródło
q / kdb +, 42 bajty
Rozwiązanie:
Przykłady:
Zauważ, że
,
używa się go do oznaczenia listy (w przeciwieństwie do atomu), podobnie jak"\""
listy jednego elementu, a nie atomu.Wyjaśnienie:
Weź ciąg wejściowy, usuń wszystko, co nie jest a
#
lub a;
, podziel na listy#
, policz liczbę elementów na każdej liście, wykonaj mod 127 na wyniku i rzutuj na ciąg:Uwagi:
#
, w przeciwnym razie ostatnia porcja zostanie błędnie usunięta przez-1_
.;#
.źródło
Perl 5 , 78 bajtów
Wypróbuj online!
źródło