Pure Sourcery - формування програм, які виводять цифри від 0 до 9


21

Ось пікселізований шрифт від 5 до 7 для цифр від 0 до 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Цей шрифт і ця сторінка, ймовірно, будуть виглядати краще, якщо ви запускаєте цей код JavaScipt у консолі браузера або в рядку URL-адреси з префіксом javascript::. $('#question pre,.answer pre').css('line-height',1))

Напишіть два прямокутні блоки тексту рівного розміру, один для зображення порожніх пробілів ( .) у шрифті вище, а один для заповнення пробілів ( ).

Коли ці два текстові блоки розташовані у тому самому шарі 5 × 7, що і одна з цифр вище, то в результаті великий великий текстовий блок повинен бути програмою, яка друкує цю цифру для stdout. Це має працювати для всіх 10 цифр.

Наприклад, якщо ваш .текстовий блок був

---
'''

і ваш текстовий блок був

ABC
123

потім програма

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

повинен вивести 0. Аналогічно програма

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

повинен виводити 1і так далі до програми для 9.

Ви можете використовувати цей фрагмент стека, щоб зробити програми з цифровою формою:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

Деталі

  • Жодна з 10 великих програм текстового блоку не потребує введення. Виведіть лише одну цифру плюс необов'язковий кінцевий новий рядок. Вихід до stdout або подібної альтернативи.
  • Жодна з програм не може читати або отримати доступ до власного вихідного коду. Ставтесь до цього, як до суворої проблеми з королевою .
  • Текстові блоки можуть бути не тотожними і повинні мати ненульові розміри.
  • Текстові блоки можуть містити будь-які символи, крім терміналів рядків .
  • 10 програм повинні бути повноцінними програмами, написаними однією мовою, вони не є фрагментами REPL . Ви можете за бажанням додати зворотний новий рядок до всіх або жодної.

Оцінка балів

Ваш результат - це площа (ширина разів висота) одного з ваших текстових блоків. (Вони однакового розміру, тому немає сенсу рахувати обидва блоки.) Площа прикладу - 3 на 2, для оцінки 6.

Виграє найнижчий бал. У разі зв’язків, виграє відповідь, що найбільше голосує.


У своєму коді ви можете значно покращити його. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");можна записати як var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, що однаково, але коротше. Є ще кілька речей, які ви можете вдосконалити, але це виглядає чудово!
Ісмаїл Мігель

4
@IsmaelMiguel TBH Я передавав це через міні-мініатюру JS, щоб отримати його на одній лінії. Це ніколи не було призначено для гри в гольф.
Захоплення Кальвіна

О, чувак ... Це трохи ліниво ... У гольф-питанні ви надсилаєте код, який не займається гольфом ... Але ей, я це розумію, і я просто говорю це. Не потрібно слідувати тому, що я сказав. Але це добре робити.
Ісмаїл Мігель

6
@IsmaelMiguel Я опублікував невідомі утиліти , які, мабуть, повинні бути максимально читабельними, щоб помилки було легше помітити. Але насправді, доки він працює, розмір коду фрагмента стека має буквально нульовий вплив на результат завдання.
Захоплення Кальвіна

3
text blocks may not be identicalсправді? Я хочу, щоб хтось порушив це правило, давши два однакові кодові блоки, які магічно повертають різні цифри, коли кожне число точно такий же код ^^
Falco

Відповіді:


13

CJam, 20 18 14 13 12 * 1 = 12

Спробуйте в Інтернеті: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Порожній блок

];BG*K+ :BD%

Суцільний блок

];B9+33%:B4/

Пояснення

Я використовував подібну стратегію до рішення Sp3000 , таким чином, що кожен блок виконує множення, додавання та (можливо) модульну операцію на змінній та зберігає значення назад. Щоб знайти оптимальне рішення, я використав стару добру грубу силу. Я написав програму, яка шукає простір усіх можливих початкових значень (початкові значення змінних CJam) та багатьох мільйонів можливих пар функцій перетворення, таким чином, що вихід для кожної цифрової форми є унікальним. Потім я відфільтрував результати за тими, що кінцевий результат для розрядних форм, що закінчуються порожнім блоком, яких налічується 8, можна повернути до правильного результату за допомогою іншої формули множення, додавання та модуля.

Через пару днів пошукових процесорів найкращий результат поки що зменшився до 12! Це рішення починається зі значення 11, функція перетворення x * 16 + 20порожнього блоку - функція результату порожнього блоку, функція x % 13перетворення (x + 9) % 33твердого блоку - функція результату твердого блоку x / 4.


23

> <> (Риба) , 5 * 10 = 50

Порожній блок

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Суцільний блок

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Цей код не містить логіки чи арифметики, використовує лише статичні перенаправлення 2D вказівника інструкції (IP) з "дзеркалами" ( /і \) та двома "стрілками" ( <і v). Єдиний інший контролер потоку - «батут» ( !), який переходить через наступний символ.

IP починається з верхнього лівого кута, заголовок на Схід. Після деяких перенаправлень він доходить до числа, його висувають на стек і роздруковують, nі програма закінчується ;.

Потік програми

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


Я сподівався на таку відповідь. Чиста магія.
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

Порожній блок:

];G)B%:G"73860594"=

Суцільний блок:

];GW*B+3*D%:G    7-

Спробуйте в Інтернеті .

Я намагаюся пощастити з математичними збігами та невдачами, тому ось дещо інший підхід до відображення унікальності від рішення Мартіна.

Почніть з 16. Порожні блоки додайте 1 і візьміть за модулем 11. Суцільні блоки помножте на -1, додайте 11, помножте на 3, потім візьміть по модулю 13. Це магічне відображення 03456789(цифри, які закінчуються на порожньому блоці), до 41753026якого ми використовуємо індексацію вийти правильно. 12карти акуратно, до 89яких ми можемо виправити віднімання 7.


7

CJam, 28 27 x 1 = 27

Ось початок.

Порожній блок

U):U;                       

Суцільний блок

];U):UW+:WF%"1302986_7_54"=

Тестуйте це тут. Я не можу дати вам постійну посилання з кодом, тому що код занадто довгий, тому вам доведеться скопіювати його вручну з фрагмента, коли виклик.

Ідея полягає в тому, щоб набрати форму наступним чином:

  • Для кожного приросту "пікселя" лічильник U.
  • Для кожного чорного "пікселя" додайте Uдо поточної суми W(яка починається з -1). Наприкінці ми беремо цей модуль 15, який дає унікальні результати, які використовуються для індексації у рядок пошуку.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.