Написати квадратну програму, яка виводить кількість разів, коли вона була "розкручена"


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 Чи повинен я бути тотальним хуйком і також розмістити ліворуч розгортання рішення? :-)
Джон Дворак

Чому ні. Інша відповідь здається малоймовірною інакше: П
Захоплення Кальвіна

1
Чому б не піти на той, який може розгорнутися в обох напрямках? :)
бета-розпад

@BetaDecay hmm ... :-)
Джон Дворак

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↓видаляє елемент з масиву. Він також повертає порожній масив, якщо аргумент скалярний. отримує довжину масиву.


Будь-які пояснення?
гордий haskeller

@proudhaskeller Відредаговано.
jimmy23013

Ви в ідеалі можете використовувати ту саму логіку глибини для будь-якої Н. Завдяки APL
оптимізатору

@Optimizer Це не так просто. Речі перед останнім рядком все ж повинні бути синтаксично правильними. Тому я не можу використовувати більшість функцій або інших знаків пунктуації, як- ()[]от так, як вони з’являться в якомусь непотрібному місці.
jimmy23013

Я мав на увазі так: `⍬ \ n⍬⍬0 \ n≡ ∞` (Не зовсім так, але ви розумієте)
Оптимізатор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.