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 łańcuchem odpowiedzi, w 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ń:
- "Witaj świecie!" - Wyjście łańcucha
Hello, World!
- 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ępowanymiBuzz
i wielokrotnościami obu przezFizzBuzz
- Utwórz liczbę 2014 bez żadnych liczb w kodzie źródłowym - Wypisz liczbę 2014 bez użycia żadnego ze znaków
0123456789
w kodzie źródłowym, bez dostępu do zmiennych zewnętrznych lub losowych nasion - 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
,eor01
oraz27
(bez uwzględniania wielkości liter) 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
Nie jesteśmy obcy kodować golfa, znacie zasady, ja też - ja wypisuję pełny tekst piosenki „Never Gonna Give You Up”
- 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
- 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.
- 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
- 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
- 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
- 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
- Sumuj liczby na standardowym wejściu - weź ciąg liczb z STDIN i wyślij ich sumę.
- Znajdź czynnik - biorąc pod uwagę liczbę całkowitą
n
, wypisz iloczyn wszystkich liczb całkowitych między1
in
włącznie. - 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ć.
- Upiecz kawałek Pi - wypisz ten dokładny tekst:
()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
\::\433832|
\::\79502|
\::\8841|
\::\971|
\::\69|
\::\3|
\__\|
- 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.
- Czy to jest parzyste czy dziwne? - Biorąc pod uwagę liczbę całkowitą N, wyprowadzaj jej parzystość jako wartości prawda / fałsz.
- 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.
- 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:
- Utwórz tłumacza
- Utwórz quine zdolne do załadunku
- Potwierdź ciąg
- Hiperprogramowanie: N + N, N × N, N ^ N wszystko w jednym
- „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!
źródło
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ćfor
pętle) są dozwolone i zachęcane do dodawaniaOdpowiedzi:
3. Wynik:
293825832532 (-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)
5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - 95 bajtów (-3)
6. Nie jesteśmy obcy kodować golfa, znacie zasady i ja też - 1884 bajtów (-3)
16. Upiec kawałek Pi - 149 bajtów (-3)
20. Zagraj w golfa na dobre! - 23 bajty (-39)
Dodano funkcje językowe
a
#"Hello, World!"a
OdbitkiHello, World!
d
źródło
2. Wynik:
29382583Zmodyfikowany tłumacz jest dostępny w TIO .
Dosłowność łańcucha jest najbardziej oczywistym dodatkiem do języka, głównie w celu zwalczania problemów złożoności Kołmogorowa .
Rozwiązania
1. „Witaj, świecie!” - 20 bajtów (-28)
Każde wyzwanie złożoności Kołmogorowa 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 -
41964 bajtów (-1332)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)
Używa dwóch znaków 20 i 14 w współrzędnych kodowych Bugle.
4. Obfuscated Hello World - 19 bajtów (-153)
Spełnia zasady nr 1 (nie
HLWDhlwd
) i nr 3 (nie27
).5. Zaśpiewaj Happy Birthday w swoim ulubionym języku programowania - 98 bajtów (-230)
6. Nie jesteśmy obcy kodować golfa, znacie zasady i ja też - 1887 bajtów (-5006)
16. Upiec kawałek Pi - 149 bajtów (-290)
20. Zagraj w golfa na dobre! - 62 bajty (-12)
Dodano funkcję języka
"..."
: Dosłowny ciąg.\n
jest obsługiwany tak jak inne znaki."
(34) do pamięci za pomocą tego polecenia. Nie jest to zbyt duży problem, przynajmniej na razie, ponieważ wszystkie wymienione tutaj problemy złożoności kolmogorowa 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.
źródło
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
-u
flagą wiersza poleceń, ale wyniki są liczone tak, jakby były zakodowane za pomocą strony kodowej Bugle'a.1. „Witaj, świecie!” - 48 bajtów
Po prostu wciśnij, a następnie wypisz kod każdego znaku w ciągu.
2. 1, 2, Fizz, 4, Buzz - 1396 bajtów
Ta sama technika, co Hello, World! przykład
3. Wpisz liczbę 2014 bez liczb w kodzie źródłowym - 13 bajtów
#
używa taśmy,+
zwiększa komórkę,O
wyświetla dane jako liczbę całkowitą i-
zmniejsza4. Obfuscated Hello World - 172 bajty
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
Wszystkie wyzwania złożoności Kołmogorowa mają obecnie taką strukturę.
6. Nie jesteśmy obcy kodować golfa, znacie zasady, podobnie jak ja - 6893 bajtów
7. Wyjście znaku - 18 bajtów
Sprawdza, czy wartość wejściowa jest większa od zera, mniejsza od zera (zmieniona na wartość
-1
zamiast zamiast1
) i równa zero, przed pobraniem ich sumy.8. Hipoteza Collatza (OEIS A006577) - 36 bajtów
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
Jest to niewielka modyfikacja odpowiedzi Mitcha Schwartza na istniejące wyzwanie, idź do góry!
10. Czy jestem nieistotną tablicą? - 46 bajtów
Wszystko zasługa Emigna do podejmowania tego
11. Czy ta liczba jest liczbą pierwszą? - 31 bajtów
Wykorzystuje twierdzenie Wilsona i oblicza
(n-1)!² % n
12. Jestem palindromem. Jesteś? - 13 bajtów
Pierwsza połowa programu, aż do
O
, ustawia się w stos[x, x]
, gdziex
jest alboTrue
alboFalse
.O
wyś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
Można to podzielić na dwie części:
?:[?:];
iL0s[+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
Ma podobną strukturę do programu sumującego, ale zamiast wypychać dane wejściowe LIPLE, przesuwa
[:1s-:];
zakres od1 .. n
do stosu i[×L1s-]
bierze produkt.15. Najkrótszy kod do wygenerowania nieskończonego wyjścia - 5 bajtów
Użyj pętli while z
1
ciągłym pod wskaźnikiem. Wydaje na1
zawsze.16. Upiec kawałek Pi - 439 bajtów
17. Znajdź najmniejszą liczbę, która nie dzieli N
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
Prosty moduł 2
19. Wyjście o takiej samej długości jak kod - 16 bajtów
Wysyła pierwsze 16 drukowalnych znaków ASCII w odwrotnej kolejności:
0/.-,+*)('&%$#"!
20. Zagraj w golfa na dobre!
Kredyt trafia do użytkownika202729 za dokonanie tego
Specyfikacja języka
Powołanie
bugle.py
obecnie pobiera serię flag, a następnie nazwę pliku / kod do wykonania. Na razie ma 4 flagi wiersza poleceń:-f
/--file
określa, że kod ma być odczytany z pliku-c
/--cmd
/--cmdline
określa, że kod jest dostarczany za pośrednictwem wiersza polecenia.-c
i-f
nie można ich używać w tym samym połączeniu-u
/--unicode
mówi tłumaczowi, aby odczytał kod z kodowaniem Unicode. Domyślnie jest używane kodowanie Bugle poniżej-l
/--length
przekazuje długość pliku (w bajtach) do STDERR po wykonaniuDo przetestowania powyższych zgłoszeń wykorzystano następujące wezwanie
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
Lub zobacz to w formacie tabeli . Zauważ, że
\t
i\n
reprezentują 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:
$
): standardowy stos, który obsługuje wypychanie, wyskakiwanie wartości itp.#
): Taśma, à la brainfuck, która początkowo jest tylko0
s.G
): Siatka 2D, nieskończona w obu kierunkach, zawierająca tylko0
sD
): Deque , zaimplementowane przezcollections
moduł.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:
À
): Pobiera dwie wartości - size (int
) i wrapping (bool
)Á
): Pobiera jedną wartość - size (int
). Owijki na końcu taśmyÂ
): Pobiera jedną wartość - size (int
). Na końcu się nie zawijaǴ
): 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 don
uż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ą NOTWbudowane 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:
+
-
%
:
;
<
=
>
?
L
O
R
Z
^
h
o
r
n
czasy deque , gdzien
jest najwyższa wartośćs
…
×
÷
źródło