Tour de cordes


22

Étant donné une chaîne de texte, affichez-la comme une «tour».

Chaque tranche de la chaîne (du formulaire 0:n) est répétée 5*nfois, donc le premier caractère est répété 5 fois, puis le premier et le second 10 fois, etc.

Exemples:

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

Règles:

Vous pouvez générer chaque couche sous forme de liste de caractères ou simplement une chaîne d'entre eux réunis.


1
bienvenue chez PPCG! Beau défi.
Giuseppe

J'ai essayé de nettoyer le formatage et d'expliquer un peu mieux le défi. Ai-je bien compris le défi?
Rɪᴋᴇʀ

2
Pouvons-nous prendre l'entrée comme une liste de caractères?
JayCe

5
Pouvons-nous produire un tableau 2D de chaînes comme ceci [["c","c","c","c","c"],["ca","ca","ca","ca","ca","ca","ca","ca","ca","ca"],...]:?
Shaggy

3
Les sorties avec des sauts de ligne de début ou de fin sont-elles acceptables? Pouvons-nous supposer que les entrées ne contiennent pas de nouvelles lignes?
redondance

Réponses:


12

R , 48 octets

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

Essayez-le en ligne!

Renvoie une liste de chaînes.


J'avais manqué le golf évident ici! belle solution J'ai essayé différentes approches mais jusqu'à présent toutes sont bien plus longues que cela.
JayCe

9

05AB1E , 6 octets

ηā5*ÅΓ

Essayez-le en ligne!

Renvoie une liste de chaînes.

Explication

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

@KevinCruijssen Merci de l'avoir remarqué! Je ne devrais pas jouer au golf le matin sans un premier café :-(
Kaldo

1
L'utilisation du décodage de la longueur d'exécution permet d'économiser 3 octets:ηā5*ÅΓ
Adnan

@Adnan Brilliant, merci! Je pense que cela mérite sa propre réponse, vous avez réduit le nombre d'octets de 33% ... Je reviendrai à ma solution d'origine si vous décidez de le poster vous-même.
Kaldo

Joli, j'en ai eu ηvyg5*Fy=pour 8.
Urne Magic Octopus



6

TI-Basic (TI-84 Plus CE), 29 octets (27 jetons)

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

Explication:

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

Rétine , 15 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

.

Faites correspondre chaque caractère de la chaîne.

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

$`est le préfixe de la correspondance. Retina fournit alors deux modificateurs, le >modifie pour qu'il soit dans le contexte de la chaîne entre les correspondances successives, tout en .prenant la longueur. On commence donc par le préfixe du suffixe, qui est équivalent à la correspondance incluant son préfixe. Cela économise 2 octets de plus en utilisant des correspondances qui se chevauchent. Le $(concatène alors qu'avec une nouvelle ligne, le 5*répète, puis le $.>`répète un nombre de fois supplémentaire donné par sa longueur.




6

Cubix ,  44  40 octets

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

Essayez-le en ligne!

Cela a encore beaucoup de non-opérations, mais c'est un peu mieux qu'avant.

Comme très brève description, un personnage est saisi en entrée et testé pour EOI (-1), arrêtez-le s'il l'est. La pile est alors inversée. Obtenez le nombre d'objets sur la pile et plusieurs par -5. Déposez cela au bas de la pile et nettoyez. Parcourez la pile, imprimez, jusqu'à un nombre négatif. Imprimer le retour à la ligne, incrémenter le nombre, si 0 laisser tomber le zéro, inverser la pile et recommencer à partir de l'entrée, sinon parcourir la pile, imprimer, jusqu'à un nombre négatif ... ad nauseum

Cubifié il ressemble

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

Regardez-le en ligne



5

JavaScript, 48 46 octets

(merci @redundancy)

Edit: L'auteur a clarifié et cette réponse n'est plus valide, mais je vais la laisser ici inchangée.

Renvoie un tableau de chaînes multilignes.

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

Essayez-le

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

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

Stratégie potentielle:

Cela ne m'a pas beaucoup aidé, mais peut-être que quelqu'un peut utiliser ceci:

Le nombre de caractères sur la ligne (indexée 0) iest floor(sqrt(2/5*i+1/4)+1/2), qui est joué en JavaScript en tant que (.4*i+.25)**.5+.5|0.

Pour une chaîne de longueur n, il y a des n*(n+1)*5/2lignes.

Peut-être: s=>{for(i=0;(n=(.4*i+++.25)**.5+.5|0)<=s.length;)console.log(s.slice(0,n))}


1
En supposant que votre format de sortie est valide selon le défi, vous pouvez enregistrer 2 octets comme illustré ici: Essayez-le en ligne!
redondance



3

Husk , 8 octets

ΣzoR*5Nḣ

Essayez-le en ligne!

Explication

Σ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 octets

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

Essayez-le en ligne!

Malheureusement , il initsfaut import Data.List, si

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

avec ses 45 octets est plus long.

Edit: -1 octet grâce à @BWO.


3

Fusain , 11 octets

F⊕LθE×⁵ι…θι

Essayez-le en ligne! Le lien est vers la version détaillée du code. La sortie comprend 0 répétitions de la sous-chaîne de longueur nulle. Explication:

   θ          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 octets

Score réduit de moitié grâce à mazzy
+5 octets grâce à AdmBorkBork rappelant les spécifications

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

Essayez-le en ligne!

Prend entrée via splatting. Fonctionne en créant la chaîne en ajoutant le caractère suivant à lui-même, le convertit en un tableau à un élément, puis le répète plusieurs 5*ifois.


1
paramest très cher. Essayez de l'éviter
mazzy

@mazzy Dang, essayer de sauvegarder l'index au lieu du caractère lui-même m'a induit en erreur. Merci.
Veskah

@AdmBorkBork Ha ha, oups. Devrait être corrigé maintenant
Veskah

2

MATL , 12 octets

f"G@:)@5*1X"

Essayez-le en ligne!

f               % Get the indices of input i.e. range 1 to length(input)
 "              % For loop over that
   G            % Push input string
    @           % Push current loop index
     :          % Range 1 to that
      )         % Index at those positions (substring 1 to i)
       @5*      % Multiply loop index by 5
          1X"   % Repeat the substring that many times rowwise
                % Results collect on the stack and are 
                %  implicitly output at the end

2

V , 17 octets

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

Attend des entrées sans retour à la ligne et des sorties avec des retours à la ligne superflus.

Je peux supprimer cette entrée si l'entrée / sortie viole la spécification de défi.

Essayez-le en ligne!

21 octets

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

Attend des entrées sans retour à la ligne, mais des sorties avec un seul retour à la ligne de début et de fin.

Explication

Les sous-chaînes différentes sont séparées par deux sauts de ligne consécutifs de sorte que la duplication ligne par ligne ne s'applique qu'aux lignes correspondant à l'expression régulière $\n\n.

Lorsque la commande de duplication ( Ä) est fournie un nombre, par exemple , (je pense), il supprime la ligne actuelle avant de coller des nheures, apparaissant ainsi uniquement pour ajouter des n - 1copies.

ò         | 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 octets SBCS

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

Essayez-le en ligne!

Mon premier post apl donc s'il vous plaît laissez-moi savoir si vous avez des suggestions

Comment ça fonctionne:

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

n'est pas vraiment Séparer en lignes mais plutôt Combiner [liste de listes] en lignes [d'une matrice] , ou plus techniquement Augmenter le rang au détriment de la profondeur .
Adám


1

Perl 6 , 25 octets

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

Essayez-le en ligne!

Bloc de code anonyme qui renvoie une liste de listes de chaînes.

Si vous le voulez comme un tableau 1D, vous pouvez ajouter flatdevant comme ceci:

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

Essayez-le en ligne!

Explication:

{                       }  # 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.

Alternativement,

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

Essayez-le en ligne!

Fonctionne également pour le même nombre d'octets.


1

Japt, 10 octets

En attente de confirmation si le format de sortie est acceptable (+2 octets sinon).

å+ £T±5 ÇX

Essayez-le


La sortie me semble raisonnable, bien faite.
Nit


1

JavaScript, 76 octets

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")


Bonjour et bienvenue chez PPCG.
Jonathan Frech

i=1;i<=s.length;i++peut être i=0;++i<=s.length;.
Jonathan Frech

1

Forth (gforth) , 48 octets

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

Essayez-le en ligne!

Explication

  1. Boucle de 1 à la longueur d'une chaîne
  2. pour chaque itération:
    1. Temps de boucle (5 * index de boucle)
    2. Affiche la chaîne du début à l'index de la boucle externe

Explication du code

: 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 octets

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 octets grâce à @ OlivierGrégoire .
-1 octet grâce à @ceilingcat .

Essayez-le en ligne.

Explication:

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 octets :s->{for(int i=1,j=1;i<=s.length();i+=j++<i*5?0:+(j=1))System.out.println(s.substring(0,i));}
Olivier Grégoire

@ OlivierGrégoire Merci! Et j'ai pu jouer à 2 octets de plus en changeant en utilisant >=et ?j=1:0au lieu de <et ?0:+(j=1).
Kevin Cruijssen

Bien! J'essayais de m'en débarrasser, mais j'avais toujours des problèmes de compilation. Je n'ai pas pensé à rétablir la condition. Bien joué! ;)
Olivier Grégoire

@ceilingcat Merci
Kevin Cruijssen

1

brainfuck , 40 octets

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

Essayez-le en ligne!

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.