Рассмотрим квадратный блок текста, шириной N символов и высотой N, для некоторого нечетного целого числа N больше 1.
В качестве примера пусть N = 5, а текст будет:
MLKJI
NWVUH
OXYTG
PQRSF
ABCDE
Обратите внимание, что это алфавит (кроме Z), вращающийся против часовой стрелки от левого нижнего угла. Это как свернутый ковер.
«Развертывание» текста на четверть оборота по часовой стрелке FGHI
находится на том же уровне, что и ABCDE
результат:
PONM
QXWL
RYVK
STUJ
ABCDEFGHI
Это развертывание может быть сделано еще 7 раз, пока текст не станет одной строкой:
SRQP
TYXO
UVWN
ABCDEFGHIJKLM
UTS
VYR
WXQ
ABCDEFGHIJKLMNOP
WVU
XYT
ABCDEFGHIJKLMNOPQRS
XW
YV
ABCDEFGHIJKLMNOPQRSTU
YX
ABCDEFGHIJKLMNOPQRSTUVW
Y
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
Вызов
Задача состоит в том, чтобы написать программу, представляющую собой блок текста размером N × N, который выводит число раз, которое она «развернула» на четверть оборота, когда она перегруппировывается в шаблоны развертывания и запускается.
Здесь действительно два конкурса: (надеюсь, это не будет слишком грязно)
- Сделайте это с наименьшим N. (до предела N = 3)
- Сделайте это с самым большим N. (без ограничений)
Не будет принятого ответа, но победитель в каждой из этих категорий получит от меня как минимум 50 представителей. В случае связей самые старые ответы выигрывают.
пример
Если ваш блок кода
MyP
rog
ram
запуск его как есть должен вывести 0.
Бег
rM
oy
ramgP
должен вывести 1.
Бег
or
ramgPyM
должен вывести 2.
Бег
o
ramgPyMr
должен вывести 3.
Наконец, при запуске ramgPyMro
должно появиться 4.
Детали
- Вывод должен быть напечатан в stdout (или ближайшей альтернативе) сам по себе. Там нет ввода.
- Вы можете использовать для печати только код ASCII (шестнадцатеричные коды от 20 до 7E, включая пробел).
- Пробелы заполняют пустое место в раскручивающихся механизмах. (Если только вы не развернетесь влево.)
- Только меры от полностью квадратного до полностью плоского должны иметь действительный вывод. Никаких других мероприятий не будет.
- Вы не можете читать свой собственный источник.
- Вы можете использовать комментарии.
- N = 1 исключено, так как на многих языках программа
0
будет работать. При желании вы можете развернуть влево, а не вправо. Так, например,
MyP rog ram
становится
Pg yo Mrram
и так далее. Никакие дополнительные пробелы не добавляются при переходе таким образом. Линии просто заканчиваются
(Связанный: Напишите Прямоугольную Программу, которая Выводит число раз, которое это было повернуто )
источник
Ответы:
Гольфскрипт, N <- [5,7 ..]
Полностью развернуто:
Объяснение:
.
(несколько раз) - дублировать ввод]
- собрать стек в один массив,
- взять его длину9\-
- вычтите это из 9#
- строка комментарияПробел - это NOP, но любой другой NOP работал бы так же хорошо.
Полностью свернутый, он использует девять копий ввода (содержимое игнорируется) в качестве стека; 9 - 9 = 0; это не было развернуто.
Каждая развертка скрывает еще одну точку (дубликат) за комментарием, сжимая стек один раз, увеличивая вывод.
Полностью развернутый, он использует только вход (содержимое игнорируется) в качестве стека; 9 - 1 = 8; это было развернуто 8 раз.
Тот же подход работает для любого N> 4: измените
9
на подходящее значение 2 * N + 1, затем расширьте шаблон точек (дубликат), используя тот же спиральный шаблон, который гарантирует, что ровно одна точка будет развернута при каждом развертывании.источник
GolfScript, N = 4
Это право катится как оригинальная спецификация.
Вот развернутые:
Попробуй здесь
источник
.
с и#
с?~
. Может быть, я могу украсть это для N = 3?APL, N = 3
раскатали:
Попробуйте онлайн.
Он вычисляет остаток от этого числа, деленного на 5. Печатается только результат последней строки.
APL, N = 2
раскатали:
Попробуйте онлайн.
≡
возвращает глубину (не путать с размером или длиной) массива:0
это не массив. Так что глубина равна 0.0∞
массив с двумя элементами0
и∞
(бесконечность) Он имеет глубину 1.0∞⍬
имеет другой элемент⍬
, который является пустым массивом с глубиной 1. Так же0∞⍬
имеет глубину 2.Эти две программы также работают в онлайн-переводчике. Я не уверен, является ли последний синтаксически правильным.
APL, для любого N> = 4
Для N = 4:
Полностью развернуто:
Для N = 5:
Полностью развернуто:
1↓
удаляет элемент в массиве Он также возвращает пустой массив, если аргумент скалярный.⍴
получает длину массива.источник
()[]
как они появятся в каком-то нежелательном месте.