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.


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.


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!


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


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.


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


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




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;}}}

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

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.
   );
}


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.


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

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.


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.


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!


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!


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
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.