Nonogram является двумерным логическая головоломка , которая выглядит примерно так (скриншоты из игры Pixelo , моя любимая Nonogram игры):
Цель игры - выяснить, какое изображение кодируют эти цифры. Правила просты: число в столбце или строке означает, что где-то в этом столбце или строке столько полей заполнено в строке. Например, в нижнем ряду на изображении выше не должно быть заполненных полей, а в верхнем ряду должны быть заполнены все поля. Третий ряд снизу имеет 8 заполненных ящиков, и все они будут в ряд.
Два или более числа для одного и того же столбца или строки означают, что существует несколько «рядов» заполненных полей, с как минимум одним пробелом между этими длинами. Порядок сохранен. Например, в правом столбце вышеупомянутого изображения есть три заполненных прямоугольника, по крайней мере, один пробел под ними, а затем еще один заполненный прямоугольник.
Вот та самая загадка, почти завершенная:
(Икс не важны, это всего лишь подсказка, которую игрок оставляет для себя, чтобы сказать: «Этот квадрат определенно не заполнен». Подумайте о флагах в Сапер. У них нет смысла правил.)
Надеемся, что вы можете видеть, что, например, средние столбцы с подсказками, которые говорят «2 2», имеют два ряда по 2 длины, заполненные прямоугольниками.
Ваша миссия, если вы решите принять ее, - написать программу или функцию, которая создаст такую головоломку. Вам дан размер доски в виде единого целого числа (5 <= n <= 50) на стандартном вводе или в качестве аргумента (нет причины, по которой головоломка с неграммой должна быть квадратной, но для этого испытания это будет). После этого вам дадут серию из 1 и 0, представляющих заполненные и незаполненные квадраты на изображении соответственно. Первые n из них - это верхний ряд, затем следующий ряд и т. Д. Вы вернете или напечатаете для вывода на доску из 2 * 1 ячеек (потому что они выглядят лучше, и это дает вам место для двухзначных подсказок для столбца ), все они пустые, с подсказками, соответствующими входным данным.
Выходной формат
Образец
Входные данные:
./nonogram <<< '5 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0'
OR
n(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
Образ:
Выход:
1
2 1 2
3 2 1 2 3
+----------
3|
2 2|
1 1 1|
2 2|
3|
Входные данные:
./nonogram <<< '15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1'
Образ:
Выход:
1 1
1 1 3 3 5 5 3 3 1
7 2 3 2 4 2 3 210 2 3 0 4 215
+------------------------------
2|
1|
1|
1|
1|
1 1|
3 3 1 1|
1 5 1 1|
3 5 3|
1 5 1|
1 3 1|
1 1 1 1 1|
1 1 1 1 1 1 1 1|
11 3|
11 3|
Разъяснения
- Ваш вывод не должен быть решаемой загадкой. Не все нонограммы разрешимы, но это не ваша забота. Просто выведите подсказки, которые соответствуют вводу, делают ли они хорошую загадку или нет.
- Программа, которая принимает аргументы в командной строке, разрешена. Это вроде как сказано выше, но возможно ошибиться. Вот для чего нужны разъяснения.
- Печать
0
строки или столбца без заполненных полей является обязательной. Я нигде не говорю это словами, но это в примерах.
5<=n<=50
это спецификация, поэтому не может быть 3-значных чисел-
чем следовало бы?Ответы:
GolfScript, 128 символов
Ввод должен быть представлен на STDIN в виде чисел, разделенных пробелами.
Вы можете проверить пример здесь .
Код комментария:
источник
~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n](
сыграть в гольф до 123 символов: (по какой-то причине на lettercount.com написано 125 символов, если вы его скопируете, но, уверяю вас, это 123 символа). Некоторые части алгоритма были изменены, но большинство остается прежним. Я также изменил некоторые имена переменных (иметь переменную 9 - это разумно, но и запутанно), но вы можете изменить их обратно, если хотите.Руби, 216
255Хотя это не дает точный пример вывода, приведенный в вопросе, он соответствует спецификациям. Единственное отличие от примеров состоит в том, что я печатаю несколько ведущих пробелов / новых строк.
Пример:
Changelog:
chunk
вmap
.[nil]
вместо звонкаArray#compact
.источник
length(leading spaces + numbers to the left) == 2*n
иheight(leading newlines + numbers at the top) == n
... так до тех пор , как ваш монитор достаточно большой для3*n+1 × 2*n+2
персонажей, вы не должны дисквалифицировать меня. :)Руби, 434
источник
ruby $yourprogram <<< $input
но получилruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError)
.ruby nonogram.rb 2 1 0 0 1
для 2х20
четвертый-последний столбец во втором примере.+------
... строка тоже отступает на один лишний пробел.GolfScript
149147Код
Редактирование:
puts
с одним символом для сохранения еще одного символаДемоверсии онлайн
Несколько аннотированная версия кода
источник
Javascript (E6) 314
334 357 410Ungolfed
использование
N(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
N(15,[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1])
Редактировать историю
1 Удалено регулярное выражение, используемое для поиска столбцов. Overkill
2 Чем проще, тем лучше. Вывод в строку, а не в массив. Удалена вспомогательная функция FILL (F)
3 Еще проще. Я не могу сделать лучше, чем это. Все еще не может сравниться с Golfscript :(
источник
R, 384 символа
С отступами и некоторыми пояснениями:
Использование:
источник
С - 511
C определенно не был создан для форматирования вывода красиво. Количество символов включает только необходимые пробелы / новые строки.
Ввод из STDIN, числа разделены пробелами.
источник
Прошло несколько дней, и никто не ответил на python, так что вот моя (вероятно, довольно неудачная) попытка:
Python 2.7 -
404397380 байтВ скором времени я опубликую версию без гольфа, но на данный момент я думаю, что она довольно читабельна. :)РЕДАКТИРОВАТЬ: При написании ungolfed версии, я заметил некоторые улучшения, которые я мог сделать, чтобы это было довольно значительным! По какой-то причине, которую я не могу объяснить, теперь у него есть дополнительные символы новой строки вверху и пробелы слева (хотя я не думаю, что я что-то изменил), но он все еще соответствует спецификации.
Беззвучная версия идет!Ungolfed:
Для удобства чтения были внесены некоторые изменения (
g
разделены на три именованные функции, сложный список составлен изfor
циклов), но логически он работает точно так же.Вот почему это сбивает с толку, что этот не печатает лишние пробелы и переводы строк, в то время как гольф делает это. ¯ \ _ (ツ) _ / ¯
источник