Lenguage (з stty +brkint -ignbrk
), оцінка 255, 3890951 байт
Програма складається з 3890951 байтів NUL (це є однією з найкоротших програм колишнього Lenguage; 3890951 байт досить малий, щоб вміститися на моєму диску, тому я фактично запустив це в інтерпретаторі Lenguage). ОП хотіла, щоб рішення "Ленгуаг / Унар" було розігране в гольфі, тому ми йдемо. (Зауважте, що Unary буде набагато довше, оскільки це вимагає використання, 0
а не дозволення використання NUL.)
Зауважте, що Ленгуаґе, незважаючи на те, що передбачає його документація, не діє так, як це робить епізод; I / O працює зовсім інакше (те, що я помітив при тестуванні цієї програми). Зокрема, Lenguage відмовляється брати вхід із чогось іншого, крім терміналу, тому байти, які відфільтровуються, - це необроблені байти, що надсилаються через термінальне з'єднання (зауважте також, що фільтруючи необроблені байти, ви не побачите клавіші, які ви взагалі вводите). На практиці це означає, що програма поглинає будь-який вид вхідних даних, окрім байта NUL (типово типізованого як Ctrl-@), який буде перегукуватися буквально (в цей момент переважна більшість терміналів проігнорує його, оскільки байт NUL є термінальним еквівалентом інструкції NOP). Щоб переконатися, що програма працює, вона '
Що відбувається на EOF? Ну, якщо термінал надсилає серію байтів, немає можливості відправити EOF; всі 256 можливих байтів інтерпретуються буквально, і нічого іншого ви не можете вставити в термінальний потік. Однак якщо ви користуєтеся старомодним послідовним терміналом, ви можете натиснути кнопку "перерва" на своєму терміналі, щоб навмисно надіслати неправильно кодовані дані, що дозволяє отримати 257-й можливий код; ця "перерва" є єдиним правдоподібним еквівалентом EOF, оскільки він надсилається поза межами діапазону і вказує щось інше, ніж дійсні дані. Якщо у вашій конфігурації термінала встановлено прапор "перерва на перерву" (а інтерпретатор Lenguage, наскільки я можу сказати, не змінює це налаштування), надсилання сигналу перерви спричинить збій інтерпретатора Lenguage, що зручно виступає способом реалізації бажаної поведінки EOF. Я не впевнений, чи це налаштування за замовчуванням (тому що насправді ніхто не використовує послідовні термінали, в основному він ніколи не з'являється), тому я згадав про це у заголовку як частину специфікації використовуваного інтерпретатора мови.
Пояснення
1110110101111100000111
001 Initialise tape element 0 to -1
110 111 While tape element 0 is nonzero:
110 111 While tape element 0 is nonzero:
101 Read a byte from the terminal into tape element 0
100 Output tape element 0
000 Add 1 to tape element 0
Внутрішній цикл вийде лише тоді, коли на терміналі буде набрано NUL; після цього ми одразу повторюємо введений символ (тобто NUL). Додавання 1 у цьому пункті забезпечить, щоб елемент стрічки 0 знову не був нульовим, тому зовнішній цикл взагалі не може вийти (поки вхід перерви не перерве інтерпретатор), і ми повернемось у внутрішній цикл.
Найголовніше використовувати віднімання, щоб увійти до зовнішньої петлі, але додаток для продовження циклу навколо неї; додаток має коротше кодування, але не може з'являтися на початку програми (оскільки кодування виглядатиме як провідні нулі і, таким чином, ігнорується).