Biorąc pod uwagę program napisany w oOo CODE , wypisz reprezentowany przez niego kod BF.
Oto krótki opis działania oOo CODE:
Najpierw usuwane są wszystkie znaki niealfabetyczne (wszystko poza zakresem
A-Za-z
).Weźmy na przykład program
PROgRam reVERsES giVeN iNPut sEqUENcE
(przykład podany na stronie wiki esolangs, który robi dokładnie to, czego można oczekiwać). Po tym pierwszym kroku mamy terazPROgRamreVERsESgiVeNiNPutsEqUENcE
.Następnie podziel wszystkie pozostałe postacie na grupy po 3. Mamy teraz
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Jeśli istnieje końcowa grupa 1 lub 2 znaków, odrzuć ją.Konwertuj każdą grupę 3 liter na polecenie BF na podstawie poniższej tabeli:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
Oznacza to, że jeśli pierwsza litera grupy jest pisana małymi literami, druga jest pisana wielkimi literami, a trzecia jest pisana małymi literami, tłumaczy się na polecenie
[
.W naszym przykładzie ostatecznie staje się to programem BF
,[>,]<[.<]+
, który faktycznie odwraca swoje dane wejściowe.
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Przypadki testowe:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
źródło
Odpowiedzi:
oOo,
15691515 bajtówMusiało być zrobione. Wypróbuj tutaj .
Gra w golfa:
Przetłumaczone na Brainfuck (z podziałami dla zachowania przejrzystości):
Nieoznakowany z wyjaśnieniem:
Dzięki za interesujące wyzwanie!
źródło
CJam,
3635 bajtówSprawdź to tutaj.
Wyjaśnienie
źródło
JavaScript (ES6),
949391858483 bajtyZapisano 1 bajt dzięki @ dev-null
Próbowałem wielu wariantów tego, ale wydaje się to być najkrótsze. Działa również przy pustym wejściu!
Jak to działa
Po pierwsze, za pomocą
x.replace(/[a-z]/gi,c=>
znajdujemy każdą literęc
w danych wejściowych. Postawiliśmya
ib
aby""
na drugim końcu wywołania funkcji, ponieważ funkcja ignoruje wszelkie parametry obok drugiego.a
zapisze ciąg binarny do określania, który znak tworzymy obecnie ib
zapisze wynik.Teraz część myląca: po pierwsze, do
(a+=+(c<'a'))
, dodajemy a0
do wielkiej literya
if jeślic
;1
Inaczej. To wyrażenie zwraca nową wartośća
, więc możemy sprawdzić, czy osiągnął trzy znaki długości z sprawdzając czy postać w indeksie 2 istnieje:[2]?
. Jeśli nie, po prostu kończymy funkcję za pomocą:0
.Jeśli
a
ma teraz trzy znaki, jest to liczba binarna między000
a111
. Możemy przekonwertować to na liczbę dziesiętną, dodając"0b"
na początku, a następnie zmuszając silnik do parsowania go jako liczby'0b'+a-0
.Jednak nadal musimy zresetować
a
do pustego ciągu. Nie możemy tego zrobić,'0b'+(a="")-0
ponieważ oznaczałoby to, że analizowany ciąg jest po prostu0b
. Na szczęście, gdy analizowany jako liczba, pusty łańcuch staje 0, więc możemy wymienić0
z(a="")
.Teraz mamy nasz numer i możemy po prostu dołączyć znak pod tym indeksem
"><[]-+.,"
dob
. Po zakończeniu zamiany używamy,&&b
aby zwrócić go z funkcji. (Cóż, chyba że wynik.replace
jest pusty, co dzieje się tylko przy pustych danych wejściowych i zwraca pusty ciąg znaków.)źródło
'0b'+a-0
vs+`0b${a}`
i+("0b"+a)
replace
końcu wygrywa!match
szlakiem ...05AB1E ,
3532 bajtówKod:
Wykorzystując bardzo sprytną sztuczkę Martina Büttnera z tej odpowiedzi . Wyjaśnienie:
Wypróbuj online!
Wykorzystuje kodowanie CP-1252 .
źródło
Siatkówka ,
79757170 bajtówDzięki randomra za zapisanie 1 bajtu.
Wypróbuj online!
Wyjaśnienie
Zaczynamy od usunięcia wszystkiego, co nie jest literą.
To dzieli ciąg na fragmenty trzech znaków, zwracając wszystkie (nie nakładające się) dopasowania 3-znakowe. To automatycznie odrzuca każdy niekompletny końcowy fragment.
Przygotuj a
;
do każdej linii. Użyjemy tego jako znacznika konwersji base-2. Mówiąc o tym, po prostu będziemy traktować wielkie litery jako,1
a małe litery jako0
.Robi to zabawną konwersję base-2 na jednoargumentową konwersję. Na każdym kroku po prostu podwajamy postacie po lewej stronie
;
i przesuwamy tę;
w prawo. Dlaczego to działa? Pamiętaj, że będziemy interpretować małe0
i duże litery jako1
. Ilekroć przetwarzamy literę, po prostu podwajamy do tej pory sumę bieżącą (po lewej) - podwójne małe litery są po prostu2*0=0
, więc można je całkowicie zignorować, a duże litery reprezentują dotychczas liczbę binarną, więc podwojenie ich jest czego chcemy. Następnie dodajemy bieżącą literę do bieżącej sumy, która reprezentuje0
lub1
odpowiednio.Usuń wszystkie małe litery / zera.
Dopasuj każdy wiersz i zastąp go (dziesiętną) liczbą znaków w tym wierszu. Z
;
tego powodu zamienia liczbę jednoznaczną na jej ekwiwalent dziesiętny + 1.Transliteracja, która zastępuje 1-8 odpowiednim poleceniem.
Usuń linie.
źródło
;
. Zmienię to później.MATL ,
3832 bajtówWypróbuj online!
źródło
Japt,
3736 bajtówPrzetestuj online!
Jak to działa
źródło
JavaScript (ES6),
11195 bajtówPo prostu usuwa nie-litery, konwertuje wielkie litery na 1s, a małe na 0, dzieli na grupy trzy, ignoruje końcową grupę 1 lub 2 i dekoduje grupy.
Edycja: Zapisano 16 bajtów dzięki @ dev-null, chociaż kod nie działa już po przekazaniu pustego ciągu.
źródło
match(/.../g).map().join
podejścia, ale przeliczyłem liczbę bajtów i chociaż nic mnie to nie uratowało. Dzięki za wskazówkę na temat pierwszego meczu.Python 3, 91 bajtów
Hmm ... wygląda na trochę długą, zwłaszcza drugą linię.
b=[b,2*b+(c<'a')][c.isalpha()]
jest jednak nieco gorszy.źródło
Pyth, 40 bajtów
Wypróbuj tutaj!
Mógłbym zapisać 2 bajty, jeśli mogę wypisać wynik jako listę znaków zamiast łańcucha.
Wyjaśnienie
Filtruje wszystkie nie-litery, konwertuje wielkie litery na 1 i małe litery na 0, dzieli na 3 części, interpretuje każdą część jako liczbę binarną i używa tego jako indeksu w ciągu zawierającym wszystkie polecenia BF.
źródło
Jolf,
3134 bajtówWypróbuj tutaj! Wymień
►
się\x10
i♣
z\x05
. Ponieważ źle zaimplementowałem funkcję chop, zyskuję 3 bajty. :(źródło
Hoon , 212 bajtów
Nie golfowany:
Hoon nie ma odpowiednich wyrażeń regularnych, tylko bibliotekę parsera, więc jest niestety dość gadatliwa. Skanowanie ++ zawiesza się również, jeśli cały strumień wejściowy nie jest analizowany, więc muszę użyć ++ rose, przekonać go do jednostki i rozpakować dla wartości „najdalszego parsowania”. Jest również bardzo użyteczne do curryowania i mapowania list (zwrot ++), więc alias nazw funkcji do zmiennych literowych.
Hoon jest językiem programowania dla Urbit, projektu reimplementacji czystych łupków. Jest to czysto funkcjonalne, typowo statyczne, niejasno podobne do seplenienia i kompiluje się do Nocka. Nock to maszyna wirtualna oparta na kombinatorze, która działa na modelu pamięci bignum drzewa binarnego.
Kiedy uruchamiasz Urbit, zostajesz przeniesiony do: dojo, powłoki i repliki Hoon. Aby uruchomić fragment, po prostu wpisz:
a następnie wklej samodzielną funkcję w następnym wierszu.
źródło
Galaretka , 27 bajtów
Wypróbuj online! Zauważ, że ukośniki odwrotne wymagają ucieczki w ciągu wejściowym dla drugiego ostatniego przypadku testowego.
źródło
Matlab, 98 bajtów
źródło
Perl,
767372 + 1 = 73 bajtyWymaga
-n
flagi:Wykorzystanie lewy z konwersją base-2 .
Jak to działa:
źródło
Julia, 107 bajtów
Jest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.
Nie golfowany:
źródło
Lua, 120 bajtów
Wielkie zastosowanie
string.gsub()
tutaj, jeszcze raz mógłbym pozwolić na utworzenie wskaźnika jednoznakowego na tej funkcji, aby uzyskać trochę bajtów. To także mój pierwszy program lua bez spacji! :RETen program pobiera dane wejściowe za pomocą argumentu wiersza polecenia i wyświetla program BrainFuck, po jednym poleceniu na wiersz.
Edycja: Zapisano 1 bajt dzięki @Oleg V. Volkov
Ungolf i wyjaśnienia
źródło
b
i jeszcze jeden na zapisywaniustring.gsub
do krótszego var i ręcznym składaniu do niego pierwszych argumentów:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 bajtów
Spróbuję bardziej zagrać w golfa.
źródło
Mathematica, 192 bajty
Anonimowa funkcja, która przyjmuje żądany ciąg jako argument. Kroki w (dość prostym) algorytmie:
źródło
Ruby
1171141131118679 bajtówtr(?^+m='a-zA-Z','')
ustawia m na'a-zA-Z'
i usuwa nieliterowe litery.tr(m,?0*26+?1)
konwertuje małe litery na 0, wielkie litery na 1.scan(/.../)
podziel ciąg na grupy po 3 i odrzuć ostatnią grupę, jeśli ma mniej niż 3{$><<"><[]-+.,"[$&.to_i 2]}
przekonwertować każdą liczbę binarną na znakźródło
tr("a-zA-Z","01")
? a nawettr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
daje111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 bajtów). Zmieniono wejście z opcji wiersza poleceń na standardowe; naprawiono otaczające cytaty w danych wyjściowych (ale teraz nie matr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
jest krótszyPerl 6, 81 bajtów
Prawdopodobnie można to zrobić lepiej, ale to moja decyzja
Stosowanie
Bez golfa
źródło
C ++,
173167 bajtówPełny program, gra w golfa (odczytuje ze standardowego wejścia):
Nieco golfisty:
Należy pamiętać, że
@A
...Z[
w ASCII, a także dla`a
...z}
.źródło
Japt v2.0a0
-P
, 27 bajtówZaoszczędź 3 bajty dzięki @Shaggy
Spróbuj
źródło
Pyke, 31 bajtów, niekonkurencyjny
Pyke jest starszy niż wyzwanie, ale dodałem kilka funkcji, aby uczynić go bardziej konkurencyjnym - funkcja fragmentu. Użyłem tej samej sztuczki, co @Martin Büttner .
Wypróbuj tutaj!
źródło
JavaScript, 148 bajtów
źródło
TI-BASIC,
311288 bajtówCo, brak odpowiedzi TI-BASIC? Czas, abym to naprawił!
Wejście to kod oOo w
Ans
.Dane wyjściowe to przetłumaczony kod BF .
Przykłady:
Bez gry w golfa:
(dodano nowe linie i komentarze)
Uwagi:
źródło