Springify String

11

Песочница пост здесь .

Создайте функцию или программу, которая «Springizes» строку.

  • Вводом будет String in Stdin или ближайшая альтернатива
  • Ввод будет содержать только печатные ASCII и / или пробелы
  • Вывод будет в стандартный вывод или ближайшую альтернативу
  • Завершающие переводы строки и пробелы являются приемлемыми

Как пружинить строку

  1. Отформатируйте строку в столько пружин 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, длина витка пружины

Это , поэтому выигрывает самый короткий ответ в байтах.

MildlyMilquetoast
источник
Я чувствую, что было бы гораздо сложнее следовать шаблону вдоль катушки.
Волшебная Урна Осьминога
@carusocomputing вы имеете в виду обратное?
MildlyMilquetoast
codegolf.stackexchange.com/a/107531/59376 оказывается, что я не понял, как написано, это именно проблема, ахаха.
Волшебная Урна Осьминога

Ответы:

2

Желе , 26 байт

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

TryItOnline!

Как?

“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

Python 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')
throx
источник
Вы можете просто использовать input()и принимать данные в формате "<stuff>".
HyperNeutrino
Отличный первый гольф! Как указывает Алекс Л., мы допускаем ввод данных в кавычках. Вы также можете использовать lambdaанонимную функцию вместо программы - это часто короче .
xnor
Сбой для теста с пустой строкой с помощью IndexError. Я думаю, что вам может понадобиться изменить 13 на 14 и вывести окончательное значение (так же, как мой ответ на желе).
Джонатан Аллан
... меняя +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 Спасибо, исправлено.
Нил
Это блестяще!
Додов
Приятно, что фрагмент позволяет видеть результат при его
наборе
2

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

Благодаря ETHProductions за 10B сэкономить!

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])]
ETHproductions
Хитрый трюк Я уже думал о других способах написания массива, но не мог придумать ни одного. Я все еще могу сократить это, поместив сначала шестнадцатеричное число, а затем умножение, сделав пространство ненужным.
Лука
Вы могли бы даже сделать, '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.)

SMLS
источник
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

Mathematica, 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 Мин
Отличные предложения!
Грег Мартин
1

Python 3 , 86 байт

lambda s:''.join(t[i%14]for t in zip(*[iter(s+' '*13)]*14)for i in b'Tq>]zQ|1/X;:L$o')

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

В качестве бонуса, строка Tq>]zQ|1/X;:L$oявляется допустимой программой CJam, которая печатает уникальные символы на стандартном вводе, отсортированном. Попробуйте онлайн! (+ объяснение)

Линн
источник
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>.

Я был рад узнать, что ??также принимает пустую строку (для «недопустимого» индекса) как ноль.

Titus
источник
0

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

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

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

гигабайт
источник