Pure Sourcery - Формирование программ, которые выводят цифры от 0 до 9

21

Вот пиксельный шрифт 5 на 7 для цифр от 0 до 9:

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

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

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

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

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

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

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

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

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

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

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

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

Когда эти два текстовых блока расположены в одном и том же шаблоне 5 × 7, как одна из цифр выше, тогда полученный большой текстовый блок должен быть программой, которая печатает эту цифру в стандартный вывод. Это должно работать для всех 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 больших программ с текстовыми блоками не требует ввода. Выведите только одну цифру плюс дополнительный завершающий перевод строки. Вывод на стандартный вывод или подобную альтернативу.
  • Ни одна из программ не может читать или получать доступ к своему собственному исходному коду. Относитесь к этому как к строгой проблеме Куайна .
  • Текстовые блоки могут не совпадать и должны иметь ненулевые размеры.
  • Текстовые блоки могут содержать любые символы, кроме разделителей строк .
  • 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 Я опубликовал незагрязненный служебный код, который, возможно, должен быть как можно более читабельным, чтобы легче было обнаруживать ошибки. Но на самом деле, пока он работает, размер кода фрагмента стека в буквальном смысле не влияет на результат испытания.
Увлечения Calvin
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.

Runer112
источник
23

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

Пустой блок

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

Сплошной блок

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

В этом коде нет логики или арифметики, используются только статические перенаправления указателя 2D-инструкции> <> с «зеркалами» ( /и \) и двумя «стрелками» ( <и v). Единственный другой контроллер потока - это «батут» ( !), который прыгает через следующий символ.

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

Поток программы

Блок «распознает» текущее состояние программы из того факта, что в какой момент IP-адрес пришел, и на основе состояния он решает, в каком направлении ему следует освободить указатель (какой блок должен быть выполнен следующим) и в какой точной позиции указатель должен остаться (что будет новым состоянием). Конечно, блоки не выполняют никакой логики, все это поведение происходит от перенаправителей.

randomra
источник
Я надеялся на такой ответ. Чистая магия.
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.

Sp3000
источник
7

CJam, 28 27 x 1 = 27

Вот начало.

Пустой блок

U):U;                       

Сплошной блок

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

Проверьте это здесь. Я не могу дать вам постоянную ссылку с кодом, потому что код слишком длинный, поэтому вам придется скопировать его вручную из фрагмента в задании.

Идея состоит в том, чтобы хэшировать форму следующим образом:

  • Для каждого «пиксельного» приращения счетчик U.
  • Для каждого черного «пикселя» добавьте Uк промежуточному итогу W(который начинается с -1). В конце мы возьмем это по модулю 15, которое дает уникальные результаты, которые используют для индексации в строке поиска.
Мартин Эндер
источник