Springify струна


11

Пісочниця тут .

Створіть функцію або програму, яка "Springifies" рядок.

  • Вхід буде рядком у Стдіні або найближчою альтернативою
  • Вхід буде містити лише друковані ASCII та / або пробіли
  • Вихід буде для Stdout або найближчої альтернативи
  • Додаткові нові рядки та пробіли є прийнятними

Як узагальнити струну

  1. Відформатуйте String у стільки ASCII пружинних котушок, скільки потрібно
  2. Прокладіть котушки з пробілами, аж до найближчої котушки
  3. Прочитайте персонажів, слідуючи за пружиною навколо котушок

Це пружинна котушка ASCII:

#
# ####
 #    #
# ####
#

Де #s - символи рядка

Ось приклад:

abcdefghijklmnopqrstuvwxyz

стає

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

Де .s заміняють пробіли для наочності.

Потім рядок зчитується назад, слідуючи навесні ASCII вниз, навколо петель, натискаючи на gі uдвічі:

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

... надання:

abgjklmhfedcginopuxyz vtsrquw (із заднім простором)

Випробування

(цитати додані, щоб виділити пробіли - проігноруйте з точки зору IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

Зауважте, що вихідна довжина завжди кратна 15, довжина пружинної котушки

Це , тому найкоротша відповідь у байтах виграє.


Я відчуваю, що це було б набагато більшим завданням слідувати схемі вздовж котушки.
Чарівний восьминіг Урна

@carusocomputing ти маєш на увазі зворотне?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376 виявляється, я не розумів виклик як написаний, це саме завдання ахаха.
Чарівний восьминіг урна

Відповіді:


2

Желе , 26 байт

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

СпробуйтеItOnline!

Як?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print

5

Пітон 2, 104 102 98 байт

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

Дякуємо за допомогу в коментарях!

https://tio.run/#2VDVy

Оригінал:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')

Ви можете просто використовувати input()та приймати вхід у форматі "<stuff>".
HyperNeutrino

Чудовий перший гольф! Як зазначає Алекс Л., ми дозволяємо вводити дані в лапки. Ви також можете використовувати a, lambdaщоб надати анонімну функцію, а не програму - це часто коротше .
xnor

Помилка для тестового випадку порожнього рядка з IndexError. Я думаю, що вам може знадобитися змінити 13 на 14 і відскочити остаточне значення (як моя відповідь на Jelly).
Джонатан Аллан

... змінити +13на +14та +1на +(len(t)%14>0)це зробить це, але повинен бути коротший шлях.
Джонатан Аллан

3

JavaScript (ES6), 79 байт

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

Шістнадцяткову струну безсоромно вкрали у @ETHproductions.


@ETHproductions Спасибі, виправлено.
Ніл

Це геніально!
dodov

Приємно, як фрагмент дозволяє бачити результат під час його введення
MildlyMilquetoast


2

JavaScript (ES7), 144 143 141 114 104 103 байт

Завдяки ETHProductions за економію 10В!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

Приклад

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

Вихідні дані

abgjklmhfedcginopuxyz vtsrquw 

Дуже хороша. Ви можете зберегти деякі байти, перетворивши масив у шістнадцятковий рядок та +('0x'+whatever)(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
скоригувавши

Розумна хитрість. Я вже думав про інші способи записати масив, але не міг придумати жодного. Я все ще можу це скоротити, розміщуючи спочатку шістнадцяткове число, а потім множення, роблячи простір непотрібним.
Лука

Ви можете навіть зробити, '0x'+'...'[c%15]-0+(c/15|0)*14щоб зберегти собі пару дужок :-)
ETHproductions

Ти маєш рацію. Додано.
Лука

2

Perl 6 , 61 байт

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

Як це працює

Основна структура така:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

Вираз, який використовується для індексації у кожному сегменті з 14 символів, є таким "abgjklmhfedcgin".ords X- 97, що працює наступним чином:

  1. Візьміть жорстко закодований рядок abgjklmhfedcgin.
  2. Отримайте свої кодові: 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Відняти 97 з кожного числа: 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

Perl 6 , 64 байти

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

Спробуйте в Інтернеті!

Як це працює

Основна структура така:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

Ті ж показники , як і вище, але так як ми називаємо в .flatбудь-якому випадку, ми можемо використовувати вкладену (але один байт коротше) вираз для них: 0,1,6,9..12,7,5...2,6,8,13.

(Виглядає тривіально, але насправді покладається на особливість розбору Rakudo Perl 6, що, ймовірно, є помилкою . Щоб записати його, не використовуючи цю помилку, потрібно було б додати паролі навколо 5...2.)


2

Befunge-93, 97 байт

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

Спробуйте в Інтернеті!

Це розбивка вихідного коду з виділеними різними компонентами.

Вихідний код із виділеними шляхами виконання

*Основний цикл починається з виконання праворуч наліво, обертаючись навколо правого боку ігрового поля. Тут ми читаємо перший символ із stdin та закінчуємо, якщо це EOF.
*Наступний розділ гарантує перетворення будь-яких символів EOF у пробіли за допомогою формули c = c + 31*!(c+1). Хоча це не стосується першої ітерації, це може відбуватися при наступних переходах.
*Копія символу зберігається у тимчасову пам'ять, після чого здійснюється пошук поточного індексу в таблиці на рядку четвертий ( *), щоб визначити, чи повинен виводитися символ чи ні.
*Якщо символ потрібно вивести, ми беремо ліву гілку. Тут виконується своп, щоб скасувати заміну, який відбудеться далі, а потім натиснутий нуль, щоб примусити гілку право.
*Якщо символ не виводиться, ми поміняємо його вниз під стеком під лічильником індексу (це своп, який скасовується в лівій гілці). І в обох випадках ми зберігаємо символ у пам’яті при поточному зміщенні індексу, збільшуємо індекс і перевіряємо, чи більший він від 13.
*Якщо ні, ми читаємо наступний символ із stdin та повторюємо внутрішній цикл.
*Якщо це так, ми закінчили набір з 14 символів, 7 виведено ( abgjklm), а 7 залишилось у стеку ( cdefhin). Ми кидаємо останній два, вихід решта 5 ( hfedc), а потім витягувати і виводити окремі випадки g, iі nз пам'яті.
*І це повертає нас до початку основного циклу, де ми повторюємо процес ще раз для наступних 14 символів.


Гарне пояснення, молодці
MildlyMilquetoast

1

Математика, 77 72 байти

Дякуємо JungHwan Min за економію 5 байт!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

Безіменна функція, яка приймає список символів як вхідні та повертає список символів. Partition[#,14,14,{1,1}," "]розбиває введення на списки довжиною 14, при необхідності пробіливши пробілами. LetterNumber@"abgjklmhfedcgin"оцінює до {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, що вказує на порядок прийняття кожного списку довжини-14 у (повторення 7-го елемента відповідним чином). Потім [[;;,...]]приймає елементи всіх списків довжиною-14 в такому порядку і Join@@з'єднує відповіді разом.

Попереднє подання:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&

1
LetterNumber@"abgjklmhfedcgin"- це коротший спосіб стиснення списку. Також ;;замість того, щоб Allзберегти байт.
JungHwan Min

Чудові пропозиції!
Грег Мартін


0

PHP, 94 байти

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

розбиває аргумент командного рядка на 14-байтові фрагменти та петлі через рядок перекладу як індекс для підрядка. Бігайте з php -nr '<code>' <string>.

Я був радий дізнатися, що ??також приймає порожній рядок (для "недійсного" індексу) як нуль.


0

Рубін, 83 байти

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

Перша ідея полягала у використанні шістнадцяткових чисел, але ord-48 зберігає ще один байт (викрадений з відповіді глокса).

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