Напишите квадратную программу, которая выводит количество раз, когда она была «развернута»

22

Рассмотрим квадратный блок текста, шириной 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, который выводит число раз, которое она «развернула» на четверть оборота, когда она перегруппировывается в шаблоны развертывания и запускается.

Здесь действительно два конкурса: (надеюсь, это не будет слишком грязно)

  1. Сделайте это с наименьшим N. (до предела N = 3)
  2. Сделайте это с самым большим 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
    

    и так далее. Никакие дополнительные пробелы не добавляются при переходе таким образом. Линии просто заканчиваются

(Связанный: Напишите Прямоугольную Программу, которая Выводит число раз, которое это было повернуто )

Кальвин Хобби
источник
Прежде чем я прочитал параграф «вызов», я ожидал, что задача будет написать программу, которая сама себя развернет
Джон Дворжак,
1
почему N должно быть нечетным?
Джон Дворжак
1
@JanDvorak Полагаю, N не должно быть странным, но это делает спирали более стандартизированными. Это так, но не стесняйтесь публиковать N = 2 в качестве комментария, если вы его найдете.
Увлечения Кэлвина
8
Просто идея: развертывание «ковра» вправо создает много строк, начинающихся с пробела, исключая такие языки, как Python. Если вы позволите развернуть влево, вам не понадобятся дополнительные пробелы, и Python (теоретически) возможен.
Фалько
5
У вас есть волшебная книга с бесконечными идеями? Как еще вы продолжаете сталкиваться с такими интересными проблемами?
Джастин

Ответы:

27

Гольфскрипт, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Полностью развернуто:

],9\-#  .   .  .  . . ...

Объяснение:

  • . (несколько раз) - дублировать ввод
  • ] - собрать стек в один массив
  • , - взять его длину
  • 9\- - вычтите это из 9
  • # - строка комментария

Пробел - это NOP, но любой другой NOP работал бы так же хорошо.

Полностью свернутый, он использует девять копий ввода (содержимое игнорируется) в качестве стека; 9 - 9 = 0; это не было развернуто.

Каждая развертка скрывает еще одну точку (дубликат) за комментарием, сжимая стек один раз, увеличивая вывод.

Полностью развернутый, он использует только вход (содержимое игнорируется) в качестве стека; 9 - 1 = 8; это было развернуто 8 раз.

Тот же подход работает для любого N> 4: измените 9на подходящее значение 2 * N + 1, затем расширьте шаблон точек (дубликат), используя тот же спиральный шаблон, который гарантирует, что ровно одна точка будет развернута при каждом развертывании.

Джон дворак
источник
Ну, если кто-то не найдет N = 3, это будет победным ответом в обеих категориях.
Увлечения Кэлвина
3
@ Calvin'sHobbies Должен ли я быть полным хером и выложить решение для развёртывания влево? :-)
Джон Дворак
Почему бы нет. Другой ответ кажется маловероятным в противном случае: P
Увлечения Кэлвина
1
Почему бы не пойти на тот, который может развернуться в обоих направлениях? :)
Beta Decay
@BetaDecay хм ... :-)
Джон Дворжак
13

GolfScript, N = 4

Это право катится как оригинальная спецификация.

.. . 
...# 
.#.~
],8-

Вот развернутые:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Попробуй здесь

оптимизатор
источник
Как вы думали об этой договоренности?
гордый haskeller
3
@proudhaskeller Лучше, если вы не знаете ...
Оптимизатор
8
Вы искали решение?
гордый haskeller
Особая задача: вы можете сделать один из .с и #с?
Джон Дворжак
Мне нравится трейлинг ~. Может быть, я могу украсть это для N = 3?
Джон Дворжак
9

APL, N = 3

201
340
5|0

раскатали:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Попробуйте онлайн.

Он вычисляет остаток от этого числа, деленного на 5. Печатается только результат последней строки.

APL, N = 2

⍬∞
≡0

раскатали:

  ⍬
≡0∞

≡0∞⍬

Попробуйте онлайн.

возвращает глубину (не путать с размером или длиной) массива:

  • 0это не массив. Так что глубина равна 0.
  • 0∞массив с двумя элементами 0и (бесконечность) Он имеет глубину 1.
  • 0∞⍬имеет другой элемент , который является пустым массивом с глубиной 1. Так же 0∞⍬имеет глубину 2.

Эти две программы также работают в онлайн-переводчике. Я не уверен, является ли последний синтаксически правильным.

⍬0
≡∞


⍬¯
≡0

APL, для любого N> = 4

Для N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Полностью развернуто:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Для N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Полностью развернуто:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓удаляет элемент в массиве Он также возвращает пустой массив, если аргумент скалярный. получает длину массива.

jimmy23013
источник
Есть объяснения?
гордый haskeller
@proudhaskeller Отредактировано.
jimmy23013
В идеале вы можете использовать одну и ту же логику глубины для любого N. Благодаря APL
Оптимизатору
@ Оптимизатор Это не так просто. Вещи до последней строки все еще должны быть синтаксически правильными. Поэтому я не могу использовать большинство функций или других знаков препинания, например, так ()[]как они появятся в каком-то нежелательном месте.
jimmy23013
Я имел в виду: `⍬ \ n⍬⍬0 \ n≡ ∞` (не совсем так, но вы поняли)
Оптимизатор