Перевірено оптимально!
((([()][()][()])))
Спробуйте в Інтернеті!
Пояснення
Brain-Flak, Brain-Flueue, Miniflak та Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Це відбитки:
-3
-3
-3
(Є останній новий рядок)
Brain-Flak Classic
Brain-Flak Classic є оригінальною версією Brain-Flak і має деякі важливі відмінності від сучасних Brain-Flak. У BFC [...]
друкується його вміст, а не нехтуючи його.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
В кінці виконання вміст стека ( 3 3 3
) друкується.
Це відбитки:
1
1
1
3
3
3
(Є останній новий рядок)
Флаккати
Flakcats сильно відрізняється від інших 4-х флаконів, і я здивований, що це працює у Flakcats. Три оператори тут майже такі ж, як і ті, які використовує Brain-Flak.
Основна відмінність цієї конкретної програми між Flakcats - це (...)
оператор, який у Flakcats еквівалентний ([{}]...)
у Brain-Flak. Це, однак, не має для нас значення, оскільки воно набирає нулі і, таким чином, діє так само, як робить Brain-Flak.
Ось ця програма, складена на Brian-Flak:
([{}]([{}]([{}][()][()][()])))
Це відбитки:
-3
-3
-3
(Є останній новий рядок)
Доказ оптимальності в роботі Brain-Flak та Miniflak
Це не формальний доказ, а скоріше неофіційний доказ, який потрібно було б розширити, щоб зробити його більш суворим
Через обмеження, що програми Brain-Flak повинні бути врівноваженим рядком, а довжина програми повинна бути кратною 3, будь-яке дійсне подання повинно бути кратним 6 довжиною. Це означає, що будь-який розчин менше 18 повинен бути довжиною 12.
Через виходи, що відкладають новий рядок, кінцева висота стека повинна бути кратною трьом, або ми порушимо обмеження на вихід.
Будь-яке дійсне подання довжиною 12 повинно мати два типи дужок (менша кількість б порушила обмеження на кількість різних символів, а більше означало б більше 12 символів). Оскільки програма виробляє вихід, вона повинна мати поштовх.
Це дозволяє нам вибрати інший набір брекетів. Варіанти:
<...>/<>
Це не вдається, тому що нам потрібно генерувати "значення", щоб створити будь-яке число, крім нуля, ми повинні відмовитися, ()
щоб створити таке, що унеможливлює натискання більше двох разів.
[...]/[]
Це не вдається з тієї ж причини, що минула помилка. Квадратні брекети дійсно погані на користь. []
Монада може створити цінність , але нам потрібно натиснути номери першими і ми тоді не вистачає круглих дужок залишилися натиснути три рази.
{...}/{}
Це багатообіцяючий, ми могли б створити цикл і використовувати його ()
для натискання декількох разів, але, на жаль, це неможливо.
Для того, щоб цикл закінчився, в стеку в якийсь момент повинен бути нуль, і для того, щоб у нас був правильний вихід, у кінці програми має бути щось інше, ніж нуль. Оскільки у нас немає []
ані <>
нуля на кінці циклу, повинно бути неявний нуль знизу стека. Це означає, що цикл не може додавати будь-які нові числа до стеку, роблячи його марним.
Оскільки жоден з варіантів дужок не може створити програму довжиною 12, жоден не може існувати.
Оскільки Miniflak є підмножиною Brain-Flak, будь-яка коротша програма Miniflak також буде коротшою програмою Brain-Flak і, таким чином, не існує.
Brain-Flueue - мова жарту, заснована на «Brain-Flak». Дві настільки схожі, що їхні перекладачі однакові скрізь, але два рядки. Різниця між ними полягає в тому, що їхні назви підказують, Brain-Flueue зберігає свої дані у чергах, тоді як Brain-Flak зберігає свої дані у стеки.
Для початку у нас є ті ж обмеження на розмір програми, створені Brain-Flak, тому ми шукаємо програму розміром 12. Крім того, нам знадобиться "a" (...)
для створення будь-якого виводу та іншої пари. <>
і []
пари не працюють в Brain-Flueue для тієї ж самої причини , що вони не працюють в Brain-Flak.
Тепер ми знаємо, що наша програма повинна складатися з персонажів ((())){{{}}}
.
За допомогою тих же методів, які використовувались у попередньому доказі, ми можемо продемонструвати, що в кінцевій програмі повинен бути цикл.
Тепер ось, де докази відрізняються, оскільки Brain-Flueue працює через черги, а не стеки, програма може вийти з циклу зі значеннями на черзі.
Для виходу з циклу нам знадобиться нуль у черзі (або порожня черга, але якщо черга порожня, ми отримуємо ту ж проблему, що і Brain-Flak), це означає, що нам доведеться відкрити нашу програму, ({})
щоб створити нуль. Нам знадобиться натиснути всередину циклу, щоб висунути необхідну кількість елементів до черги. Також нам потрібно буде натиснути нульове число перед циклом, щоб ми могли взагалі увійти до циклу; це обійдеться нам в абсолютному мінімумі (())
. Зараз ми використовували більше парен, ніж у нас.
Таким чином, не існує програми Brain-Flueue, яка б виконала завдання, що становить 12 байт, і, крім того, наша програма оптимальна.
Наступне рішення є оптимальним у Flakcats та Brain-Flak Classic.
((([][][])))
Пояснення
[][][] -3
((( ))) push 3 times
Альтернативні 24-байтні рішення Brain-Flak
(<((<((<(())>)())>)())>)
Спробуйте в Інтернеті!
((<((<((<>)())>)())>)())
Спробуйте в Інтернеті!
((((((()()()){}){}){})))
Спробуйте в Інтернеті!