Zbuduj ze mną język golfa

30

Wielu użytkowników PPCG pomogło w stworzeniu tego wyzwania, zarówno na czacie, jak i w piaskownicy, w szczególności Martin Ender , AdmBorkBork , Emigna i user202729

Nasza społeczność uznała za konieczne stworzenie zestawu języków zaprojektowanych specjalnie do gry w golfa, „języków golfowych”, jak je nazywamy. Takie języki ewoluowały od niegdyś genialnego, teraz niezgrabnego GolfScript do eleganckich, zwięzłych języków, takich jak Jelly i Husk . Jak widzimy, języki te stają się coraz krótsze dla zestawu zadań. Tak więc, jako oczywisti eksperci wokół języków golfowych, powinniśmy wspólnie opracować język, aby pokonać każdy inny język, który odważy się konkurować. Przedstawiamy Bugle!

Bugle: Z akronimu BuGoL: Bu ilt Go lfing L anguage.

Jak będzie działać to wyzwanie

Jeśli nie dostałeś tego, o czym wspomniałem we wstępie, to wyzwanie jest którym każdy z nas wnosi coś do tłumacza nowego języka golfa, poprawiając jego zdolność do konkurowania na PPCG z każdą odpowiedzią.

Zamieszczę pierwszą odpowiedź składającą się z podstawy specyfikacji języka / tłumacza, a wszystkie pozostałe odpowiedzi będą od tego kontynuowane. Nowe zgłoszenia zapewnią następujące rzeczy:

  • Zmiana specyfikacji języka
  • Aktualny tłumacz, spełniający dokładnie to , co zostało określone w zmianach
  • Zaktualizowany wynik języka (więcej szczegółów za chwilę)

Możesz zmienić specyfikację na jeden z trzech sposobów:

  • Możesz dodać jedno polecenie
  • Możesz dodać dwa nowe polecenia
  • Możesz edytować zachowanie jednego istniejącego polecenia

Jeśli chodzi o nowego interpretera, musisz użyć najnowszej wersji napisanej w języku Python. Nie musi być golfa. Każde wcześniej dodane polecenie musi być możliwe do przetestowania przy użyciu najnowszego interpretera, a także najnowszych poleceń (tego, które dodajesz). Nie wolno również używać obraźliwego języka w żadnym momencie podczas aktualizacji interpretera, na przykład w komentarzach lub literałach łańcuchowych itp.

Dodane polecenia mogą zrobić cokolwiek zechcesz . Jedyne wymagania to:

  • Nie wytwarza obraźliwych wyników
  • To nie to samo, co inne polecenie
  • Nie uniemożliwia to ukończenia jednego z przykładowych wyzwań

Poza tym może być tak szczegółowe lub tak ogólne, jak chcesz. Może to być także dowolna postać . Jeśli nie masz pewności, czy Twój dodatek stanowi „nowe polecenie”, możesz zapytać w komentarzach.

Ocena języka

Być może zauważyłeś, że musisz dołączać ocenę języka do wszystkich nowych zgłoszeń. Jego wynik uniemożliwia wieczne wyzwanie i jest określony następująco:

Obecny wynik to suma liczby bajtów potrzebnych do tego, aby język wykonał poniżej 20 zadań

Do każdego zadania mają zastosowanie standardowe reguły we / wy , podobnie jak standardowe luki .

20 zadań:

  1. "Witaj świecie!" - Wyjście łańcuchaHello, World!
  2. 1, 2, Fizz, 4, Buzz - wypisuje każdą liczbę całkowitą od 1 do 100 (włącznie) w osobnej linii, z wielokrotnościami 3 zastępowanymi przez Fizz, wielokrotnościami 5 zastępowanymi Buzzi wielokrotnościami obu przezFizzBuzz
  3. Utwórz liczbę 2014 bez żadnych liczb w kodzie źródłowym - Wypisz liczbę 2014 bez użycia żadnego ze znaków 0123456789w kodzie źródłowym, bez dostępu do zmiennych zewnętrznych lub losowych nasion
  4. Zamaskowany Hello World - Wyjście ciąg Hello, World!, bez użycia jakichkolwiek znaków w co najmniej dwóch z następujących zestawów: hlwd, eor01oraz 27(bez uwzględniania wielkości liter)
  5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - w wybranym języku wypisz następujące informacje:

    Happy Birthday to You
    Happy Birthday to You
    Happy Birthday Dear [the name of your favourite programming language]
    Happy Birthday to You
    
  6. Nie jesteśmy obcy kodować golfa, znacie zasady, ja też - ja wypisuję pełny tekst piosenki „Never Gonna Give You Up”

  7. Wyjście znaku - Biorąc pod uwagę liczbę, wypisz -1, jeśli jest ujemna, 0, jeśli jest 0 lub 1, jeśli jest dodatnia
  8. Hipoteza Collatza (OEIS A006577) - Zaczynając od liczby całkowitej, podziel ją przez 2, jeśli jest parzysta, lub pomnóż ją przez 3 i dodaj 1, jeśli jest nieparzysta, i powtarzaj proces, aż osiągniesz 1. Wynik powinien być liczbą iteracji zabierze Cię do osiągnięcia 1.
  9. Tablica wyzwań nr 1: Tablice naprzemienne - Biorąc pod uwagę tablicę liczb całkowitych, sprawdź, czy wszystkie elementy o indeksie parzystym są równe, a wszystkie elementy o indeksie nieparzystym są równe, i odpowiednio wypisz wartość prawdy lub fałszu
  10. Czy jestem nieistotną tablicą? - Biorąc pod uwagę tablicę liczb całkowitych, sprawdź, czy bezwzględne różnice między kolejnymi elementami są mniejsze lub równe 1, i odpowiednio wypisz wartość prawdy lub fałszu
  11. Czy ta liczba jest liczbą pierwszą? - Biorąc pod uwagę dodatnią liczbę całkowitą, napisz pełny program, aby sprawdzić, czy jest liczbą pierwszą, i odpowiednio wypisz wartość prawdy lub fałszu
  12. Jestem palindromem. Jesteś? - Biorąc pod uwagę ciąg znaków, sprawdź, czy jest to palindrom, podczas gdy twój program / funkcja również jest palindromem, i wypisz odpowiednio dwie odrębne i spójne wartości
  13. Sumuj liczby na standardowym wejściu - weź ciąg liczb z STDIN i wyślij ich sumę.
  14. Znajdź czynnik - biorąc pod uwagę liczbę całkowitą n, wypisz iloczyn wszystkich liczb całkowitych między 1i nwłącznie.
  15. Najkrótszy kod do generowania nieskończonego wyjścia - Bez żadnego wejścia, generuj nieskończone wyjście, które teoretycznie nigdy nie przestanie generować.
  16. Upiecz kawałek Pi - wypisz ten dokładny tekst:
()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
 \::\433832|
  \::\79502|
   \::\8841|
    \::\971|
     \::\69|
      \::\3|
       \__\|
  1. Znajdź najmniejszą liczbę, która nie dzieli N - Biorąc pod uwagę dodatnią liczbę całkowitą N, wyprowadzaj najmniejszą dodatnią liczbę całkowitą, która nie dzieli N.
  2. Czy to jest parzyste czy dziwne? - Biorąc pod uwagę liczbę całkowitą N, wyprowadzaj jej parzystość jako wartości prawda / fałsz.
  3. Dane wyjściowe o tej samej długości co kod - Napisz najkrótszy kod, którego wynik ma taką samą długość jak kod, gdzie wynik nie jest taki sam jak kod.
  4. Zagraj w golfa na dobre! - Napisz najkrótszą quinę w swoim języku.

Aby zgłoszenie było ważne, nowe zgłoszenie musi zawierać zgłoszenia do gry w golfa dotyczące co najmniej 2 problemów, o co najmniej 1 bajt dla każdego. Możesz zwiększyć długość innych zgłoszeń, ale całkowity wynik musi spaść o co najmniej 2 na odpowiedź. Rozważ także dołączenie linku do zaktualizowanych programów. Zaktualizowane rozwiązania nie mogą działać po uruchomieniu z poprzednią wersją interpretera.

Jak zdobyć ciasteczka

Mam listę 5 wyzwań, które nie są obowiązkowe i nie mają wpływu na twój wynik, ale są po prostu dodatkowymi wyzwaniami, aby sprawdzić, czy Bugle jest wystarczająco zdolny. W odpowiedzi umieść rozwiązanie dowolnego z nich:

  1. Utwórz tłumacza
  2. Utwórz quine zdolne do załadunku
  3. Potwierdź ciąg
  4. Hiperprogramowanie: N + N, N × N, N ^ N wszystko w jednym
  5. „KNOT” czy „NOT”?

Opisy nie zostały uwzględnione, ponieważ nie są wymagane, aby każdy mógł wziąć udział w wyzwaniu.

Jak wygrać

Po osiągnięciu minimalnego wyniku ( uważamy, że jest to 16, choć wszelkie próby obniżenia golfa są mile widziane), łańcuch oczywiście zakończył się, ponieważ rozwiązania nie mogą uzyskać lepszego wyniku. Po osiągnięciu 16, wyzwanie pozostaje przy życiu przez 1 miesiąc , aby dać każdemu szansę na grę w golfa. Po upływie tego miesiąca wyzwanie się skończyło.

Po zakończeniu wyzwania przeprowadzę migrację interpretera do repozytorium GitHub i przeprowadzę zwykłe machinacje związane z wydaniem stabilnego języka. Możesz również zacząć publikować rozwiązania problemów w PPCG w tym momencie, używając wspomnianego języka, ale staraj się nie zalewać strony tytułowej odpowiedziami. Zamiast tego rozłóż je na pewien okres czasu.

Formatowanie

Aby ułatwić znalezienie informacji w odpowiedzi, sformatuj ją w następujący sposób:

# [N]. [Score]

[New command + description]

[Interpreter/link to interpreter]

[Link to programs]

Gdzie [N]jest twój numer odpowiedzi (1 dla pierwszego, 2 dla drugiego itd.)

Zasady

  • Musisz odczekać 3 godziny między opublikowaniem odpowiedzi
  • Nie możesz publikować postów dwa razy z rzędu, chyba że nie otrzymałeś żadnej odpowiedzi przez 10 dni (dokładnie 240 godzin)
  • Nie możesz usunąć poprzednich poleceń.
  • Twój tłumacz nie musi być golfa, a jego liczba bajtów nie ma tutaj znaczenia.
  • Jeśli ktoś sugeruje programom grę w golfa, dopóki twoja odpowiedź jest najnowsza, musisz dokonać edycji w golfie i zaktualizować swój wynik.
    • Możesz to również zrobić, gdy Twoja odpowiedź znajduje się w środku łańcucha, pod warunkiem, że twój wynik nie spadnie poniżej żadnej z późniejszych odpowiedzi.
  • Proszę powstrzymać się od odpowiadania na jakiekolwiek istniejące wyzwania PPCG w tym języku, przynajmniej do czasu zakończenia wyzwania
  • Tłumacz jest napisany w Pythonie 3 i powinien być kontynuowany w całym łańcuchu. Zmiana języka jest zabroniona.
  • Ponownie, aby być poprawnym, nowe zgłoszenie musi zawierać zgłoszenia do gry w golfa dla co najmniej 2 problemów, o co najmniej 1 bajt dla każdego.

Zacznijmy!

Cairney Coheringaahing
źródło
1
Piaskownica
caird coinheringaahing
1
Mógłbym również zapytać: ktoś lubi wyjaśniać opinię negatywną? Będę wdzięczny za wszelkie opinie, które chciałbyś przekazać.
caird coinheringaahing
2
@Kaldo Nie jesteśmy do końca pewni. Quine musi mieć minimum dwa bajty, ale jeśli pusty program wyprowadza Hello, World!, to ma 19 bajtów. Ale jeśli zachowanie pustego programu ulegnie zmianie, w zależności od danych wejściowych, można go zmniejszyć
Cairair coinheringaahing
1
@WeijunZhou „Prosimy powstrzymać się od odpowiadania na wszelkie istniejące wyzwania PPCG za pomocą tego języka, przynajmniej do momentu, gdy wyzwanie się skończy”
caird coinheringaahing
1
@LyricLy Konstrukty składniowe (takie jak forpętle) są dozwolone i zachęcane do dodawania
caird coinheringaahing

Odpowiedzi:

3

3. Wynik: 2938 2583 2532 (-51)

Nowy tłumacz jest tutaj .

Głównie w celu gry w golfa i ułatwienia wydruku dodałem możliwość duplikowania stosu / odwrotności, a także generowania całego modelu w postaci renderowanego tekstu zamiast liczb całkowitych.

Rozwiązania

1. „Witaj, świecie!” - 17 bajtów (-3)

#"Hello, World!"a

5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - 95 bajtów (-3)

#"Happy Birthday to You
Happy Birthday to You
Happy Birthday Dear Bugle
Happy Birthday to You"a

6. Nie jesteśmy obcy kodować golfa, znacie zasady i ja też - 1884 bajtów (-3)

#"We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)

We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it

I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you"a

16. Upiec kawałek Pi - 149 bajtów (-3)

#"()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
 \::\433832|
  \::\79502|
   \::\8841|
    \::\971|
     \::\69|
      \::\3|
       \__\|"a

20. Zagraj w golfa na dobre! - 23 bajty (-39)

$"R34RdR36Ra"R34RdR36Ra

Dodano funkcje językowe

  • a

    • Wszystko: Wydrukuj cały model jako tekst, np. #"Hello, World!"aOdbitkiHello, World!
  • d

    • Stack / Deque: Wciśnij stos na siebie.
LyricLy
źródło
8

2. Wynik: 2938 2583

Zmodyfikowany tłumacz jest dostępny w TIO .

łańcucha jest najbardziej oczywistym dodatkiem do języka, głównie w celu zwalczania .

Rozwiązania

1. „Witaj, świecie!” - 20 bajtów (-28)

#"Hello, World!"[o>]

Każde wyzwanie można ukończyć przy użyciu struktury, #"<string>"[o>]która wyprowadza podany ciąg, aż do osiągnięcia 0 po osiągnięciu łańcucha.

2. 1, 2, Fizz, 4, Buzz - 419 64 bajtów (-1332)

$1[1+1s:3s%{}"zziF"oooos;0s]:5s%{}"zzuB"oooos;0s]s{:O}]10o:100-]

Dzięki @ user202729 za niesamowitą grę w golfa na ten temat.

3. Wpisz liczbę 2014 bez liczb w kodzie źródłowym - 9 bajtów (-4)

#"ĒĎ"[O>]

Używa dwóch znaków 20 i 14 w współrzędnych kodowych Bugle.

4. Obfuscated Hello World - 19 bajtów (-153)

#"Ifmmp!Xpsme"[-o>]

Spełnia zasady nr 1 (nie HLWDhlwd) i nr 3 (nie 27).

5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - 98 bajtów (-230)

#"Happy Birthday to You
Happy Birthday to You
Happy Birthday Dear Bugle
Happy Birthday to You"[o>]

6. Nie jesteśmy obcy kodować golfa, znacie zasady i ja też - 1887 bajtów (-5006)

#"We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)

We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it

I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you"[o>]

16. Upiec kawałek Pi - 149 bajtów (-290)

#"()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
 \::\433832|
  \::\79502|
   \::\8841|
    \::\971|
     \::\69|
      \::\3|
       \__\|"[o>]

20. Zagraj w golfa na dobre! - 62 bajty (-12)

#"[>]<o-o+[<]>[o>]<-o;<[<]>[o>]#"[>]<o-o+[<]>[o>]<-o;<[<]>[o>]

Dodano funkcję języka

  • "...": Dosłowny ciąg.
    • Stack / Deque: Wciśnij punkty kodowe Bugle każdego znaku na górę / przód stosu / deque.
    • Tape / Grid: Napisz punkty kodowe Bugle każdego znaku na taśmie / grid po prawej stronie, zaczynając od bieżącej komórki. Nie porusza kursorem.
    • \n jest obsługiwany tak jak inne znaki.
    • Na razie nie ma znaku zmiany znaczenia, więc nie można zapisać "(34) do pamięci za pomocą tego polecenia. Nie jest to zbyt duży problem, przynajmniej na razie, ponieważ wszystkie wymienione tutaj problemy nie występują ".

Wszelkie dalsze gry w golfa są zawsze mile widziane, szczególnie w przypadku „Nigdy się nie poddam” i quine. W szczególności powyższy quine to pierwszy nietrywialny quine, jaki kiedykolwiek stworzyłem, więc mocno wierzę, że ktoś może wymyślić krótszy.

Bubbler
źródło
Istnieją rodzaje dodatków, które, jak mam nadzieję, robią inni, niż tylko dodawanie wbudowanych rozwiązań dla określonych wyzwań. +1
caird coinheringaahing
@ user202729 Prawdopodobnie to ja wprowadziłem błąd; dzięki za naprawę i rozwiązanie FizzBuzz.
Bubbler
3

1. Wynik: 9638

Podstawowy tłumacz można znaleźć tutaj , a wnioski tutaj . Jest raczej długi, więc umieściłem go na GitHub, zamiast zajmować większość postu.

Rozwiązania

Wszystkie te rozwiązania to programy Unicode, uruchamiane z -uflagą wiersza poleceń, ale wyniki są liczone tak, jakby były zakodowane za pomocą strony kodowej Bugle'a.

1. „Witaj, świecie!” - 48 bajtów

$72o101o108o108o111o44o32o87o111o114o108o100o33o

Po prostu wciśnij, a następnie wypisz kod każdego znaku w ciągu.

2. 1, 2, Fizz, 4, Buzz - 1396 bajtów

$49o10o50o10o70o105o122o122o10o52o10o66o117o122o122o10o70o105o122o122o10o55o10o56o10o70o105o122o122o10o66o117o122o122o10o49o49o10o70o105o122o122o10o49o51o10o49o52o10o70o105o122o122o66o117o122o122o10o49o54o10o49o55o10o70o105o122o122o10o49o57o10o66o117o122o122o10o70o105o122o122o10o50o50o10o50o51o10o70o105o122o122o10o66o117o122o122o10o50o54o10o70o105o122o122o10o50o56o10o50o57o10o70o105o122o122o66o117o122o122o10o51o49o10o51o50o10o70o105o122o122o10o51o52o10o66o117o122o122o10o70o105o122o122o10o51o55o10o51o56o10o70o105o122o122o10o66o117o122o122o10o52o49o10o70o105o122o122o10o52o51o10o52o52o10o70o105o122o122o66o117o122o122o10o52o54o10o52o55o10o70o105o122o122o10o52o57o10o66o117o122o122o10o70o105o122o122o10o53o50o10o53o51o10o70o105o122o122o10o66o117o122o122o10o53o54o10o70o105o122o122o10o53o56o10o53o57o10o70o105o122o122o66o117o122o122o10o54o49o10o54o50o10o70o105o122o122o10o54o52o10o66o117o122o122o10o70o105o122o122o10o54o55o10o54o56o10o70o105o122o122o10o66o117o122o122o10o55o49o10o70o105o122o122o10o55o51o10o55o52o10o70o105o122o122o66o117o122o122o10o55o54o10o55o55o10o70o105o122o122o10o55o57o10o66o117o122o122o10o70o105o122o122o10o56o50o10o56o51o10o70o105o122o122o10o66o117o122o122o10o56o54o10o70o105o122o122o10o56o56o10o56o57o10o70o105o122o122o66o117o122o122o10o57o49o10o57o50o10o70o105o122o122o10o57o52o10o66o117o122o122o10o70o105o122o122o10o57o55o10o57o56o10o70o105o122o122o10o66o117o122o122o

Ta sama technika, co Hello, World! przykład

3. Wpisz liczbę 2014 bez liczb w kodzie źródłowym - 13 bajtów

#++O--O+O+++O

#używa taśmy, +zwiększa komórkę, Owyświetla dane jako liczbę całkowitą i -zmniejsza

4. Obfuscated Hello World - 172 bajty

#+++++++++[>++++++++<-]>o<++++[>+++++++<-]>+o+++++++oo+++o>++++[>+++++++++++<-]>o------------o[-]++++++++[>+++++++++++<-]>-o<<<o+++o------o--------o[-]+++[>+++++++++++<-]>o

Wykorzystuje swoje nieodłączne podobieństwo do pieprzenia mózgu. Spełnia zasady nr 1 i nr 3

5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - 328 bajtów

$72o97o112o112o121o32o66o105o114o116o104o100o97o121o32o116o111o32o89o111o117o10o72o97o112o112o121o32o66o105o114o116o104o100o97o121o32o116o111o32o89o111o117o10o72o97o112o112o121o32o66o105o114o116o104o100o97o121o32o68o101o97o114o32o66o117o103o108o101o10o72o97o112o112o121o32o66o105o114o116o104o100o97o121o32o116o111o32o89o111o117o

Wszystkie wyzwania mają obecnie taką strukturę.

6. Nie jesteśmy obcy kodować golfa, znacie zasady, podobnie jak ja - 6893 bajtów

$87o101o39o114o101o32o110o111o32o115o116o114o97o110o103o101o114o115o32o116o111o32o108o111o118o101o10o89o111o117o32o107o110o111o119o32o116o104o101o32o114o117o108o101o115o32o97o110o100o32o115o111o32o100o111o32o73o10o65o32o102o117o108o108o32o99o111o109o109o105o116o109o101o110o116o39o115o32o119o104o97o116o32o73o39o109o32o116o104o105o110o107o105o110o103o32o111o102o10o89o111o117o32o119o111o117o108o100o110o39o116o32o103o101o116o32o116o104o105o115o32o102o114o111o109o32o97o110o121o32o111o116o104o101o114o32o103o117o121o10o73o32o106o117o115o116o32o119o97o110o110o97o32o116o101o108o108o32o121o111o117o32o104o111o119o32o73o39o109o32o102o101o101o108o105o110o103o10o71o111o116o116o97o32o109o97o107o101o32o121o111o117o32o117o110o100o101o114o115o116o97o110o100o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o10o32o10o87o101o39o118o101o32o107o110o111o119o110o32o101o97o99o104o32o111o116o104o101o114o32o102o111o114o32o115o111o32o108o111o110o103o10o89o111o117o114o32o104o101o97o114o116o39o115o32o98o101o101o110o32o97o99o104o105o110o103o32o98o117o116o10o89o111o117o39o114o101o32o116o111o111o32o115o104o121o32o116o111o32o115o97o121o32o105o116o10o73o110o115o105o100o101o32o119o101o32o98o111o116o104o32o107o110o111o119o32o119o104o97o116o39o115o32o98o101o101o110o32o103o111o105o110o103o32o111o110o10o87o101o32o107o110o111o119o32o116o104o101o32o103o97o109o101o32o97o110o100o32o119o101o39o114o101o32o103o111o110o110o97o32o112o108o97o121o32o105o116o10o65o110o100o32o105o102o32o121o111o117o32o97o115o107o32o109o101o32o104o111o119o32o73o39o109o32o102o101o101o108o105o110o103o10o68o111o110o39o116o32o116o101o108o108o32o109o101o32o121o111o117o39o114o101o32o116o111o111o32o98o108o105o110o100o32o116o111o32o115o101o101o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o10o32o10o40o79o111o104o44o32o103o105o118o101o32o121o111o117o32o117o112o41o10o40o79o111o104o44o32o103o105o118o101o32o121o111o117o32o117o112o41o10o40o79o111o104o41o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o44o32o110o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o10o40o71o105o118o101o32o121o111o117o32o117o112o41o10o40o79o111o104o41o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o44o32o110o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o10o40o71o105o118o101o32o121o111o117o32o117o112o41o10o32o10o87o101o39o118o101o32o107o110o111o119o32o101o97o99o104o32o111o116o104o101o114o32o102o111o114o32o115o111o32o108o111o110o103o10o89o111o117o114o32o104o101o97o114o116o39o115o32o98o101o101o110o32o97o99o104o105o110o103o32o98o117o116o10o89o111o117o39o114o101o32o116o111o111o32o115o104o121o32o116o111o32o115o97o121o32o105o116o10o73o110o115o105o100o101o32o119o101o32o98o111o116o104o32o107o110o111o119o32o119o104o97o116o39o115o32o98o101o101o110o32o103o111o105o110o103o32o111o110o10o87o101o32o107o110o111o119o32o116o104o101o32o103o97o109o101o32o97o110o100o32o119o101o39o114o101o32o103o111o110o110o97o32o112o108o97o121o32o105o116o10o32o10o73o32o106o117o115o116o32o119o97o110o110o97o32o116o101o108o108o32o121o111o117o32o104o111o119o32o73o39o109o32o102o101o101o108o105o110o103o10o71o111o116o116o97o32o109o97o107o101o32o121o111o117o32o117o110o100o101o114o115o116o97o110o100o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o10o32o10o78o101o118o101o114o32o103o111o110o110o97o32o103o105o118o101o32o121o111o117o32o117o112o10o78o101o118o101o114o32o103o111o110o110o97o32o108o101o116o32o121o111o117o32o100o111o119o110o10o78o101o118o101o114o32o103o111o110o110o97o32o114o117o110o32o97o114o111o117o110o100o32o97o110o100o32o100o101o115o101o114o116o32o121o111o117o10o78o101o118o101o114o32o103o111o110o110o97o32o109o97o107o101o32o121o111o117o32o99o114o121o10o78o101o118o101o114o32o103o111o110o110o97o32o115o97o121o32o103o111o111o100o98o121o101o10o78o101o118o101o114o32o103o111o110o110o97o32o116o101o108o108o32o97o32o108o105o101o32o97o110o100o32o104o117o114o116o32o121o111o117o

7. Wyjście znaku - 18 bajtów

$?:Zs0=0s-s:1s-++O

Sprawdza, czy wartość wejściowa jest większa od zera, mniejsza od zera (zmieniona na wartość -1zamiast zamiast 1) i równa zero, przed pobraniem ich sumy.

8. Hipoteza Collatza (OEIS A006577) - 36 bajtów

#$?:1-[:2s%{3×1+}2s÷]:1s-₀+₁]₀O

Wykonuje to zapętlenie na stosie, ale przełącza się na taśmę, aby zwiększyć liczbę kolejnych iteracji.

9. Tablica wyzwań nr 1: Tablice naprzemienne - 35 bajtów

#?>?>+>?[[<+<<->>>-]+<[-<<]>[>]?]<O

Jest to niewielka modyfikacja odpowiedzi Mitcha Schwartza na istniejące wyzwanie, idź do góry!

10. Czy jestem nieistotną tablicą? - 46 bajtów

$1 0-?…1[s:sr-:Z1s-2×1+×1s-Z1-L2s-×]1+Z1-O

Wszystko zasługa Emigna do podejmowania tego

11. Czy ta liczba jest liczbą pierwszą? - 31 bajtów

$?:1s-:[:1s-:];L1s[×L2s-]:×%O

Wykorzystuje twierdzenie Wilsona i oblicza (n-1)!² % n

12. Jestem palindromem. Jesteś? - 13 bajtów

$?:R=:O:=R:?$

Pierwsza połowa programu, aż do O, ustawia się w stos [x, x], gdzie xjest albo Truealbo False. Owyświetla najwyższą wartość i wysyła ją. Reszta programu upewnia się, że nie wystąpią żadne błędy. Na szczęście, gdy ?napotka koniec pliku, po prostu popycha ''(pusty ciąg).

13. Zsumuj liczby na standardowych calach - 19 bajtów

$?:[?:];L0s[+L1s-]O

Można to podzielić na dwie części: ?:[?:];i L0s[+L1s-]. Pierwsza część zbiera wszystkie dane wejściowe do stosu. Druga część przesuwa sumę dwóch górnych elementów, a długość jest większa niż 1.

14. Znajdź czynnik - 25 bajtów

$?:[:1s-:];L1s-Z[×L1s-]O

Ma podobną strukturę do programu sumującego, ale zamiast wypychać dane wejściowe LIPLE, przesuwa [:1s-:];zakres od 1 .. ndo stosu i [×L1s-]bierze produkt.

15. Najkrótszy kod do wygenerowania nieskończonego wyjścia - 5 bajtów

#+[O]

Użyj pętli while z 1ciągłym pod wskaźnikiem. Wydaje na 1zawsze.

16. Upiec kawałek Pi - 439 bajtów

$40o41o40o41o40o41o40o41o40o41o40o41o10o124o92o51o46o49o52o49o53o57o50o54o124o10o124o58o92o53o51o53o56o57o55o57o51o124o10o92o58o58o92o50o51o56o52o54o50o54o124o10o32o92o58o58o92o52o51o51o56o51o50o124o10o32o32o92o58o58o92o55o57o53o48o50o124o10o32o32o32o92o58o58o92o56o56o52o49o124o10o32o32o32o32o92o58o58o92o57o55o49o124o10o32o32o32o32o32o92o58o58o92o54o57o124o10o32o32o32o32o32o32o92o58o58o92o51o124o10o32o32o32o32o32o32o32o92o95o95o92o124o

17. Znajdź najmniejszą liczbę, która nie dzieli N

$?:1:[:rs%0=s1+srr:Rs]1s-O

Używa podziału próbnego, kończącego się, gdy wynik modulo nie jest równy 0.

18. Czy to jest parzyste czy nieparzyste? - 5 bajtów

$2?%O

Prosty moduł 2

19. Wyjście o takiej samej długości jak kod - 16 bajtów

$16:[32+:o33s-:]

Wysyła pierwsze 16 drukowalnych znaków ASCII w odwrotnej kolejności: 0/.-,+*)('&%$#"!

20. Zagraj w golfa na dobre!

$1[93, 76, 111, 91, 49, 59, 104, 48, 79, 49, 111, 54, 51, 0]
36o1O0h;1[oL]

Kredyt trafia do użytkownika202729 za dokonanie tego


Specyfikacja języka

Powołanie

bugle.pyobecnie pobiera serię flag, a następnie nazwę pliku / kod do wykonania. Na razie ma 4 flagi wiersza poleceń:

  • -f/ --fileokreśla, że ​​kod ma być odczytany z pliku
  • -c/ --cmd/ --cmdlineokreśla, że ​​kod jest dostarczany za pośrednictwem wiersza polecenia.

    -ci -fnie można ich używać w tym samym połączeniu

  • -u/ --unicodemówi tłumaczowi, aby odczytał kod z kodowaniem Unicode. Domyślnie jest używane kodowanie Bugle poniżej

  • -l/ --lengthprzekazuje długość pliku (w bajtach) do STDERR po wykonaniu

Do przetestowania powyższych zgłoszeń wykorzystano następujące wezwanie

$ python bugle.py -f -u [file]

Strona kodowa

Bugle używa 512 znaków na stronie kodowej. Postać nie ma być używany przez polecenia , jako, że stosuje się do wskazania, że następna wartość hex do indeksu w drugiej połowie strony kodowej. Używane znaki to:0xFF

ÀÁÂÄÆÃÅĀĄ\t\nĆČÇĎÐ
ÈÉÊËĒĖĚĘÌÍÎÏĪĮĹĽ
 !"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~¶
ŁŃŇÑŊÒÓÔÖŒÕØŌŔŘŚ
ŠŤŦÙÚÛÜŮŪŴÝŶŸŹŽŻ
àáâäæãåāąćčçďðèé
êëēėěęìíîïīįĺľłń
ňñŋòóôöœøōõŕřßśš
ťŧùúûüůūŵýŷÿźžż◊
ΑΆΒΓΔΕΈΖΗΉΘΙΊΚΛΜ
ΝΞΟΌΠΡΣΤΥΎΦΧΨΩΏ
αάβγδεέζηήθιίΐκλ
μνξοόπσςτυύΰφχψω
ώǴḰḾṔẂǵḱḿṕẃḂḞĠḢṀ
ȮṖṠṪẊḃḟġḣṁȯṗṡṫẋ§
ĂĞĬŎŬĴăğĭŏŭĵªº‹›
ƁƇƊƑƓƘⱮƝƤƬƲȤɓƈɗƒ
ɠɦƙɱɲƥʠɼʂƭʋȥ©®ıȷ
ЉЊЕРТЗУИОПШАСДФГ
ХЈКЛЧЋЅЏЦВБНМЂЖљ
њертзуиопшасдфгх
јклчћѕџцвбнмђжÞþ
†∂∆≈≠√∈∉∌∋∩∪¬∧∨⊕
¤₽¥£¢€₩‰¿¡⁇⁈‼⁉‽⸘
…°•”“„’‘≤«·»≥ᴇ∞¦
×⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾
÷₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎

Lub zobacz to w formacie tabeli . Zauważ, że \ti \nreprezentują odpowiednio tabulator i znak nowej linii. Zwróć również uwagę, że szesnasty wiersz kończy się drukowalnym znakiem: i może nie być wyświetlany we wszystkich przeglądarkach.

Pamięć

Interpreter ma obecnie wbudowanych 5 modeli pamięci. Każdy model pamięci wymaga znaku informującego tłumacza, aby zaczął korzystać z tego modelu:

  • Stack ( $): standardowy stos, który obsługuje wypychanie, wyskakiwanie wartości itp.
  • Infinite tape ( #): Taśma, à la brainfuck, która początkowo jest tylko 0s.
  • Infinite grid ( G): Siatka 2D, nieskończona w obu kierunkach, zawierająca tylko 0s
  • Deque ( D): Deque , zaimplementowane przez collectionsmoduł.
  • Register ( S): Pojedyncza wartość, której można użyć do przechowywania jednej wartości.

Siatka ma również pojedynczą wartość zapisaną we wskaźniku, którą można zapisywać w komórkach lub zapisywać w nich.

Ponadto rozmiary taśm i siatki oraz sposób zawijania można modyfikować za pomocą innego polecenia invoke. Te różne polecenia pobierają określoną liczbę wartości z bieżącego modelu pamięci jako parametry dostosowywania:

  • Tape ( À): Pobiera dwie wartości - size ( int) i wrapping ( bool)
  • Tape ( Á): Pobiera jedną wartość - size ( int). Owijki na końcu taśmy
  • Tape ( Â): Pobiera jedną wartość - size ( int). Na końcu się nie zawija
  • Grid ( Ǵ): Pobiera 4 wartości - x size ( int), y size ( int), x wrap ( bool) i y wrap ( bool)

Używany typ pamięci może się zmieniać podczas programu, dzięki ₀₁₂₃₄₅₆₇₈₉czemu uzyskuje się dostęp do nużywanego typu pamięci o indeksie 0 ( pierwszy, drugi itd.), Ale obecnie wartości nie można zamieniać między różnymi typami pamięci.

Rozgałęzienie

Do tej pory Bugle ma dwa polecenia rozgałęziające, oba zakończone ]znakiem:

  • While ( [): pętle while w stylu pieprzenia mózgu. Wyskakują one wartości ze stosu / deque, jeśli są używane, lub uzyskują dostęp do komórki pod wskaźnikiem na taśmie / siatce.

    Przykład: #?[-O]odlicza od wejścia do0

  • Jeśli / else ( {i }). Pojedyncze wykonanie podczas pętli. Jeśli wyskakująca wartość jest fałszywa, wówczas klauzula if jest pomijana, przechodząc do klauzuli else, oddzielając ją }. Zachowują się tak samo jak pętle while dotyczące dostępu do pamięci.

    Przykład: {0}1]jest logiczną bramką NOT

Wbudowane funkcje

Ciągi cyfr są interpretowane jako liczby całkowite i są po prostu wypychane / zapisywane w bieżącym modelu pamięci w obecnej postaci.

Oczywiście, wyposażyłem Bugle'a w kilka podstawowych wbudowanych funkcji, tak mało jak mogłem, aby inni mogli dodawać więcej w miarę postępu łańcucha. Podstawowe polecenia są następujące:

  • +

    • Stack / Deque: Dodaj dwie najlepsze wartości
    • Tape / Grid: Zwiększ bieżącą komórkę
  • -

    • Stack / Deque: Odejmij dwie najlepsze wartości
    • Tape / Grid: Zmniejsz bieżącą komórkę
  • %

    • Stack / Deque: Modulo dwie najlepsze wartości
  • :

    • Stack / Deque: Duplikuj najwyższą wartość
  • ;

    • Stack / Deque: Pop najwyższą wartość
    • Tape / Grid: Zeruj bieżącą komórkę
  • <

    • Tape / Grid: Przesuń w lewo o jedną komórkę
  • =

    • Stos: czy dwie górne wartości są równe?
    • Siatka: przesuń w dół o jedną komórkę
  • >

    • Tape / Grid: Przesuń w prawo o jedną komórkę
  • ?

    • Stack / Deque: Oceń wiersz danych wejściowych
    • Tape / Grid: weź znak wejściowy
  • L

    • Stack / Deque: Naciśnij długość stosu / deque
  • O

    • Wszystko: wyświetlenie aktualnej wartości
  • R

    • Stos: odwróć górny element, jeśli to możliwe, w przeciwnym razie odwróć stos
  • Z

    • Stos: górny element jest dodatni?
  • ^

    • Siatka: Przejdź w górę o jedną komórkę
  • h

    • Wszystko: wydrukuj pełny model pamięci
  • o

    • Wszystko: wydrukuj bieżącą wartość jako znak
  • r

    • Stos: Obróć 3 najwyższe wartości
    • Deque: Obróć nczasy deque , gdzie njest najwyższa wartość
  • s

    • Stack / Deque: Zamień dwie najlepsze wartości
    • Stos: Ustaw najwyższą wartość
  • ×

    • Stos: pomnóż dwie najwyższe wartości
    • Siatka: zapisz wartość wskaźnika do bieżącej komórki
  • ÷

    • Stos: podziel dwie najlepsze wartości
    • Siatka: zapisz bieżącą komórkę do wartości wskaźnika
Cairney Coheringaahing
źródło