Поради щодо гри в гольф в> <> (Риба)


14

Оскільки я останнім часом бачив більше > <> матеріалів, які плавали навколо, я подумав, що це було б хорошою ідеєю створити сторінку підказок.

Будь ласка, дотримуйтесь однієї підказки за повідомлення, якщо вони тісно не пов'язані.

Офіційний перекладач Python

Інтернет-перекладач (деякі помилки є, але добре для більшості випадків)


9
Я щойно зрозумів, переглядаючи сторінку esolang: творець> <> має ім'я, яке може звучати як "гарпун".
mbomb007

Як я можу надрукувати новий рядок у рибі?
Капітан Людина

@CaptainMan Ви можете виводити кодові очки за допомогою o, а оскільки новий рядок \nASCII 10, ви можете це зробити ao.
Sp3000

@ Спасибі, я намагався CRзамість цього LFі натискав dзамість a.
Капітан Людина

Відповіді:


5

Перевірка проти 0

Використання ?!замість, 0=?як правило, економить байт.

Однак ?іноді просто стандарт може бути кращим, якщо ви можете дозволити собі трохи реструктуризації

?!vA
  B

проти

?vB
 A

4

Перевірка наявності EOF

Коли EOF досягнуто,> <> натискає -1 на стек, що можна перевірити одним із двох способів:

:0(?
:1+?

З метою перевірки на EOF, ці два є запереченнями, тому який вигідніший залежить від структури вашої програми.


3

Перейти, щоб обійти початкові нові рядки

Почати новий рядок іноді означає витратити багато провідних пробілів на наступному рядку. У такій ситуації стрибки можуть бути корисними.

Наприклад,

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

можна зробити так, щоб він розміщувався на одній лінії так:

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

Для практичного прикладу ось програма Hello World в одному рядку:

"!dlroW ,olleH"l?!;oe0.

3

Використання модуля для спрощення введення даних

Це може бути занадто простим підказом, тому, якщо він є, я просто заміню його або видаляю.

Скажімо, ви хочете взяти введення двох символів "a" і "b" і повернути 1, і 2 відповідно для кожного. Ви, мабуть, використовуєте для цього умовні умови, оскільки це має найбільш сенс, і я буду використовувати для цього конкретний приклад більш стисну форму.

i:"a")+1+n

Це перевіряє, чи є вхід більшим за "a", і додає 1. Оскільки "a" поверне 0 і "b" 1, це дасть 1 і 2. Це робить роботу досить добре, але у випадку нашого Ми можемо піти ще далі.

i:3%n

У моді 3, 97, який є "a" s числовим еквівалентом, стає 1, а 98, що "b" s, стає 2. Для двох різних чисел гарантується мод, який дає унікальні результати для обох. Більше двох є мод, який дає унікальні результати, але я не маю математичної майстерності, щоб знайти найменший на простий спосіб (наприклад, якщо у вас є набір {100,101,102,103}, мод 104 дасть унікальні результати для кожне значення в ньому, але не дуже корисно). Однак у більшості випадків, якщо введення обмежується парою алфавітних символів, часто можна знайти мод, який працює.

Щоб знайти найменший модуль, який дає унікальні результати для двох чисел, a і, b, ви виконуєте наступне. Візьміть абсолютне значення різниці a і b ( |a - b|) і знайдіть найменше число, n, яке не ділить його. наприклад, для 97 і 98, |98 - 97| = 1і так 2 буде найменшим модом (але для нашої програми тестування це дає 1 для 97 і 0 для 98, тому мод 3 краще).


3

Використання стрибків як умовного

Інколи ви закінчуєте писати програми в <<>, які вимагають, щоб ви робили різні дії, отримуючи різні матеріали. Зазвичай ви використовуєте conditionals ( ?) та змінні напрямів, щоб проаналізувати це. У деяких випадках це добре працює (особливо, коли для входу є менше типів вводу), але іноді ви стикаєтесь із таким виглядом. (Ігноруйте той факт, що цей код можна зменшити за допомогою інших хитрощів, це лише для демонстрації)

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

Хоча це добре, у нього є пробіл (який я особисто ніколи не люблю бачити), і він має багато повторень ( =?vі .00n). Замість цього ви можете використовувати стрибок та різні лінії як свої умовні умови. Ось приклад:

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

Це голить 10 байт. Ось що відбувається:

i: Дублюємо вхід один раз, щоб ми могли його оцінити двічі

"a")$"b")+Це може бути свого роду підказка, але те, що я роблю тут, - це перевірити, чи є вхід більше символу "a", а потім, якщо він більше, ніж символ "b", і додавати результат. Для "a" це дасть 0, для "b", 1, а для "c" - 2.

1+0$.Тут відбувається магія; ми беремо результат цього попереднього спрощення і додаємо 1 (даючи 1 для "a", 2 для "b", 3 для "c"), потім натискаємо 0 і поміняємо значеннями. Коли ми досягнемо стрибка, він переміститься до рядка, відповідного значенню, яке ми призначили цим символам (наприклад, рядок 1 для "a"). NB Рядок 0 - це верхня частина програми.


1

Написання коду, який може працювати двома способами

Батути ( !) дуже зручні, коли ви хочете, щоб ваш код рухався вперед і назад (або вгору і вниз). Ці сценарії дещо малоймовірні, але для паліндрому або подібних проблем ця порада може бути корисною.

Ось приклад: я хочу один раз запустити деякий код, потім провести цикл через стек, відкидаючи значення, поки я не досягне 0, а потім спущусь вниз. Вказівник входить у цю петлю з >. Ви можете скористатися стрибком для цього, наприклад

?!v80.>ao (скажімо, я спершу хочу надрукувати новий рядок)

але якщо код, який ми хочемо запустити один раз (код минулого >) робить рядок довшим 16 символів, ми більше не можемо використовувати стрибок у три символи. Однак це приклад, коли бігати вперед і назад тривіально ...

?!v!?<>ao>

Йдучи вперед, ми друкуємо новий рядок, а потім натискаємо, ?!vякий відкидає значення, якщо воно не дорівнює 0, то через батут ми пропускаємо наступний ?і повертаємось назад. Те ж саме відбувається і цикл триває, поки ми не натиснемо 0.

Це дивно специфічний приклад, але є деякі (можливо, не багато) додатків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.