Falte eine Schnur zu einem Dreieck


22

Wenn Sie eine Zeichenfolge haben, deren Länge durch 4 teilbar ist, bilden Sie ein Dreieck, wie unten gezeigt.

Wenn der String ist abcdefghijkl, dann wäre das Dreieck:

   a
  b l
 c   k
defghij

Wenn der String ist iamastringwithalengthdivisiblebyfour, dann wäre das Dreieck:

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

Wenn der String ist thisrepresentationisnotatriangle, dann wäre das Dreieck:

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

Anmerkungen

  • Die Zeichenfolge besteht nur aus Zeichen von abis z.
  • Führende / nachfolgende Leerzeichen und Zeilenumbrüche sind zulässig, solange die Form nicht unterbrochen wird.
  • Eine Liste von Zeichenfolgen als Ausgabe ist zulässig.

Das ist . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .

Antworten:


7

Holzkohle , 25 22 21 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Schneide die Schnur einfach in drei Teile und drucke sie in die entsprechenden Richtungen. Bearbeiten: 3 Bytes mit Integer Division und Slicing gespeichert. Speichert ein weiteres Byte, indem CycleChopstatt Slicefür den Kopf der Zeichenkette verwendet wird. Bearbeiten: Charcoal unterstützt jetzt das Zeichnen von beliebigem Text entlang der Kante eines Polygons, wodurch der Code auf 12 Byte vereinfacht wird:

GH↙→→↖⊕÷Lθ⁴θ

Probieren Sie es online! Link ist eine ausführliche Version des Codes.


Was machen die s?
Erik der Outgolfer

@EriktheOutgolfer Das ist der neue Slice-Operator.
Neil

: | Hoppla, damit PolygonHollow das macht, GH↙→→↖⊕÷Lθ⁴θwird funktionieren, wenn ich das nächste Mal Charcoal drücke
ASCII

6

05AB1E , 23 Bytes

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

Probieren Sie es online!

Erläuterung

ć                        # 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

6

JavaScript (ES6), 119 117 108 105 Byte

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,'')

Formatiert und kommentiert

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

Testfälle


4

C # 260 Bytes

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

Wollte eigentlich nutzen SetCursorPosition.

Ungolfed:

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

Entschuldigen Sie meine Unwissenheit, aber was ist der Zweck des Handelns in Ihrer Lösung? Ist es nur weniger Bytes als eine leere Funktion?
confusedandamused

1
@confusedandamused Ich bin es gewohnt, einzelne Funktionsantworten zu schreiben, habe also nicht einmal überlegt, die Funktion normal zu platzieren, sie wird jedoch kürzer sein.
LiefdeWen

3

Mathematica, 164 Bytes

(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}]})&


Eingang

["iamastringwithalengthdivisiblebyfour"]


Wir alle wissen, dass [[1]]das durch ersetzt werden kann #&@@.
user202729

1
Ihr seid alle so kluge Süße!
J42161217


Wenn du dich dabei befindest @(...), tu es einfach [...]stattdessen. Und ich habe es nicht getestet, aber Sie können wahrscheinlich ein weiteres Byte speichern, indem Sie Columneinen Namen angeben (oder sogar Column[#,Alignment->Center]&vermeiden q) und dann alle verbleibenden Variablen in das erste Argument des äußeren setzen Column(um die umgebenden Klammern zu speichern).
Martin Ender

3

Python 3 , 120 Bytes

Das erste Mal, dachte ich, könnte ich auf dem Weg auch etwas Python lernen.

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

Probieren Sie es online!

Erläuterung:

Das erste Zeichen wird danach von selbst gedruckt len(a)//4 Leerzeichen Anschließend werden das erste und das letzte iZeichen ab dem zweiten Zeichen durch 2*i - 1Leerzeichen getrennt gedruckt .

Zuletzt wird der verbleibende Teilstring gedruckt.


Willkommen bei PPCG! Sie können aus dieser Lösung lernen .
Undichte Nonne

Ein mögliches Golfspiel ist hier zu deklarieren p=printund dann einfach pfür die drei prints zu verwenden, die Sie verwenden.
FlipTack

Da die Saitenlänge garantiert immer durch vier teilbar ist, kann //(Bodenteilung) durch ersetzt werden /.
FlipTack

Übrigens, der Code, den Sie verlinkt haben, um es online zu versuchen, stimmt nicht mit dem Code in Ihrer Antwort überein.
FlipTack

3

GNU sed , 178 158 132 + 1 = 133 Bytes

+1 Byte für -rFlag.

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

Probieren Sie es online!

Erläuterung

In früheren Überarbeitungen habe ich viele Bytes verwendet, die sich mit Mathematik, Sonderfällen und Bereinigung befassten, obwohl ich intuitiv sicher war, dass sie vermieden werden konnten. Ich habe es seitdem meistens geschafft.

Angenommen, wir haben den Input abcdEFGHIJKLMnop. Die Buchstaben EFGHIJKLMwerden am unteren Rand des Dreiecks angezeigt, daher habe ich sie als visuelle Hilfe großgeschrieben.

Zuerst bereiten wir die Eingabe vor, indem wir das erste Zeichen in eine eigene Zeile setzen (mit vorangestelltem Leerzeichen) und einen Cursor ( ;) vor dem letzten Zeichen einfügen :

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

Jetzt haben wir:

 a
bcdEFGHIJKLMno;p

In einer Schleife machen wir jetzt ein paar Dinge in der letzten Zeile: 1. Kopieren Sie die Leerzeichen aus der vorherigen Zeile und fügen Sie sie nach dem ersten Zeichen plus zwei ein. 2. Bewegen Sie das letzte Zeichen nach den Leerzeichen nach rechts, gefolgt von einer neuen Zeile. und 3. Bewegen Sie den Cursor drei Zeichen nach links.

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

Hier ist das Ergebnis jeder Iteration:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

Sie können sehen, wie die Pyramide Gestalt annimmt. Sie können auch sehen, wozu der Cursor diente: Bei jeder Iteration wurden drei Zeichen nach links verschoben, und wenn keine weiteren drei Zeichen mehr vorhanden sind, wird die Schleife unterbrochen. der Pyramide.

Jetzt machen wir eine ähnliche Operation, aber in umgekehrter Reihenfolge. In einer Schleife kopieren wir die Leerzeichen vom Zeilenanfang mit dem Cursor zum Zeilenanfang plus eins, wobei wir den Cursor auf diese Zeile bewegen.

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

Hier sind ein paar Iterationen und das Endergebnis:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

Bis auf einige zusätzliche Zeichen sind wir alle fertig: A ;und zusätzliches Leerzeichen in der ersten Zeile und zwei Leerzeichen in der "Mitte" der Pyramide in den nächsten drei Zeilen. Eine einfache Ersetzung beseitigt sie:

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

Alles erledigt!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

Python 2 , 100 97 96 Bytes

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

Probieren Sie es online!

Erläuterung:

Eine clevere Sache, die ich hier gemacht habe, ist, die Eingabe mit einem Leerzeichen am Ende aufzufüllen, so dass das erste Zeichen damit gepaart wird und dies in die Schleife geschoben werden kann (und da nachfolgende Leerzeichen erlaubt sind).

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.

Die Anzahl der zu verfolgenden Schleifen wird zugeordnet len(word)//4. Im letzten Schritt wird die gesamte verbleibende Zeichenfolge gedruckt (dies bildet die Basis des Dreiecks). Die Räume folgen einem einfachen Muster; Die erste Menge von Leerzeichen nimmt um 1 ab, während die zweite Menge von Leerzeichen um 2 zunimmt.


1
Können Sie ein Byte abschneiden, indem Sie keine Ganzzahldivision durchführen? Da awird immer ein Vielfaches von 4. //->/
jacoblaw sein

Vielen Dank, ich bin überrascht, dass es auch für [Eingaben mit einer durch 4 nicht teilbaren Länge] keine Fehler gibt. [ Tio.run/…
officialaimm

1
Dies liegt daran, dass in Python 2 die Division standardmäßig eine Ganzzahl ist. Das wurde in Python 3 geändert.
CalculatorFeline

2

C 225 Bytes

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

erklärt

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
}

2

C # 172 Bytes

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

Probieren Sie es online!


1

Oktave, 87 Bytes

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

* In einem Windows-Computer erzeugt der obige Code das richtige Ergebnis, aber in tio habe ich etwas Code hinzugefügt, um es zu korrigieren.

Erläuterung:

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

Probieren Sie es online!



1

PHP> = 7.1, 122 Bytes

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 Bytes

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


1

AWK , 129 Bytes

{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

Probieren Sie es online!

Ich sollte denken, dass dies ein bisschen mehr golfen werden könnte, nur nicht sehen.


1

Netzhaut , 99 Bytes

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

Probieren Sie es online! Erläuterung: In den ersten beiden Schritten werden die ersten beiden Zeilen generiert, danach ist jedoch keine spezielle Groß- / Kleinschreibung erforderlich, und jede nachfolgende Zeile kann automatisch generiert werden:

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

1

Java 8, 213 Bytes

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

Erläuterung:

Probieren Sie es hier aus.

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.