Wskazówki do gry w golfa w> <> (Ryby)

14

Ponieważ ostatnio widzę więcej przesłanych > <> zgłoszeń, pomyślałem, że dobrym pomysłem może być utworzenie strony ze wskazówkami.

Trzymaj się jednej wskazówki na post, chyba że są one ściśle powiązane.

Oficjalny tłumacz języka Python

Tłumacz online (niektóre błędy są obecne, ale dobre w większości przypadków)

Sp3000
źródło
9
Właśnie zdałem sobie sprawę, patrząc na stronę esolang: twórca> <> ma nazwę, która może brzmieć jak „harpun”.
mbomb007
Jak mogę wydrukować nową linię u ryb?
Kapitan Man,
@CaptainMan Możesz wyświetlać punkty kodu za pomocą o, a ponieważ \nznak nowej linii to ASCII 10, możesz to zrobić ao.
Sp3000,
@Sp dzięki, próbowałem CRzamiast LFi naciskałem dzamiast a.
Captain Man,

Odpowiedzi:

5

Sprawdzanie względem 0

Używanie ?!zamiast 0=?zwykle oszczędza bajt.

Jednak tylko standard ?może być czasem lepszy, jeśli stać cię na trochę restrukturyzacji

?!vA
  B

przeciw

?vB
 A
Sp3000
źródło
4

Sprawdzanie EOF

Po osiągnięciu EOF> <> wypycha -1 na stos, który można sprawdzić na dwa sposoby:

:0(?
:1+?

W celu sprawdzenia EOF są to negacje, więc to, która z nich jest bardziej korzystna, zależy od struktury twojego programu.

Sp3000
źródło
3

Skacz, aby ominąć rozpoczęcie nowych linii

Rozpoczęcie nowej linii czasami oznacza marnowanie dużej ilości wiodących białych znaków w następnej linii. W takiej sytuacji skakanie może być przydatne.

Na przykład,

[lots of code here]>[loop body]v
                   ^ ......... <

można dopasować do jednej linii w taki sposób:

[lots of code here][loop body][jump]

Dla praktycznego przykładu, oto program Hello World w jednym wierszu:

"!dlroW ,olleH"l?!;oe0.
Sp3000
źródło
3

Użycie modułu w celu uproszczenia wprowadzania

To może być zbyt prosta wskazówka, więc jeśli tak, po prostu ją zastąpię lub usunę.

Powiedzmy, że chcesz wprowadzić dwa znaki „a” i „b” i zwrócić odpowiednio 1 i 2 dla każdego. Prawdopodobnie użyłbyś do tego warunkowych, ponieważ jest to najbardziej sensowne, a ja użyję bardziej skondensowanej formy dla tego konkretnego przykładu.

i:"a")+1+n

To sprawdza, czy dane wejściowe są większe niż „a” i dodaje 1. Ponieważ „a” zwróci 0 i „b” 1, da to 1 i 2. To całkiem nieźle się sprawdza, ale w przypadku naszego nakłady, możemy pójść jeszcze dalej.

i:3%n

W modzie 3, 97, który jest liczbowym odpowiednikiem „a”, staje się 1, a 98, który jest „b”, staje się 2. W przypadku dwóch różnych liczb gwarantowany jest mod, który daje unikalne wyniki dla obu. Dla więcej niż dwóch istnieje mod, który daje unikalne wyniki, ale nie mam umiejętności matematycznych, aby znaleźć najmniejszą w prosty sposób (np. Jeśli masz zestaw {100,101,102,103}, mod 104 dałby unikalne wyniki dla każda wartość w nim, ale niezbyt pomocna). Jednak w większości przypadków, gdy dane wejściowe są ograniczone do kilku znaków alfabetycznych, często można znaleźć mod, który działa.

Aby znaleźć najmniejszy moduł, który daje unikalne wyniki dla dwóch liczb, a i b, wykonaj następujące czynności. Weź wartość bezwzględną różnicy aib ( |a - b|) i znajdź najmniejszą liczbę n, która jej nie dzieli. np. dla 97 i 98, |98 - 97| = 1i tak 2 byłoby najmniejszym modem (ale dla naszego programu testowego daje to 1 dla 97 i 0 dla 98, więc mod 3 jest lepszy).

kapusta
źródło
3

Używanie skoków jako warunku

Czasami kończysz pisanie programów w> <>, które wymagają robienia różnych rzeczy po otrzymaniu różnych danych wejściowych. Zwykle używasz warunkowej ( ?) i zmieniaczy kierunku, aby to przeanalizować. W niektórych przypadkach działa to dobrze (szczególnie, gdy jest mniej typów danych do obsłużenia), ale czasem kończy się coś takiego. (Zignoruj ​​fakt, że ten kod można zmniejszyć za pomocą innych sztuczek, to tylko w celach demonstracyjnych)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

Chociaż jest to w porządku, ma trochę białych znaków (których osobiście nigdy nie lubię widzieć) i ma wiele powtórzeń ( =?vi .00n). Zamiast tego możesz użyć skoku i różnych linii jako warunkowych. Oto przykład:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

To goli 10 bajtów. Oto co się dzieje:

i: Raz duplikujemy dane wejściowe, abyśmy mogli je dwukrotnie ocenić

"a")$"b")+To może być swego rodzaju wskazówka, ale tutaj sprawdzam, czy dane wejściowe są większe niż znak „a”, a następnie czy są większe niż znak „b” i dodając wynik. Dla „a” da to 0, dla „b” 1, a dla „c” 2.

1+0$.To tam dzieje się magia; bierzemy wynik tego poprzedniego uproszczenia i dodajemy 1 (dając 1 dla „a”, 2 dla „b”, 3 dla „c”), a następnie naciśnij 0 i zamień wartości. Po osiągnięciu skoku nastąpi przejście do wiersza odpowiadającego wartości, którą przypisaliśmy tym postaciom (np. Wiersz 1 dla „a”). NB Linia 0 jest szczytem programu.

kapusta
źródło
1

Pisanie kodu, który może działać na dwa sposoby

Trampoliny (! ) są bardzo przydatne, gdy chcesz, aby twój kod był uruchamiany do przodu i do tyłu (lub w górę iw dół). Te scenariusze są nieco mało prawdopodobne, ale w przypadku palindromu lub podobnych wyzwań ta wskazówka może być przydatna.

Oto przykład: chcę raz uruchomić kod, a następnie przejść przez stos odrzucając wartości, aż osiągnę 0, a następnie zejść w dół. Wskaźnik wchodzi w tę pętlę z> . Możesz to zrobić za pomocą skoku, np

?!v80.>ao (powiedzmy, że najpierw chcę wydrukować nowy wiersz)

ale jeśli kod, który chcemy uruchomić raz (kod obok >) powoduje, że linia jest dłuższa niż 16 znaków, nie możemy już używać skoku w trzech znakach. Jest to jednak przykład, w którym bieganie do przodu i do tyłu jest banalne ...

?!v!?<>ao>

Idąc dalej, wypisujemy nowy wiersz, a następnie wciskamy, ?!vktóry odrzuca wartość, jeśli nie jest to 0, a następnie z powodu trampoliny pomijamy następny ?i cofamy się. To samo dzieje się i pętla trwa, dopóki nie osiągniemy 0.

Jest to dziwnie konkretny przykład, ale jest kilka (być może nie wiele) aplikacji.

kapusta
źródło