Pliez une chaîne en triangle

22

Étant donné une chaîne dont la longueur est divisible par 4, faites un triangle comme illustré ci-dessous.

Si la chaîne est abcdefghijkl, alors le triangle serait:

   a
  b l
 c   k
defghij

Si la chaîne est iamastringwithalengthdivisiblebyfour, alors le triangle serait:

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

Si la chaîne est thisrepresentationisnotatriangle, alors le triangle serait:

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

Remarques

  • La chaîne ne sera composée que de caractères de aà z.
  • Les espaces blancs en début / fin et les nouvelles lignes sont autorisés tant que la forme n'est pas rompue.
  • Une liste de chaînes en sortie est autorisée.

C'est du . La réponse la plus courte en octets gagne. Des échappatoires standard s'appliquent.

Leaky Nun
la source

Réponses:

7

Charbon de bois , 25 22 21 octets

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Tranche simplement la chaîne en trois parties et imprime-les dans les directions appropriées. Modifier: enregistré 3 octets en utilisant la division entière et le découpage. Enregistré un octet supplémentaire en utilisant CycleChopau lieu de Slicepour la tête de la chaîne. Edit: Charcoal prend désormais en charge le dessin de texte arbitraire le long du bord d'un polygone, simplifiant le code à 12 octets:

GH↙→→↖⊕÷Lθ⁴θ

Essayez-le en ligne! Le lien est vers la version détaillée du code.

Neil
la source
Que font les s?
Erik the Outgolfer le
@EriktheOutgolfer C'est le nouvel opérateur Slice.
Neil
: | Oups pour que PolygonHollow fasse cela, GH↙→→↖⊕÷Lθ⁴θcela fonctionnera la prochaine fois que je pousserai Charcoal
ASCII uniquement
6

05AB1E , 23 octets

ćsIg4÷GćsÁćsŠN·<ú«s}».C

Essayez-le en ligne!

Explication

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center
Emigna
la source
6

JavaScript (ES6), 119 117 108 105 octets

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

Formaté et commenté

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

Cas de test

Arnauld
la source
4

C #, 260 octets

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

Je voulais vraiment utiliser SetCursorPosition.

Non golfé:

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}
LiefdeWen
la source
Excusez mon ignorance, mais quel est le but de l'action dans votre solution? Est-ce juste moins d'octets qu'une fonction void?
confusedandamused
1
@confusedandamused J'ai l'habitude d'écrire des réponses à fonction unique, donc je n'ai même pas envisagé de mettre la fonction normalement, elle sera cependant plus courte.
LiefdeWen
3

Mathematica, 164 octets

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


contribution

["iamastringwithalengthdivisiblebyfour"]

J42161217
la source
Nous savons tous que cela [[1]]peut être remplacé par #&@@.
user202729
1
vous êtes tous des bonbons si intelligents!
J42161217
Je voulais dire codegolf.stackexchange.com/questions/12900/… .
user202729
Lorsque vous vous trouvez en train de faire @(...), faites-le à la [...]place. Et je n'ai pas testé, mais vous pouvez probablement enregistrer un autre octet en donnant Columnun nom (ou peut-être même pour Column[#,Alignment->Center]&éviter q), puis en mettant toutes les variables restantes dans le premier argument de l'extérieur Column(pour enregistrer les parenthèses environnantes).
Martin Ender
3

Python 3 , 120 octets

Premier golf, j'ai pensé que je pourrais aussi bien apprendre du Python en cours de route.

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

Essayez-le en ligne!

Explication:

Le premier caractère est imprimé seul après les len(a)//4espaces, puis les premier et dernier icaractères à partir du second sont imprimés, séparés par des 2*i - 1espaces.

Enfin, la sous-chaîne restante est imprimée.

Fedone
la source
Bienvenue chez PPCG! Vous pouvez apprendre de cette solution .
Leaky Nun
Un golf possible ici est de déclarer p=print, puis d'utiliser simplement ppour les trois que printvous utilisez.
FlipTack
De plus, comme la longueur de la chaîne est toujours divisible par quatre, //(division du sol) peut être remplacé par /.
FlipTack
Soit dit en passant, le code que vous avez lié pour essayer en ligne n'est pas le même que le code dans votre réponse.
FlipTack
3

GNU sed , 178 158 132 132 + 1 = 133 octets

+1 octet pour le -rdrapeau.

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

Essayez-le en ligne!

Explication

Dans les révisions précédentes, j'utilisais beaucoup d'octets traitant des mathématiques, des cas spéciaux et du nettoyage, même si intuitivement j'étais sûr qu'ils pouvaient être évités. Depuis, j'ai réussi à le faire, surtout.

Supposons que nous ayons l'entrée abcdEFGHIJKLMnop. Les lettres EFGHIJKLMseront au bas du triangle, je les ai donc mises en majuscule comme aide visuelle.

Nous préparons d'abord l'entrée en plaçant le premier caractère sur sa propre ligne (précédé d'un espace) et en insérant un curseur ( ;) avant le dernier caractère:

s/(.)(.*)(.)/ \1\n\2;\3/

Maintenant nous avons:

 a
bcdEFGHIJKLMno;p

Maintenant, dans une boucle, nous allons faire quelques choses sur la dernière ligne: 1. Copiez les espaces de la ligne précédente et insérez-les après le premier caractère, plus deux; 2. Déplacez le dernier caractère à droite après les espaces, suivi d'une nouvelle ligne; et 3. Déplacez le curseur de trois caractères vers la gauche.

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

Voici le résultat de chaque itération:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

Vous pouvez voir la pyramide commencer à prendre forme. Vous pouvez également voir à quoi servait le curseur: à chaque itération, il se déplaçait de trois caractères vers la gauche, et lorsqu'il n'y avait plus trois caractères à sa gauche, il rompait la boucle, qui se trouve être juste au moment où nous avons atteint le "bas" de la pyramide.

Maintenant, nous allons faire une opération similaire mais en sens inverse. Dans une boucle, nous allons copier les espaces du début de la ligne avec le curseur au début de la ligne précédente, plus un, dans le processus de déplacement du curseur vers cette ligne.

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

Voici quelques itérations et le résultat final:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

Nous avons tous terminé maintenant, à l'exception de quelques caractères supplémentaires: un ;espace supplémentaire sur la première ligne et deux espaces au "milieu" de la pyramide sur les trois lignes suivantes. Une simple substitution s'en débarrasse:

s/. (.)$/\1/gm

Terminé!

    a
   b p
  c   o
 d     n
EFGHIJKLM
Jordan
la source
2

Rubis , 106 octets

i=-1
s= ~/$/
sub /./,"#{' '*l=s/4}\\0
"
(l-1).times{sub /^(\w)(.*)(.)/,"#{' '*l-=1}\\1#{' '*i+=2}\\3
\\2"}

Essayez-le en ligne!

Encre de valeur
la source
2

Python 2 , 100 97 96 octets

  • Jacoblaw a sauvé 1 octet: la division entière n'est pas nécessaire
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

Essayez-le en ligne!

Explication:

Une chose intelligente que j'ai faite ici est de remplir l'entrée avec un espace à la fin, de sorte que le premier caractère se couple avec lui et cela peut être poussé dans la boucle (et puisque les espaces de fin sont autorisés)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

Le nombre de boucles à suivre est associé à len(word)//4. Dans l'étape finale, la chaîne restante entière est imprimée (cela forme la base du triangle). Les espaces suivent un schéma simple; le premier ensemble d'espaces continue de diminuer de 1, tandis que le deuxième ensemble d'espaces continue d'augmenter de 2.

officialaimm
la source
1
Pouvez-vous raser un octet en ne faisant pas de division entière? Depuis asera toujours un multiple de 4. //->/
jacoblaw
Merci, je suis surpris qu'il ne lance pas d'erreurs même pour [entrées de longueur non divisible par 4] [ tio.run/…
officialaimm
1
En effet, dans Python 2, la division est un entier par défaut. Cela a été créé en Python 3.
CalculatorFeline
2

C 225 octets

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

expliqué

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}
Alex Zeffertt
la source
2

C #, 172 octets

int i=0,n=s.Length;var p="";p=new string(' ',n/4)+s[i]+"\r\n";for(i=1;i<n/4;i++){p+=new string(' ',n/4-i)+s[i]+new string(' ',i*2-1)+s[n-i]+"\r\n";}p+=s.Substring(i,n/2+1);

Essayez-le en ligne!

Erlantz Calvo
la source
1

Octave, 87 octets

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

* Dans une machine Windows, le code ci-dessus produit le résultat correct mais en tio j'ai ajouté du code pour le corriger.

Explication:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

Essayez-le en ligne!

rahnema1
la source
1

Haskell , 136 octets

i#x=x<$[1..i]
f s|let h=div l 4;l=length s=unlines$[(h-i)#' '++(s!!i):(2*i-1)#' '++[(s++" ")!!(l-i)]|i<-[0..h-1]]++[drop h$take(l-h+1)s]

Essayez-le en ligne!

sudee
la source
1

PHP> = 7.1, 122 octets

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i])echo str_pad(str_pad($a[$i],$i*2).$e,$w+1," ",2),"
";echo substr($a,$i,$w+1);

PHP Sandbox Online

PHP> = 7.1, 124 octets

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i],$s.=$s?"  ":" ")echo str_pad("",$w/2-$i)."$a[$i]$s$e
";echo substr($a,$i,$w+1);

PHP Sandbox Online

Jörg Hülsermann
la source
1

AWK , 129 octets

{n=split($0,a,"")
printf"%"(w=n/4+1)"s\n",a[++i]
for(;++i<w;)printf"%"(w-i+1)"s%"2*i-2"s\n",a[i],a[n-i+2]
$0=substr($0,i,i+w-1)}1

Essayez-le en ligne!

Je devrais penser que cela pourrait être un peu plus joué au golf, tout simplement sans le voir.

Robert Benson
la source
1

Rétine , 99 octets

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

Essayez-le en ligne! Explication: Les deux premières étapes génèrent les deux premières lignes, mais après cela, aucun boîtier spécial n'est nécessaire et chaque ligne suivante peut être générée automatiquement:

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat
Neil
la source
1

Java 8, 213 octets

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

Explication:

Essayez-le ici.

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)
Kevin Cruijssen
la source
0

Perl 5 , 76 octets

74 octets de code +2 pour -F

say$"x($l=@F/4),shift@F;say$"x$l,shift@F,$"x($#i+=2),pop@F while--$l;say@F

Essayez-le en ligne!

Xcali
la source