Вежа з струн


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']  

Правила:

Ви можете вивести кожен шар у вигляді списку символів або просто рядок з них, з'єднаних разом.


1
Ласкаво просимо до 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

9

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 Дякую за те, що помітили! Я не повинен спочатку
займатися

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

Кубіфіковано це схоже

      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), який golfed в 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 Dang, намагаючись зберегти індекс замість char, мене збило з глузду. Спасибі.
Веска

@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

2

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         

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


1

Perl 6 , 25 байт

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

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

Блок анонімного коду, який повертає список списку рядків.

Якщо ви хочете як 1D масив, ви можете додати 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

Четвертий (gforth) , 48 байт

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

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

Пояснення

  1. Петля від 1 до довжини рядка
  2. для кожної ітерації:
    1. Цикл циклу (5 * цикл)
    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).
Kevin Cruijssen

Добре! Я намагався позбутися цього, але в мене виникали проблеми з компіляцією. Не думав про те, щоб скасувати умову. Молодці! ;)
Олів'є Грегоар

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


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