Самореференциальная формула Таппера (скопировано из Википедии)
Самореференциальная формула Таппера - это формула, определенная Джеффом Таппером, которая, будучи построенной в двух измерениях в очень специфическом месте на плоскости, может быть «запрограммирована» для визуального воспроизведения самой формулы. Он используется в различных курсах математики и информатики как упражнение в построении графиков.
Где эта функция пола?
Позвольте k
быть следующим 543-значным числом:
960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
Если построить график точек (x, y)
в 0 <= x < 106
и k <= y < k + 17
удовлетворяющих неравенству, указанному выше, результирующий график выглядит следующим образом (обратите внимание, что оси на этом графике были перевернуты, в противном случае картина получается перевернутой):
И что?
Интересной особенностью этой формулы является то, что ее можно использовать для построения графиков любого возможного черно-белого изображения размером 106x17. Теперь, на самом деле поиск в поиске был бы чрезвычайно утомительным, поэтому есть способ выяснить значение k, в котором появляется ваше изображение. Процесс довольно прост:
- Начните с нижнего пикселя первого столбца вашего изображения.
- Если пиксель белый, к значению k будет добавлен 0. Если это черный, добавьте 1.
- Переместите колонку вверх, повторив шаг 2.
- Оказавшись в конце столбца, перейдите к следующему столбцу и начните снизу, следуя тому же процессу.
- После анализа каждого пикселя преобразуйте эту двоичную строку в десятичную и умножьте на 17, чтобы получить значение k.
Какая у меня работа?
Ваша задача - создать программу, которая может принимать любое изображение размером 106x17 и выводить соответствующее ему значение k. Вы можете сделать следующие предположения:
- Все изображения будут ровно 106х17
- Все изображения будут содержать только черные (# 000000) или белые (#FFFFFF) пиксели, между которыми ничего нет.
Там также есть несколько правил:
- Выход - это просто значение k. Он должен быть в правильной базе, но может быть в любом формате.
- Изображения должны быть прочитаны из PNG или PPM.
- Нет стандартных лазеек.
Тестовые изображения
[ ] должно выдать ~ 1.4946x10 542
[ ] должно выдать ~ 7.2355x10 159
[ ] должно выдать 2 1801 * 17
[ ] должен произвести (2 1802 -1) * 17
Проверьте этот Гист для точных решений.
Это код-гольф , поэтому выигрывает наименьшее количество байтов.
Полезные ссылки
quine
где-нибудь увижу слово .Ответы:
CJam, 16
С большой благодарностью Денису. Попробуйте онлайн
В случае, если у вас возникли проблемы с URL-адресом, я протестировал следующие данные:
Я использовал формат, сгенерированный GIMP при экспорте как ASCII pbm, с удаленным комментарием.
Объяснение:
источник
l;l~\qN-/W%zs:~2b*
должно работать так же хорошо.Pyth - 21 байт
Просто сделать с
i
базовым преобразованием пита . Принимает ввод какPBM
имя файла и читает, используя'
команду. Я должен был использовать,!M
чтобы отрицать черных и белых. Все остальное самоочевидно.Попробуйте здесь онлайн . (Веб-интерпретатор не может читать файлы, поэтому изменяется и принимает файл в качестве входных данных).
источник
Python 2:
133110 байтПервая попытка в Python с использованием PIL:
Благодаря полезным комментариям ниже
источник
from PIL import Image k=0 for a in range(1802):y=a%17;x=a/17;k=(0 if Image.open(input()).load()[x,16-y][0]else 1)+k*2 print k*17
a/17
и указатьa%17
соответствующие местоположения, а также можете злоупотреблять тем фактом, что 1 соответствует действительности, а 0 - ложно. Вот результат этих изменений, вы уменьшите размер до 111 байт :)input()
на каждой итерации цикла с этой модификацией. Редактирование с другими советами, хотя, спасибо.(...<1) --> 0**...
может быть?C #, 199
Это было весело! Нет ничего плохого в том, чтобы перезагрузить растровое изображение 106 * 17 раз, верно? Я сделал это как функцию, чтобы сохранить несколько байтов, не уверен, что это законно.
i
это имя входного файла.Кроме того, как одно выражение, просто потому, что это одно выражение с
i
предоставленным или вложенным (167 байт)источник
Mathematica 69 байтов
Binarize @ можно пропустить, если изображение в монохромном формате.
Эта функция будет воспроизводить изображение:
источник