Башня струн


22

Учитывая строку текста, выведите ее как «башню».

Каждый фрагмент строки (формы 0:n) повторяется несколько 5*nраз, поэтому первый символ повторяется 5 раз, затем первый и второй 10 раз и т. Д.

Примеры:

'hello' ->

['h']  
['h']  
['h']  
['h']  
['h']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  
['h', 'e', 'l', 'l', 'o']  


'cat' ->

['c']  
['c']  
['c']  
['c']  
['c']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  
['c', 'a', 't']  

Правила:

Вы можете вывести каждый слой в виде списка символов или просто их строки, соединенных вместе.


Добро пожаловать в PPCG! Хороший вызов.
Джузеппе

Я попытался очистить форматирование и объяснить проблему немного лучше. Я правильно понял проблему?
Rɪᴋᴇʀ

2
Можем ли мы принять входные данные в виде списка символов?
JayCe

5
Можно ли выводить 2D-массив строк нравится так: [["c","c","c","c","c"],["ca","ca","ca","ca","ca","ca","ca","ca","ca","ca"],...]?
Лохматый

3
Приемлемы ли выходы с ведущими или последующими символами новой строки? Можем ли мы предположить, что входные данные не содержат новых строк?
резервирование

Ответы:


12

R , 48 байтов

function(s)substring(s,1,rep(x<-1:nchar(s),x*5))

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

Возвращает список строк.


Я пропустил очевидный гольф здесь! Хорошее решение Я пробовал разные подходы, но пока все гораздо дольше, чем этот.
JayCe

8

05AB1E , 6 байтов

ηā5*ÅΓ

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

Возвращает список строк.

объяснение

     ÅΓ # Run-length decode...
η       # ... the prefixes of the input
 ā5*и   # ... with the length range multiplied by 5 -- [5, 10, 15, 20, 25]

@KevinCruijssen Спасибо, что заметили это! Я не должен играть в гольф по утрам без кофе первым :-(
Kaldo

1
Использование декодирования по длине прогона экономит 3 байта:ηā5*ÅΓ
Аднан

@ Adnan Бриллиант, спасибо! Я думаю, что он заслуживает отдельного ответа, хотя вы сократили количество байтов на 33% ... Я вернусь к исходному решению, если вы решите опубликовать его самостоятельно.
Кальдо

Хороший, у меня был ηvyg5*Fy=на 8.
Волшебная Урна Осьминога



6

TI-Basic (TI-84 Plus CE), 29 байт (27 токенов)

For(A,1,length(Ans
For(B,1,5A
Disp sub(Ans,1,A
End
End

Объяснение:

For(A,1,length(Ans # 9 bytes, 8 tokens: for A from 1 to the length of the string
For(B,1,5A         # 8 bytes, 8 tokens:  5*A times
Disp sub(Ans,1,A   # 9 bytes, 8 tokens:   Print the first A characters of the string 
End                # 2 bytes, 2 tokens:  end loop
End                # 1 byte,  1 token:  end loop

6

Сетчатка , 15 байт

.
$.>`*5*$($>`¶

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

.

Совпадение каждого символа в строке.

$.>`*5*$($>`¶

$`это префикс матча. Затем Retina предоставляет два модификатора, >изменяет его так, чтобы он находился в контексте строки между последовательными совпадениями, и .принимает длину. Поэтому мы начинаем с префикса суффикса, который эквивалентен совпадению, включая его префикс. Это экономит 2 байта, используя перекрывающиеся совпадения. Затем $(он объединяет это с новой строкой, 5*повторяет его, а затем $.>`повторяет еще большее количество раз, определяемое его длиной.




6

Cubix ,  44  40 байт

i.!?@UBqwW_#/>u...;B^...?qo;;q*n5;oN/./)

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

У этого все еще есть много бездействующих, но это немного лучше чем прежде.

В качестве очень краткого описания, символ извлекается из ввода и тестируется на предмет EOI (-1), остановка, если это так. Стек затем переворачивается. Получить количество элементов в стеке и умножить на -5. Бросьте это на дно стека и очистите. Цикл по стеку, печать, до отрицательного числа. Выведите новую строку, увеличьте число, если 0 сбрасывает ноль, переверните стопку и начните с ввода снова, в противном случае переберите стопку, печатая до отрицательного числа ... ad nauseum

Cubified это выглядит как

      i . !
      ? @ U
      B q w
W _ # / > u . . . ; B ^
. . . ? q o ; ; q * n 5
; o N / . / ) . . . . .
      . . .
      . . .
      . . .

Смотреть онлайн



5

JavaScript, 48 46 байт

(спасибо @ redundancy)

Редактировать: Автор уточнил, и этот ответ не является действительным, но я оставлю его здесь без изменений.

Возвращает массив многострочных строк.

s=>[...s].map(c=>(q+=c).repeat(5*++i),i=q=`
`)

Попытайся

f = s=>[...s].map(c=>(q+=c).repeat(5*++i),i=q=`
`);

console.log( f("hello").join`` );

Потенциальная стратегия:

Это мне не очень помогло, но, возможно, кто-то может использовать это:

Количество символов в (0-индексированной) строке iравно floor(sqrt(2/5*i+1/4)+1/2), как в JavaScript как (.4*i+.25)**.5+.5|0.

Для строки длины nесть n*(n+1)*5/2строки.

Может быть: s=>{for(i=0;(n=(.4*i+++.25)**.5+.5|0)<=s.length;)console.log(s.slice(0,n))}


1
Предполагая, что ваш выходной формат действителен в соответствии с задачей, вы можете сохранить 2 байта, как показано здесь: Попробуйте онлайн!
резервирование



3

Шелуха , 8 байт

ΣzoR*5Nḣ

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

объяснение

Σz(R*5)Nḣ  -- example input: "ab"
        ḣ  -- non-empty prefixes: ["a","ab"]
 z(   )N   -- zip with [1..]
    *5     -- | multiply by 5
   R       -- | replicate
           -- : [["a","a","a","a","a"],["ab","ab","ab","ab","ab","ab","ab","ab","ab","ab"]]
Σ          -- concat: ["a","a","a","a","a","ab","ab","ab","ab","ab","ab","ab","ab","ab","ab"]

3

Haskell, 46 43 42 байта

f s=do n<-[1..length s];take n s<$[1..n*5]

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

К сожалению initsтребует import Data.List, так

import Data.List
((<$)<*>(>>[1..5])=<<).inits

с его 45 байтами длиннее.

Редактировать: -1 байт благодаря @BWO.


3

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

F⊕LθE×⁵ι…θι

Попробуйте онлайн! Ссылка на подробную версию кода. Вывод включает 0 повторов подстроки нулевой длины. Объяснение:

   θ          Input string
  L           Length
 ⊕            Incremented
F             Loop over implicit range
      ⁵       Literal 5
       ι      Current index
     ×        Multiply
    E         Map over implicit range
         θ    Input string
          ι   Current index
        …     Chop to length
              Implicitly print each string on its own line


3

PowerShell , 40 20 25 байт

Счет сократился вдвое благодаря невероятным
+5 байтам благодаря AdmBorkBork, указывающему спецификации

$args|%{,($s+=$_)*5*++$i}

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

Вводит через сплаттинг. Работает путем построения строки путем добавления следующего символа к себе, преобразует его в массив из одного элемента, а затем повторяет его 5*iраз.


1
paramэто очень дорого. Попытайтесь избежать этого
mazzy

@ mazzy Dang, попытка сохранить индекс вместо самого символа привела меня в заблуждение. Благодарю.
Веска

@AdmBorkBork Ха-ха, упс. Должно быть исправлено сейчас
Веска


2

V , 17 байт

òïç$îî/6Ä
Hl$xòxú

Ожидаются вводы без перевода строки и выводы с лишними ведущими переводами строки.

Я могу удалить эту запись, если ввод / вывод нарушает спецификацию вызова.

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

21 байт

òïç$îî/6Ä
Hl$xòxíîî/ò

Ожидает ввод без перевода строки, но вывод только с одним и последним переводом строки.

объяснение

Разные подстроки разделяются двумя последовательными символами новой строки, поэтому дублирование строк также применяется только к строкам, соответствующим регулярному выражению $\n\n.

Когда команде дублирования ( Ä) предоставляется счетчик, например , (я думаю), он удаляет текущую строку перед вставкой nвремени, таким образом, появляется только для добавления n - 1копий.

ò         | recursively...
 ï        | . append newline
  ç       | . globally search lines matching...
   $îî    | . . compressed version of $\n\n regex
      /6Ä | . . duplicate to create 6 copies
H         | . go to first line
 l        | . move cursor right 1 char
          | . . if current line is 1 char long, errors out of recursion
  $x      | . delete 1 char from end of current line
    ò     | ...end
     x    | delete extra 1-char substring
      ú   | sort so that newlines rise to top


1

Perl 6 , 25 байт

{(1..*X*5)RZxx[\~] .comb}

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

Блок анонимного кода, который возвращает список списка строк.

Если вы хотите использовать его как одномерный массив, вы можете добавить его flatвпереди так:

{flat (1..*X*5)RZxx[\~] .comb}

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

Объяснение:

{                       }  # Anonymous code block
                   .comb   # Split the string into a list of characters
              [\~]         # Triangular reduce the list of characters with the concatenate operator
          RZxx             # Multiply each list by:
 (1..*X*5)                 # A sequence of 5,10,15 etc.

С другой стороны,

{($+=5)xx*RZxx[\~] .comb}

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

Также работает на такое же количество байтов.


1

Japt, 10 байт

Ожидание подтверждения того, является ли выходной формат приемлемым (+2 байта, если нет).

å+ £T±5 ÇX

Попытайся


Вывод выглядит разумно для меня, красиво сделано.
Нить


1

JavaScript, 76 байт

s=>{for(i=1;i<=s.length;i++)for(j=0;j<5*i;j++)console.log(s.substring(0,i))}

f=s=>{for(i=1;i<=s.length;i++)for(j=0;j<5*i;j++)console.log(s.substring(0,i))}

f("cat")


Привет и добро пожаловать в PPCG.
Джонатан Фрех

i=1;i<=s.length;i++может быть i=0;++i<=s.length;.
Джонатан Фрех

1

Forth (gforth) , 48 байтов

: f 1+ 1 do i 5 * 0 do dup j type cr loop loop ;

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

объяснение

  1. Цикл от 1 до длины строки
  2. для каждой итерации:
    1. Loop (5 * loop index) раз
    2. Вывести строку от начала до индекса внешнего цикла

Код Объяснение

: f                \ start a new word definiton
  1+ 1             \ set up to the loop paramers from 1 to str-length
  do               \ start a counted loop
    i 5 * 0 do     \ start a second counted loop from 0 to 5*index - 1
      dup j        \ duplicate the string address and set the length to the outer index
      type         \ print character from start of string to loop index
      cr           \ output a newline
    loop           \ end inner counted loop
  loop             \ end outer counted loop
;                  \ end word definition

1

Java 10, 120 92 90 89 байт

s->{for(int j=1,i=1;i<=s.length();i+=++j>i*5?j=1:0)System.out.println(s.substring(0,i));}

-28 байт благодаря @ OlivierGrégoire .
-1 байт благодаря @ceilingcat .

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

Объяснение:

s->{                      // Method with String parameter and no return-type
  for(int j=1,            //  Repeat-integer, starting at 1
      i=1;i<=s.length()   //  Loop `i` in the range [1,length_input]
      ;                   //    After every iteration:
       i+=++j>i*5?        //     Increase `j` by 1 first with `++j`
                          //     If `j` is now larger than `i` multiplied by 5:
           j=1            //      Increase `i` by 1, and reset `j` to 1
          :               //     Else:
           0)             //      Leave `i` the same by increasing it with 0
    System.out.println(   //   Print with trailing newline:
      s.substring(0,i));} //    The prefix of size `i`

1
92 байта :s->{for(int i=1,j=1;i<=s.length();i+=j++<i*5?0:+(j=1))System.out.println(s.substring(0,i));}
Оливье Грегуар

@ OlivierGrégoire Спасибо! И я смог сыграть еще 2 байта, изменив использование >=и ?j=1:0вместо <и ?0:+(j=1).
Кевин Круйссен

Хорошо! Я пытался избавиться от этого, но у меня были проблемы с компиляцией. Не думал о восстановлении состояния. Отлично сработано! ;)
Оливье Грегуар

@ceilingcat Спасибо
Кевин Круйссен

1

брейкфук , 40 байт

++++++++++>,[>>+++++[<<[<]>[.>]>>+<-]<,]

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

[Tape: 10 (newline), [characters], 0, rowcounter]

++++++++++> 10 (newline)
,[          for each input character
  >>+++++     add 5 to number of rows
  [           for each row
    <<[<]       go to start
    >[.>]       print newline and all previous characters
    >>+         add 1 to next rowcounter cell
    <-          decrement current rowcounter cell
  ]
  <,          input next character
]

1

APL (Dyalog Unicode) , 14 байтов SBCS

{↑(5×⍳≢⍵)/,\⍵}

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

Мой первый пост apl, поэтому, пожалуйста, дайте мне знать, если у вас есть какие-либо предложения

Как это устроено:

{↑(5×⍳≢⍵)/,\⍵}
          ,\⍵  - Prefixes of the input
         /      - Repeated
     ⍳≢⍵        - By a list of indices the same length as the input
   5×           - Times 5
               - Separate into rows         

на самом деле не разделять на строки, а объединить [список списков] в строки [матрицы] , или, более технически, увеличить ранг за счет глубины .
Адам

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.