Ревный «Quick Brown Fox» «прыгнул» по заводной спирали

12

Вступление

Напишите программу для вывода исходящей спирали знаменитой панграммы в соответствии с заданными правилами.

Вызов

Панграмма это предложение , используя каждую букву данного алфавита , по крайней мере один раз. Одна из самых известных панграмм широко используется в средстве просмотра шрифтов Windows, а именно: « Быстрая коричневая лиса перепрыгивает через ленивую собаку ». Задача состоит в том, чтобы вывести спираль на основе этого текста.

Ваша задача вывести этот точный текст:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Вот как это генерируется,

  • Был ревностный лис, которому понравилась панграмма: «Быстрая коричневая лиса перепрыгивает через ленивую собаку». Однажды он оказался в центре внешней спирали и решил прыгнуть в нее и рисовать.
  • Он хотел бы пройтись по панграмме от начала до конца, и если буква является n-й буквой в алфавите, он хотел бы нарисовать ее n раз.
  • Однако лиса была не очень хороша в поворотах на поворотах, поэтому, достигнув каждого угла, он также должен был остановиться и перейти к следующей букве.
  • Он также решил повторить панграмму трижды , чтобы подчеркнуть , что он шустрая лиса.
  • Ваша задача - показать, как будет выглядеть спираль после того, как лиса раскрасит все эти буквы.

(Обычная версия без рассказа)

  • Знаменитая панграмма «Быстрая коричневая лиса перепрыгивает через ленивую собаку» повторяется трижды, с удалением пробелов и всех букв в нижнем регистре, чтобы генерировать

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Спираль начинается от центра и начинается с буквы «т», начинается с движения вправо и идет наружу по часовой стрелке. Если текущий символ является n-й буквой в алфавите, то он переключается на следующий символ всякий раз, когда

    • спираль достигает угла, или
    • текущие буквы печатаются ровно n раз.

Чтобы лучше проиллюстрировать это, я объясню, как генерируется спираль, связанная с первыми тремя словами «thequickbrown».

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Лиса начинает с «т», идет направо, достигает 1-го угла, красит его «т», затем переключается на «ч» и спускается, достигает 2-го угла, переключается на «е» и идет влево, достигает 3-й угол, переключается на «q» и идет вверх, достигает 4-го угла, переключается на «u» и идет направо, достигает угла и переключается на «i», идет вниз, достигает угла и переключается на «c», идет влево успешно рисует 3 «с» до достижения следующего угла , переключается на «к» и идет влево , сразу достигает угла, переключается на «b» и идет вверх, рисует 2 «б» до достижения следующий угол, переключается на «р»и идет вверх , достигает угла и переключается на «о», идет направо, затем «w», вниз, «n», влево.

Спекуляции

  • Вы можете принять необязательный ввод, который содержит любую стандартную форму строки

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Ваш вывод должен быть отформатирован как строка и должен идти в STDOUT вместо файлов или STDERR, с символами новой строки, размещенными правильно. Заголовок и конечные пустые строки не имеют значения. Заголовок и пробел в каждой строке разрешены, но должны быть согласованы. Поэтому, если вы добавите 5 пробелов перед одной строкой данного текста, вам нужно будет добавить ровно 5 пробелов перед каждой строкой, чтобы спираль выглядела одинаково.

  • Это , выигрывает наименьшее количество байтов.

  • Как обычно, здесь применяются лазейки по умолчанию .


Пояснения приветствуются, хотя и не обязательно.

Название отредактировано, чтобы сделать его панграммой для комментария caird coinheringaahing.

Ленивый пес слишком ленив, чтобы появляться в истории.

Я стремлюсь создать строковый вызов, в котором буква для вывода не может быть вычислена с помощью простых функций координат.

Вейцзюнь Чжоу
источник
2
Обидно, что название не панграмма
caird coinheringaahing
@cairdcoinheringaahing Хорошо, я постараюсь придумать один. Какие-либо предложения?
Вейцзюнь Чжоу
4
@cairdcoinheringaahing Обновлено
Чжоу,
Незначительный момент: разве «h» в первом «the» не должно повторяться дважды, а не «t»?
mudkip201
@ mudkip201 Угол закрашивается оригинальной буквой перед переключением на следующий символ. Может быть, я должен уточнить.
Вейцзюнь Чжоу

Ответы:

5

Stax , 35 34 33 32 байта

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Запустите и отладьте его онлайн

Stax - это язык, над которым я работаю около 6 месяцев. Это первый публичный гольф с ним. Давайте приступим к делу.

Stax обычно пишется в наборе печатных символов ASCII. Это 34-байтовое представление упаковано в вариант набора символов CP437. Соответствующее представление ascii

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax - это язык, основанный на стеке, но он имеет два стека данных: «основной» и «входной». Большинство операций используют основной стек, но ввод начинается со стека ввода. Инструкции Stax - это, в основном, одно или двухсимвольные последовательности ascii. Большинство из них перегружены, то есть их поведение определяется несколькими верхними значениями в стеке.

На высоком уровне эта программа строит сетку путем многократного добавления строк в последний ряд. Когда последний ряд заполняется, он поворачивает сетку по часовой стрелке. В конце он отражает сетку горизонтально. Более подробно программа работает так.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
рекурсивный
источник
Вау, я действительно поражен тем, что в первый раз на поле для гольфа впервые появится публичное выступление. Спасибо большое за вашу поддержку! Заинтересованы в языке месяца? Я надеюсь увидеть больше пользователей, использующих его, и он скоро появится в списке кандидатов!
Вейцзюнь Чжоу
@WeijunZhou: Вы имеете в виду это ? Я не знал, что это было до сих пор. Я не возражаю против назначения. Кажется, что он лучше подходит для более устоявшихся языков, но я не возражаю.
рекурсивный
Да. Я могу назначить это, когда это будет лучше установлено, как вы говорите. Я надеюсь, что это не будет долго.
Вейцзюнь Чжоу
Поскольку «пробел в каждой строке не имеет значения, если они согласованы», вы можете сохранить другой байт, если хотите.
Вейцзюнь Чжоу,
1
Я только что подал заявку, используя Stax. Вы можете дать совет по этому вопросу, если хотите. Редактировать: Какое совпадение. Я постараюсь извлечь уроки из вашего представления.
Вейцзюнь Чжоу
11

Древесный уголь , 66 40 36 байт

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: Сохранено 16 байтов, принимая текст в качестве ввода. Объяснение:

≔²η

Начните с 2 tс по какой-то причине.

FS«

Обведите все буквы в панграмме.

F¬η«

Мы уже достигли угла?

Двигайтесь вниз (или как бы там ни было в следующем направлении) на одну строку.

Поверните направление печати на 90 ° по часовой стрелке.

⊞υη≔⊕÷Lυ²η

Рассчитайте длину следующей стороны.

¶»

Закончите исправление положения курсора. (Древесный уголь предпочел бы, чтобы сторона заканчивалась как раз перед углом, чтобы вы вращались на самом углу.)

F⊕⌕βι

Цикл столько раз, сколько текущей буквы в алфавите.

¿η«

Если мы не достигли угла,

≦⊖ηι

Уменьшите счет и распечатайте текущее письмо.

Нил
источник
Спасибо. Отличная работа и хорошо объяснил. Маленькая опечатка: там раз -> три раза.
Вейцзюнь Чжоу,
Эта 43-байтовая версия также приемлема согласно спецификации. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Чжоу,
1
@ WeijunZhou Спасибо, я не замечал этого пункта в вопросе раньше.
Нил
2

Рубин , 217 212 209 208 байт

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

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

Тратит довольно много времени на управление указателями, так что может быть место для большего количества игры в гольф.

-5 байт: утроить панграмму перед вводом. Благодаря Вэйцзюнь Чжоу .

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

-1 байт: использовать &&вместо троичного оператора с однозначным значением.

Объяснение:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
источник
1
Хорошая подача и четко объяснил. Я ценю использование rи lлямбды. Судя по текущим ответам, последний этап кажется источником проблем, хотя это было не тогда, когда я написал свой фрагмент кода C, чтобы сгенерировать пример выходных данных ...
Вейцзюнь Чжоу,
1
Кажется , вы можете сохранить в s*=3целом , а также опустить 0в ?:операторе. tio.run/…
Чжоу
1
@ WeejunZhou Ааа, спасибо за совет. 0Хотя мне это нужно , иначе Ruby будет извлекать c+=1из следующей строки и выполнять ее только большую часть времени. И хороший вызов!
benj2240
Вы правы. Я не выглядел достаточно осторожным. Спасибо за благодарность. Я рад, что вам понравилось.
Вейцзюнь Чжоу