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 знову не був нульовим, тому зовнішній цикл взагалі не може вийти (поки вхід перерви не перерве інтерпретатор), і ми повернемось у внутрішній цикл.
Найголовніше використовувати віднімання, щоб увійти до зовнішньої петлі, але додаток для продовження циклу навколо неї; додаток має коротше кодування, але не може з'являтися на початку програми (оскільки кодування виглядатиме як провідні нулі і, таким чином, ігнорується).