Jakie masz ogólne wskazówki na temat gry w golfa w Befunge? Szukam pomysłów, które można by zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla Befunge (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
12
Odpowiedzi:
Korzystając z pętli wieloliniowej, spróbuj użyć jej jak najwięcej:
vs
źródło
Chcesz usunąć wartość po warunkowym (np. Ponieważ inna ścieżka zależy od wartości, ale ta nie)? Zamiast używać
>$
lub$<
, skorzystaj z faktu, że znasz prawdziwą wartość zmiennej i użyj_
zamiast tego zarówno do zmiany kierunku, jak i stosu pop.Przykład
zamienia się w
źródło
Nie zapominaj, że
0
zawsze jest na stosie. Na przykład oznacza to, że przy pustym stosieg
jest równoważne00g
ip
równoważne000p
.źródło
Jeśli musisz nacisnąć liczbę większą niż 15, użyj,
'
aby pobrać wartość ASCII następnego znaku:wcisnąć 42 zamiast:
źródło
67*
też działa'
instrukcji.Zamiast używać
|
, wymagając innej linii (często z wieloma dodatkowymi spacjami), spróbuj użyćj
. Na przykład:zatrzymałby się, gdyby liczba na górze stosu była ujemna, i kontynuowałaby w przeciwnym razie. Jeśli potrzebujesz wielu znaków, użyj
n*j
gdzien
to liczba znaków, której potrzebujesz, gdy przekazana wartośćj
to0
. Przykład:co neguje liczbę ujemną.
źródło
j
instrukcji.W Befunge-93, jeśli pierwszą rzeczą, którą naciskasz na stos, jest sznurek, często możesz uciec od upuszczenia cytatu otwierającego. Na przykład to:
można to uprościć:
Wypróbuj online!
Co się dzieje, interpreter najpierw próbuje wykonać znaki w niecytowanym ciągu. Do
!
wykonuje nieszkodliwy nie , ai
iH
nie są ważne instrukcje, więc są one ignorowane (chociaż w niektórych implementacjach może pojawić się ostrzeżenie).Po
"
napotkaniu jest to uważane za początek łańcucha, ale ponieważ nie ma cytatu zamykającego, owija się wokół pola gry, aż"
napotka ponownie. To, co ostatecznie trafia na stos, to:Ponieważ zależy nam tylko na kilku ostatnich postaciach, żadne z tych innych rzeczy nie ma znaczenia. Więc po cytacie w końcu możemy wykonać trzy
,
polecenia, wypisać wiadomość i@
polecenie, które wychodzi.Zauważ, że zazwyczaj nie działa to w Befunge-98, ponieważ nierozpoznana instrukcja spowoduje, że interpreter będzie się zastanawiał, zamiast go ignorować.
źródło
",,,@!iH
. Zauważ, że Pyfunge dodaje dodatkowe miejsce, podczas gdy FBBI nie.W Befunge-93 często może być korzystne spłaszczenie pętli do pojedynczej linii, przy czym sekcja pętli kodu jest wykonywana w obu kierunkach.
Rozważmy na przykład poniższy kod, który wysyła literę
a
osiem razy:Można to spłaszczyć spłaszczić do pojedynczej linii, przerywając sekwencję pętli instrukcjami mostkowania (
#
):Wypróbuj online!
Jeśli patrzysz tylko na znaki niebiałe, możesz odnieść wrażenie, że jest on dłuższy niż oryginał. Ale gdy weźmiesz pod uwagę wysuw linii i dodatkowe wypełnienie wymagane w wersji dwuwierszowej, w rzeczywistości oszczędzasz cztery bajty.
W tym konkretnym przypadku kod można jeszcze bardziej skompresować, zauważając, że sekwencję tę
:#:
można po prostu zastąpić:
.Wypróbuj online!
W rzeczywistości, za każdym razem, gdy ta sama instrukcja jest powtarzana po obu stronach
#
polecenia, możesz uprościć to do jednej instrukcji, więc jest to coś, na co powinieneś zawsze zwracać uwagę podczas spłaszczania pętli.Aby zrozumieć, jak to działa, pomocne może być napisanie sekwencji pętli dwa razy, raz ze wszystkimi znakami po
#
usuniętym (tj. Co dzieje się podczas wykonywania od lewej do prawej), a raz ze znakami poprzedzającymi#
usuniętą (tj. Wykonywanie od prawej do lewej ).Teraz możesz wyraźnie zobaczyć, jak to pasuje do oryginalnej dwuliniowej wersji kodu.
źródło
Dane wyjściowe według kodu wyjścia, jeżeli jest to dozwolona postać wyjściowa. Jeśli wyzwanie wymaga wydrukowania jednego numeru, możesz zapisać bajt, kończąc program
q
zamiast zamiast.@
źródło
q
instrukcja miała inną funkcję (tryb kolejki) lub nie była obsługiwana.W Befunge-93 komenda wprowadzania znaków (
~
) może być często używana jako skrót dla -1, ponieważ jest to wartość zwracana na EOF.Na przykład poniższy kod wyświetli -1:
Wypróbuj online!
Nie jest to zalecane w kodzie produkcyjnym, ponieważ podczas działania w środowisku interaktywnym program wstrzymuje się i czeka na dane wejściowe użytkownika. I oczywiście, jeśli użytkownik coś wprowadzi, wynik nie będzie już wynosił -1.
To powiedziawszy, zasada PPCG jest taka, że program może przyjmować pusty strumień wejściowy , i tak zwykle będzie działał na TIO .
Zauważ też, że niekoniecznie jest wykluczone korzystanie z tej sztuczki tylko dlatego, że twój program musi odczytać coś ze strumienia wejściowego. Musisz tylko upewnić się, że przetworzysz swoje dane wejściowe z góry, po czym wszystkie przyszłe zastosowania
~
powinny zwrócić -1.źródło
Używaj kierunku IP, gdy masz do czynienia z,
_
lub|
zamiast używać dodatkowego znaku dla!
.Prawdziwy przykład (z tego postu ):
Można zmienić na
źródło
Nie zapominaj, że
0k
nie wykonuje następnej instrukcji. Oznacza to, że zamiast robić:Możesz uratować postać, robiąc to
źródło
k
instrukcji.Nie zapomnij o
k
operatorze. Zamiast"!dlroW olleH",,,,,,,,,,,,@
zrobić"!dlroW olleH"bk,@
. Zauważ, żek
operacja na komórce, w której się znajduje ,9k,
spowoduje wydrukowanie nie 9 razy, ale 10; 9 razy zk
i raz z,
.źródło
k
instrukcji.Kiedy wypychasz małe liczby na stos, prawdopodobnie łatwo zorientujesz się, że
45*
dostaniesz cię20
i67*
dostaniesz42
. Jeśli jednak chodzi o większe liczby, naprawdę potrzebujesz programu, który może obliczyć najbardziej wydajną reprezentację dla Ciebie.Najłatwiejszą opcją jest interfejs online Mike'a Schwörera dla BefunRep . Wystarczy wpisać liczbę, aby wypluł równoważną reprezentację Befunge. Nie zawsze jest najbardziej optymalny, ale jest wystarczająco blisko i prawie na pewno będzie lepszy niż cokolwiek, co można wymyślić ręcznie.
System online jest ograniczony do liczb z zakresu od 0 do 16777215, więc jeśli potrzebujesz czegoś większego, musisz pobrać samodzielne narzędzie BefunRep i samodzielnie wykonać obliczenia.
Jeśli programujesz w Befunge-98, inną opcją do rozważenia jest Fungify . Zasadniczo nie jest to tak optymalne jak BefunRep, ale w przypadku niektórych niższych liczb, gdzie cyfry szesnastkowe i znaki pojedynczych cudzysłowów są najbardziej skuteczne, może czasem dawać lepsze wyniki.
źródło
'
. Np. Dla42
:'*