Détoner une ficelle

34

N'importe quelle chaîne de caractères, imprimez-la sous la forme d'un triangle où le texte va et vient le long de chaque diagonale. Par exemple, une entrée de "Hello World"doit générer:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

L'espace entre chaque caractère d'une ligne doit être au moins égal à 1 pour conserver le format correct.

machiavelli
la source
1
Peut-on supposer que la chaîne n'est pas vide?
M. Xcoder
@ Mr.Xcoder Oui vous pouvez
machiavelli
1
L'espace entre chaque caractère d'une ligne doit être au moins égal à 1 : cela signifie-t-il qu'il H l o W r ds'agit d'une ligne centrale valide? Demander parce que dans votre exemple, chaque ligne a 3 espaces entre chaque caractère.
Emigna
1
@ Emigna, j'ai mal compris votre question, toutes mes excuses. Oui, votre exemple serait valide.
machiavelli
1
Espaces de début ou de fin autorisés?
Luis Mendo

Réponses:

19

Charbon de bois , 10 à 7 octets

↗ELθ✂θιUE¹

Essayez-le en ligne! Essayez-le en ligne! Les liens doivent contenir une version verbeuse du code. Explication:

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

La première fois que j'ai eu à utiliser la UEcommande.

Neil
la source
Je savais que le charbon de bois serait l'une des premières réponses ici .. Était presque tentant de commencer moi-même, mais je suis trop expérimenté pour finir avec une solution à temps, et il serait hors jeu de toute façon ..;)
Kevin Cruijssen
6
@ Emigna ... mais c'était ma grande chance d'utiliser UE...
Neil
6
@EriktheOutgolfer ... mais c'était ma grande chance d'utiliser UE..
Neil
1
@ Neil c'est -3 octets! -3 pour un beau sacrifice! Qui ne veut pas de belle -3?
Erik the Outgolfer
4
@EriktheOutgolfer Ce que vous êtes supposé dire, c'est: "Vous ne pouvez pas laisser 05AB1E vous battre, n'est-ce pas?"
Neil
12

05AB1E , 10 8 7 octets

Merci à Emigna d' avoir économisé 2 octets!

ðâƶ.cðζ

Utilise le codage 05AB1E . Essayez-le en ligne!

Adnan
la source
Selon cette ligne, l’espace entre chaque caractère d’une ligne doit être au minimum égal à 1, que vous pouvez supprimer ¶«. (a également vérifié la validité avec OP)
Emigna
@ Emigna Merci! :)
Adnan
Peut-être envie de mettre à jour le lien Tio :)
Mr. Xcoder
@ Mr.Xcoder ninja'd
Adnan
1
Utilisation intelligente de âau ðâlieu de Sð«!
Erik the Outgolfer
9

Python 2 , 75 octets

s=input()
k=l=len(s)
while k>1-l:k-=1;m=abs(k);print' '*m+' '.join(s[m::2])

Essayez-le en ligne!

Ruud a sauvegardé 3 octets.

Lynn
la source
3
Cela a été autorisé par l'OP: 78 octets . L'espace sur chaque ligne doit être d'au moins 1 .
M. Xcoder
1
75 octets
Arfie
8

C, 86 78 73 70 caractères

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Essayez-le en ligne!

Explication

Implantation naïve: deux cycles, remplir de haut en bas, de gauche à droite (99 octets):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Put () imprime simplement \ n dans la sortie. Combinons les déclarations de variable et combinons j ++ avec quelque chose (94 octets):

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

Bien. La variable j a une plage de 0 ... 2n; que ce soit dans -n ... n, cela simplifie les calculs. Notez que l'expression booléenne à droite de && a toujours la valeur 0 ou 1. Cela signifie que nous pouvons remplacer && par &. 91 octets:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Et maintenant nous avons réalisé que nous imprimions un espace supplémentaire. Et oui, nous n’avons pas besoin de printf () pour imprimer un seul symbole. 86 octets:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Encore mieux. Notez que la condition i * i> = j * j est identique à i> = abs (j), mais plus courte. Déplaçons une expression d’incrémentation de boucle dans (). Et devine quoi? En fait, nous n'avons pas besoin des accolades autour de i + j. 78 octets:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

Saviez-vous que putchar () renvoie le caractère imprimé? Utilisons XOR pour tester les nombres pour l’équivalence. Souvenons-nous que le code de caractères de fin de ligne est 13. Enfin, saviez-vous que GCC / Clang prend en charge https://en.wikipedia.org/wiki/Elvis_operator ? 73 octets:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Enfin, devinez quoi? Nous n'avons pas besoin de deux pour les boucles. Nous pouvons remplacer laide ~ i + j avec seulement ij. 70 octets:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Travaux futurs: changer le sens de la boucle? Cela pourrait économiser des octets, si cela est fait correctement.

MrShoor
la source
5

SOGL V0.12 , 13 10 9 octets

ēI*@∑}¹╚H

Cela utilise une fonctionnalité que je viens d'ajouter , mais qui a été documentée il y a un moment.

Essayez-le ici!
Dans ce lien ,est ajouté parce que cela attend l'entrée sur la pile et {ajouté car sinon ,serait exécuté à chaque fois dans la boucle

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise
dzaima
la source
4

Haskell , 73 octets

f s|l<-length s-1=[zipWith min s$(' '<$[1..abs x])++cycle"~ "|x<-[-l..l]]

Essayez-le en ligne!

Lynn
la source
3

Gaia , 16 octets

$:ċ⟪×$§×⟫†€|$¦tụ

Essayez-le en ligne!

Explication

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines
Chat d'affaires
la source
3

Python 2 , 86 83 octets

-3 grâce à officialaimm

lambda s,j=' '.join:map(j,zip(*(j(c*-~i).center(len(s)*2)for i,c in enumerate(s))))

Essayez-le en ligne!

Arfie
la source
1
83 octets
officialaimm
3

Octave, 59 63 58 57 octets

@(s,a=@strjust)a([kron(+a(hankel(s)),[1 0;0 0]) '']',99)'

Essayez-le en ligne!

rahnema1
la source
1
99: bonne idée :-)
Luis Mendo
3

Java, 292 octets (désolé)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}
Ubzack
la source
1
Vous pouvez supprimer les nouvelles lignes, sinon, cela a l'air bien joué au golf!
Zacharý
1
Vous pouvez jouer plus au golf: 1 boolean a=1<0,o=L%2>0;.. 2. Si vous n'avez pas besoin i, utilisez cette boucle: for(i=0;i++<n;). 3. Vous pouvez vous débarrasser de o: j%2<L%2alors j%2>L%2. 4. Utiliser dcomme flip prend autant de caractères: faites-le j<(x<0?-x:x). 5. Vous avez beaucoup plus de variables que nécessaire. 6. Vous n'avez pas besoin d'un programme complet: un lambda ou une méthode suffit. - Si vous voulez un exemple Java en golf, vérifiez ma réponse .
Olivier Grégoire
3

Haskell , 81 octets

f s|l<-length s=[[last$' ':[s!!i|i>=n,mod(n+i)2<1]|i<-[0..l-1]]|n<-abs<$>[-l..l]]

Essayez-le en ligne!

Laikoni
la source
3

Java (OpenJDK 8) , 116 octets

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

Essayez-le en ligne!

Explication

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}
Olivier Grégoire
la source
3

C ++, 135 octets

Ok, voici mon coup avec C ++:

auto f=[&](auto f,int y)->void{
  for(int i{};i<n;i++) putchar(y<0?f(f,y+1?i+1:n-1-i),'\n':i<y||i+y&1?' ':s[i]);
}; f(f,-1); f(f,-2);

Essayez-le en ligne (ideone)!

Alexandr Poltavsky
la source
3

Haskell , 140 137 octets

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

Essayez-le en ligne!

3 octets sauvés à Challenger5

Je ne pense pas que ce soit optimal ...

fproduit l'une des lignes ( m= 0 ou 1 est le modulo du numéro de ligne, nest le numéro de la ligne)

g intercale les lignes "impaires" et "paires" et ajoute au résultat un miroir de lui-même.

jferard
la source
Vous pouvez enregistrer des octets en définissant fune fonction infixe (comme dans (m#n)s=...) plutôt qu'une fonction préfixe.
Esolanging Fruit
2

Pyth , 25 octets

j+_Km++*d;@Qdtj;%2>QdUQtK

Essayez ici.

M. Xcoder
la source
2

Mathematica 105 octets

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Je pourrais peut-être me débarrasser d'un ou deux octets supplémentaires, mais le nombre de caractères nécessaire pour traiter les chaînes dans Mathematica rend les défis simples comme celui-ci non compétitif.

Kelly Lowder
la source
2

J, 54 octets

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Essayez-le en ligne! (notez que la sortie sur TIO a une nouvelle ligne et trois espaces, mais cela ne provient pas de l'appel de fonction - c'est probablement ce que l'interpréteur J fait automatiquement).

Je pense que l'idée générale de résoudre ce problème est juste, mais il y a de petites choses que je suis probablement en train de faire de manière sous-optimale qui ajoutent au décompte.

Variantes précédentes

55 octets

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 octets

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

Explication

Ce sera divisé en quelques fonctions. De plus, je n’étais pas aussi complet avec les dernières parties de l’explication, alors laissez-moi savoir si vous voulez une meilleure explication pour une certaine partie et je peux l’éditer dans.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup duplique chaque caractère autant de fois que son index (plus un) dans la chaîne
  • space insère des espaces entre chaque caractère
  • pad remplit les personnages avec la bonne quantité d'espace
  • trans transpose la matrice résultante

Exemple d'appel:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Dup

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

Les résultats sont encadrés pour empêcher J de remplir les extrémités avec des espaces (étant donné qu’elles sont de longueur inégale).

Exemple d'appel:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

Espace

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Exemple d'appel:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

Tampon

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

Fondamentalement, pad le premier élément avec la longueur - 1 espaces, le second avec la longueur - 2, etc. Il supprime également la boxe.

Exemple d'appel:

   pad space dup 'abc'
  a  
 b b 
c c c

Transposer

C'est juste la fonction intégrée |:qui prend la transposition d'une matrice.

Cole
la source
1
J'ai utilisé une approche similaire, mais j'ai évité la boxe. 45 octets: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). il pourrait sûrement être joué au golf plus loin. cette partie -@i.@-@#est un fruit en suspens, le plus probable
Jonah
@ Jonah Je ne peux pas déchiffrer rapidement le fonctionnement de votre réponse. Je vous laisse donc le poster si vous le souhaitez, car j'aime inclure une explication de ma réponse. Je suppose que J est pour moi en ce moment un langage en écriture seule.
cole
utile pour déchiffrer rapidement:, donne f=. <some tacit expression>ensuite 5!:2 <'f'une visualisation encadrée et 5!:4 <'f'une visualisation arborescente. dans mon cas, essayez d’abord d’utiliser $"0~1+i.@#une chaîne, puis exécutez tout ce qui se trouve à droite de |."0 1, puis comprenez que |."0 1tout ce qui se trouve à gauche, sauf la transposition finale, ne fait que les rotations nécessaires.
Jonas
1
oh, je ne m'attendais pas à ce que vous mettiez à jour votre réponse. c'était plutôt un "hé, vous pourriez trouver cela intéressant." J'aurais pu l'afficher, mais je pensais que les approches de haut niveau étaient assez similaires et que cela n'en valait pas la peine.
Jonas
2
Je viens de me rappeler les arguments complexes des #aides ici, 26 octets avec|:@((-#)|."_1(1j1##)"0)~#\
miles
1

JavaScript (ECMAScript 6), 161 octets

(s,n=console.log)=>s.split("").map((q,i,a,p)=>n(p=" ".repeat(q=a.length-++i)+a.map((v,j)=>j>=q&&j%2==q%2?a[j]+' ':'').join(''))||p).reverse().map((v,i)=>i&&n(v))

Essayez-le en ligne!

sgtdck
la source
1

Perl 5 , 86 + 2 (-F) = 88 octets

J'ai utilisé les suggestions de @Dom et quelques-uns de mes propres réglages pour réduire le nombre d'octets.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

Essayez-le en ligne!

Xcali
la source
Désolé, content que vous ayez eu votre réponse! J'avais un petit jeu quand j'essayais de réparer le mien et je ne pouvais pas obtenir une solution, le vôtre était une meilleure approche! Il est possible de supprimer quelques octets en utilisant -aFpour mettre toutes les lettres @Fet quelques petites modifications ( -Fcompte pour 3, car il faut un espace après): Essayez-le en ligne!
Dom Hastings
1
Pourquoi -F compte pour 3? Ne devrait-il pas être 2 au plus? N'est-ce pas la différence entre perl -e'code...'et perl -eF 'code...'. Est également -ainutile lors de l'utilisation -F, de sorte que l'octet peut être coupé.
Xcali
C'est ça exactement. Donc -Faccepte un argument, mais nous ne voulons pas en passer un ( -Fnous permet de contrôler les -adivisions, pas d'argument, divisez chaque caractère séparément), c'est donc la différence entre perl -ae '...'et perl -aF -e '...'. Par défaut, -ase scinde /\s+/. J'espère que ça aide à clarifier!
Dom Hastings
En outre, bonne utilisation de $#F! Oublie toujours ça!
Dom Hastings
0

q / kdb +, 55 octets

Solution:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Exemple:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Explication:

FAIRE. la version non golfée est de 66 octets:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Prime:

Pour obtenir le même résultat que l'exemple (74 octets):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
streetster
la source