Ревна «Швидка бура лисиця» «Стрибнула» вздовж Грової спіралі


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 разів.
  • Однак лисиця не дуже добре робила повороти на кутах, тому, дійшовши до кожного кута, йому також довелося зупинитися і перейти до наступного листа.
  • Він також вирішив повторити панграма тричі , щоб підкреслити , що він спритна лисиця.
  • Ваше завдання - показати, як виглядатиме спіраль після того, як лисиця намалювала всі ці літери.

(Простий варіант без розповіді про історію)

  • Знаменита панграма "Швидка бура лисиця перестрибує ліниву собаку" повторюється тричі, з пробілами вилучені і всі літери в малому регістрі, щоб створити

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Спіраль починається від центру і починається з літери «t», починається, рухаючись праворуч, і виходить назовні за годинниковою стрілкою. Якщо поточним символом є п ята літера в алфавіті, то він переходить на наступний символ щоразу

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

Щоб краще проілюструвати це, я поясню, як генерується спіраль, пов’язана з першими трьома словами "thequickbrown".

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Лисиця починається від "t", йде праворуч, доходить до 1-го кута, зафарбовує її "t", а потім переходить на "h" і спускається, доходить до 2-го кута, переходить на "e" і йде вліво, доходить до 3-й кут, переходить на "q" і йде вгору, доходить до 4-го кута, переходить на "u" і йде праворуч, доходить до кута і переходить на "i", йде вниз, доходить до кута і переходить на "c", йде ліворуч, успішно малює 3 "c" s, перш ніж дійти до наступного кута , переходить на "k" і продовжує вліво , доходить до кута одразу, переходить на "b" і йде вгору, фарбує 2 "b" s, перш ніж досягти наступний кут переходить на "r"і йде вгору , доходить до кута і переходить на "o", йде праворуч, потім "w", вниз, "n", вліво.

Технічні характеристики

  • Ви можете взяти додатковий вхід, який містить будь-яку стандартну форму рядка

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

  • Це , найменша кількість виграних байтів.

  • Як завжди, тут застосовуються лазівки за замовчуванням .


Пояснення вітаються, хоча не є необхідними.

Назва відредагована, щоб вона стала панграмою за коментарем від caird coinheringaahing.

Ледачий пес занадто ледачий, щоб з’являтися в оповіданні.

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


2
Прикро, що заголовок - це не панграма
caird coinheringaahing

@cairdcoinheringaahing Добре, я спробую придумати його. Будь-які пропозиції?
Вейджун Чжоу

4
@cairdcoinheringaahing Оновлено
Вейджун Чжоу

Незначна точка: чи не слід повторювати двічі «h» у першому «the», не «t»?
mudkip201

@ mudkip201 Куточок зафарбовано оригінальним листом перед переходом до наступного символу. Можливо, я повинен уточнити.
Вейджун Чжоу

Відповіді:


5

Стакс , 35 34 33 32 байт

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

Запустити та налагодити його в Інтернеті

Стакс - це мова, над якою я працював близько 6 місяців. Це перший громадський гольф з ним. Давайте перейдемо до справи.

Стакс, як правило, записується в набір символів для друку ASCII. Це 34 байт подання упаковано у варіант набору символів CP437. Відповідне представлення ascii є

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

Stax - мова на основі стека, але вона має два стеки даних, "основний" та "вхідний". Більшість операцій використовують основний стек, але введення починається на вхідному стеку. Інструкції Стакса - це переважно одна або дві символьні послідовності. Більшість з них перевантажені, тобто їх поведінка визначається кількома першими значеннями на стеку.

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

'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/…
Zhou

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
}

1
Приємне подання і чітко пояснено. Я ціную вживання rі lлямбда. Виходячи з поточних відповідей, здається, що останній виразник є проблемою, хоча це було не тоді, коли я написав свій фрагмент C, щоб генерувати вибірку
вибору

1
Здається , ви можете зберегти в s*=3цілому , а також опустити 0в ?:операторі. tio.run/…
Чжоу

1
@WeijunZhou Ahh, дякую за пораду. Мені це потрібно, 0хоча Рубі витягне c+=1з наступного рядка і виконає його лише більшу частину часу. І приємний виклик!
benj2240

Ти правий. Я не виглядав досить уважно. Дякую за вдячність Я радий, що вам сподобалось.
Вейджун Чжоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.