Eine Schnur zur Detonation bringen

34

Drucken Sie eine beliebige Zeichenfolge in Form eines Dreiecks aus, in dem der Text entlang jeder Diagonale nach oben und unten verläuft. Zum Beispiel sollte eine Eingabe von "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

Der Abstand zwischen den einzelnen Zeichen in einer Zeile muss mindestens 1 betragen, um das richtige Format beizubehalten.

Machiavelli
quelle
1
Dürfen wir annehmen, dass der String nicht leer ist?
Mr. Xcoder
@ Mr.Xcoder Ja, Sie können
machiavelli
1
Der Abstand zwischen den einzelnen Zeichen in einer Zeile muss mindestens 1 betragen. Bedeutet dies, dass H l o W r des sich um eine gültige mittlere Zeile handelt? Fragen, weil in Ihrem Beispiel jede Zeile 3 Leerzeichen zwischen den einzelnen Zeichen enthält.
Emigna
1
@Emigna Ich habe deine Frage falsch verstanden, entschuldige mich. Ja, Ihr Beispiel wäre gültig.
Machiavelli
1
Führende oder nachfolgende Leerzeichen erlaubt?
Luis Mendo

Antworten:

19

Kohle , 10 7 Bytes

↗ELθ✂θιUE¹

Probieren Sie es online! Probieren Sie es online! Links führen zur ausführlichen Version des Codes. Erläuterung:

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

Zum ersten Mal musste ich den UEBefehl verwenden.

Neil
quelle
Ich wusste, dass Holzkohle eine der ersten Antworten sein würde. War fast verlockend, mich selbst anzufangen, aber ich bin noch unerfahren damit, um eine Lösung rechtzeitig fertig zu stellen, und es würde sowieso herausgolfen werden.;)
Kevin Cruijssen
6
@Emigna ... aber das war meine große Chance zu nutzen UE...
Neil
6
@EriktheOutgolfer ... aber das war meine große Chance zu nutzen UE..
Neil
1
@Neil Es ist -3 Bytes! -3 für ein schönes Opfer! Wer möchte nicht ein paar nette -3?
Erik der Outgolfer
4
@EriktheOutgolfer Was Sie sagen sollen, ist: "Sie können sich doch nicht von 05AB1E schlagen lassen, oder?"
Neil
12

05AB1E , 10 8 7 Bytes

Vielen Dank an Emigna für das Speichern von 2 Bytes!

ðâƶ.cðζ

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Adnan
quelle
Gemäß dieser Zeile Der Abstand zwischen den einzelnen Zeichen in einer Zeile muss mindestens 1 betragen, den Sie entfernen können ¶«. (bestätigte auch die Gültigkeit mit OP)
Emigna
@Emigna Danke! :)
Adnan
Möchte möglicherweise
@ Mr.Xcoder Ninja'd
Adnan
1
Clevere Verwendung von âin ðâstatt Sð«!
Erik der Outgolfer
9

Python 2 , 75 Bytes

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

Probieren Sie es online!

Ruud sparte 3 Bytes.

Lynn
quelle
3
Dies wurde vom OP erlaubt: 78 Bytes . Der Abstand in jeder Zeile muss mindestens 1 betragen .
Mr. Xcoder
1
75 Bytes
Arfie
8

C 86 78 73 70 Zeichen

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

Probieren Sie es online!

Erläuterung

Naive Implementierung: Zwei Zyklen, füllen von oben nach unten, von links nach rechts (99 Bytes):

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

Hier druckt puts () nur \ n in die Ausgabe. Lassen Sie uns Variablendeklarationen kombinieren und j ++ mit etwas (94 Bytes) kombinieren:

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

Gut. Die Variable j hat einen Bereich von 0 ... 2n; Lass es in -n ... n sein, das macht die Mathematik einfacher. Beachten Sie, dass der boolesche Ausdruck rechts von && immer den Wert 0 oder 1 hat. Dies bedeutet, dass wir && durch & ersetzen können. 91 Byte:

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

Und jetzt haben wir festgestellt, dass wir einen zusätzlichen Raum drucken. Und ja, wir brauchen printf () nicht, um nur ein einziges Symbol zu drucken. 86 Bytes:

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

Noch besser. Beachten Sie, dass die Bedingung i * i> = j * j dieselbe ist wie i> = abs (j), jedoch kürzer. Lassen Sie uns Puts () in den Inkrement-Ausdruck der Schleife verschieben. Und rate was? Eigentlich brauchen wir die Klammern um i + j nicht. 78 Bytes:

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

Wussten Sie, dass putchar () das gedruckte Zeichen zurückgibt? Verwenden wir XOR, um Zahlen auf Äquivalenz zu testen. Ersetzen wir das Leerzeichen durch den ASCII-Code 32. Denken Sie daran, dass der Code für das Zeilenende 13 ist. Und schließlich: Wussten Sie, dass GCC / Clang https://en.wikipedia.org/wiki/Elvis_operator unterstützt ? 73 Bytes:

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

Raten sie mal was Wir brauchen keine zwei für Schleifen. Wir können hässliches ~ i + j durch nur ij ersetzen. 70 Bytes:

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

Zukünftige Arbeit: Schleifenrichtung ändern? Dies kann bei richtiger Ausführung einige Bytes einsparen.

MrShoor
quelle
5

SOGL V0.12 , 13 10 9 Bytes

ēI*@∑}¹╚H

Dies verwendet eine Funktion, die ich gerade hinzugefügt , aber vor einiger Zeit dokumentiert wurde.

Probieren Sie es hier aus!
In diesem Link ,wird hinzugefügt, weil dies die Eingabe auf dem Stapel erwartet und {hinzugefügt, weil sonst ,jedes Mal in der Schleife ausgeführt würde

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
quelle
3

Gaia , 16 Bytes

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

Probieren Sie es online!

Erläuterung

$                 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
Geschäfts-Katze
quelle
3

Python 2 , 86 83 Bytes

-3 danke an officialaimm

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

Probieren Sie es online!

Arfie
quelle
1
83 Bytes
offiziell
3

Oktave, 59 63 58 57 Bytes

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

Probieren Sie es online!

rahnema1
quelle
1
99: gute Idee :-)
Luis Mendo
3

Java, 292 Bytes (Entschuldigung)

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
quelle
1
Sie können die Zeilenumbrüche entfernen, sonst sieht das ziemlich golfen aus!
Zacharý
1
Sie können mehr Golf spielen: 1 boolean a=1<0,o=L%2>0;.. 2. Wenn Sie nicht brauchen i, benutzen Sie diese Schleife: for(i=0;i++<n;). 3. Sie können loswerden o: j%2<L%2dann j%2>L%2. 4. dAls Flip zu benutzen, braucht so viele Zeichen: einfach tun j<(x<0?-x:x). 5. Sie haben weit mehr Variablen als benötigt. 6. Sie brauchen kein vollständiges Programm: Ein Lambda oder eine Methode ist ausreichend. - Wenn Sie ein Golf-Java-Beispiel wünschen, überprüfen Sie meine Antwort .
Olivier Grégoire
3

Haskell , 81 Bytes

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

Probieren Sie es online!

Laikoni
quelle
3

Java (OpenJDK 8) , 116 Byte

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

Probieren Sie es online!

Erläuterung

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
quelle
3

C ++, 135 Bytes

Okay, hier ist meine Aufnahme mit 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);

Probieren Sie es online aus (ideone)!

Alexandr Poltavsky
quelle
3

Haskell , 140 137 Bytes

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

Probieren Sie es online!

Gespeicherte 3 Bytes an Challenger5

Ich finde das nicht optimal ...

ferzeugt eine der Zeilen ( m= 0 oder 1 ist das Modulo der Zeilennummer, nist die Nummer der Zeile)

g interkaliert "ungerade" und "gerade" Linien und fügt dem Ergebnis einen Spiegel seiner selbst hinzu.

jferard
quelle
Sie können Bytes sparen, indem Sie feine Infix-Funktion (wie in (m#n)s=...) anstelle einer Präfix-Funktion definieren.
Esolanging Fruit
2

Mathematica 105 Bytes

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

Vielleicht könnte ich noch ein oder zwei Bytes abschneiden, aber der zusätzliche Aufwand für die Zeichenanzahl beim Umgang mit Zeichenfolgen in Mathematica macht einfache Herausforderungen wie diese nicht wettbewerbsfähig.

Kelly Lowder
quelle
2

J, 54 Bytes

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

Probieren Sie es online! (Beachten Sie, dass die Ausgabe auf TIO eine neue Zeile und drei Leerzeichen hat, aber nicht vom Funktionsaufruf stammt - es ist wahrscheinlich genau das, was der J-Interpreter automatisch macht).

Ich denke, die allgemeine Idee, dies zu lösen, ist richtig, aber es gibt kleine Dinge, die ich wahrscheinlich suboptimal mache und die das bytecount erweitern.

Vorherige Varianten

55 Bytes

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

56 Bytes

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

Erläuterung

Dies wird in einige Funktionen aufgeteilt. Außerdem war ich mit den letzten Teilen der Erklärung nicht so gründlich. Lassen Sie mich wissen, ob Sie eine bessere Erklärung für einen bestimmten Teil wünschen, und ich kann diese in bearbeiten.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup dupliziert jedes Zeichen so oft wie sein Index (plus eins) in der Zeichenfolge
  • space Fügt Leerzeichen zwischen die einzelnen Zeichen ein
  • pad füllt die Zeichen mit der richtigen Anzahl von Leerzeichen auf
  • trans transponiert die resultierende Matrix

Beispielanruf:

   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

Die Ergebnisse sind mit einem Kästchen versehen, um zu verhindern, dass J die Enden mit Leerzeichen auffüllt (da sie ungleich lang sind).

Beispielanruf:

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

Platz

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

Beispielanruf:

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

Pad

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

Grundsätzlich füllen Sie das erste Element mit der Länge 1, das zweite mit der Länge 2 usw. auf. Dadurch wird auch der Rahmen entfernt.

Beispielanruf:

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

Transponieren

Dies ist nur die eingebaute Funktion, |:die die Transponierung einer Matrix übernimmt.

cole
quelle
1
Ich habe einen ähnlichen Ansatz gewählt, aber Boxen vermieden. 45 Bytes |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). es könnte sicherlich weiter golfen werden. Dieser Teil -@i.@-@#ist etwas niedrig hängende Frucht, höchstwahrscheinlich
Jonah
@Jonah Ich kann nicht schnell entschlüsseln, wie Ihre Antwort funktioniert, daher überlasse ich es Ihnen, sie zu posten, wenn Sie möchten, da ich gerne eine Erläuterung meiner Antwort beifüge. Ich denke, J ist für mich im Moment eine reine Schreibsprache.
Cole
hilfreich für die schnelle Entschlüsselung: f=. <some tacit expression>gibt dann 5!:2 <'f'eine Box-Visualisierung und 5!:4 <'f'gibt eine Baum-Visualisierung. In meinem Fall versuchen Sie, zuerst $"0~1+i.@#mit einer Zeichenfolge zu arbeiten, dann führen Sie alles rechts davon aus |."0 1, dann verstehen Sie das |."0 1und alles links, außer der endgültigen Transponierung, führt nur die erforderlichen Rotationen aus.
Jonah
1
Oh, ich hatte nicht erwartet, dass du deine Antwort aktualisierst. es war eher ein "hey, das findest du vielleicht interessant." Ich hätte es posten können, aber ich fand, dass die Herangehensweisen auf hoher Ebene ähnlich genug waren, dass es sich nicht lohnt.
Jonah
2
Ich erinnere mich nur an die komplexen Argumente von #Hilfen hier, 26 Bytes mit|:@((-#)|."_1(1j1##)"0)~#\
Meilen
1

JavaScript (ECMAScript 6), 161 Byte

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

Probieren Sie es online!

sgtdck
quelle
1

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

Benutzte @ Doms Vorschläge und ein paar meiner eigenen Optimierungen, um die Byteanzahl zu senken.

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

Probieren Sie es online!

Xcali
quelle
Tut mir leid, ich bin froh, dass du deine Antwort da draußen hast! Ich hatte ein bisschen Spaß, als ich versuchte, meine Probleme zu beheben und keine Lösung zu finden. Ihre Vorgehensweise war besser! Es ist möglich, ein paar Bytes zu löschen -aF, um alle Buchstaben @Feinzufügen, und ein paar kleine Änderungen vorzunehmen ( -Fzählt als 3, da danach ein Leerzeichen erforderlich ist): Probieren Sie es online aus!
Dom Hastings
1
Warum zählt -F als 3? Sollte es nicht höchstens 2 sein? Ist es nicht der Unterschied zwischen perl -e'code...'und perl -eF 'code...'? Auch -aist bei der Verwendung unnötig -F, damit Byte geschnitten werden kann.
Xcali
Genau das ist es. So -Fein Argument akzeptiert, aber wir haben nicht ein in wollen passieren ( -Fermöglicht es uns , zu kontrollieren , was -aspaltet auf, kein Argument, geteilt jedes Zeichen auf eigenem) , so ist es der Unterschied zwischen perl -ae '...'und perl -aF -e '...'. Standardmäßig ist die -aAufteilung aktiviert /\s+/. Ich hoffe, das hilft zu klären!
Dom Hastings
Auch schöne Verwendung von $#F! Vergiss das immer!
Dom Hastings
0

q / kdb + 55 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

MACHEN. ungolfed version ist 66 bytes:

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

Bonus:

So erhalten Sie die gleiche Ausgabe wie im Beispiel (74 Byte):

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
quelle