Ich habe ein Raumschiff gemacht!

39

Einführung:

Inspiriert von diesem Kommentar von @MagicOctopusUrn auf @Emignas 05AB1E-Antwort für meine " Es war nur ein Fehler " -Herausforderung :

8F9ÝÀNð×ý}».∊Ich habe ein Raumschiff gemacht! Und ich war ganz aufgeregt, eine 12-Byte-Bearbeitung vorzuschlagen. - Magic Octopus Urn 17. Juli 17 um 20:10 Uhr

Welches ist ein 05AB1E (Legacy) -Programm, das dazu führt, dass:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Probieren Sie es online aus.

Herausforderung:

Eingabe: Eine nicht leere Zeichenfolge

Ausgabe: Fügen Sie von außen nach innen in jede Zeile ein Leerzeichen mehr ein, ähnlich wie in der obigen Ausgabe length - 1. Für eine Eingabe wäre 1234567890die Ausgabe also stattdessen:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1        2        3        4        5        6        7        8        9        0
1         2         3         4         5         6         7         8         9         0
1        2        3        4        5        6        7        8        9        0 
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Warum? Die Länge von 1234567890ist 10. Also geben wir zunächst 10 Zeilen aus: die erste Zeile ohne Leerzeichen; zweite mit einem Leerzeichen; dritter mit zwei; usw. Und dann length - 1kehren wir (ohne die mittlere Zeile mit doppelten Leerzeichen zu haben) zur ursprünglichen Eingabe zurück, während wir nach unten gehen.

Herausforderungsregeln:

  • Die Eingabe ist garantiert nicht leer (eine Länge >= 1). (Für einzelne Zeicheneingaben geben wir einfach dieses Zeichen aus.)
  • Jede Menge von nachgestellten / führenden Leerzeichen / Zeilenumbrüchen ist zulässig, solange die Ausgabe selbst (wo immer auf dem Bildschirm) korrekt ist. (Leerzeilen zwischen den Ausgabezeilen sind ebenfalls nicht zulässig.)
  • Die Eingabe enthält nur druckbare ASCII-Zeichen ohne Leerzeichen (Code-Punkt-Bereich [33, 126]).
  • I / O ist flexibel. Die Eingabe kann als STDIN-, Argument- oder Funktionsparameter erfolgen. Kann eine Liste / ein Array / ein Stream von Zeichen anstelle eines Strings sein. Die Ausgabe kann auch eine Liste / ein Array / ein Stream von Zeichen anstelle von Zeichenfolgen sein. kann auf STDOUT gedruckt werden; wird als durch neue Zeilen getrennte Zeichenfolge zurückgegeben; usw.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

Input: @
Output:
@

Input: test
Output:
test
t e s t
t  e  s  t
t   e   s   t
t  e  s  t
t e s t
test

Input: ?!
Output:
?!
? !
?!

Input: Spaceship
Output:
Spaceship
S p a c e s h i p
S  p  a  c  e  s  h  i  p
S   p   a   c   e   s   h   i   p
S    p    a    c    e    s    h    i    p
S     p     a     c     e     s     h     i     p
S      p      a      c      e      s      h      i      p
S       p       a       c       e       s       h       i       p
S        p        a        c        e        s        h        i        p
S       p       a       c       e       s       h       i       p
S      p      a      c      e      s      h      i      p
S     p     a     c     e     s     h     i     p
S    p    a    c    e    s    h    i    p
S   p   a   c   e   s   h   i   p
S  p  a  c  e  s  h  i  p
S p a c e s h i p
Spaceship

Input: 05AB1E
Output:
05AB1E
0 5 A B 1 E
0  5  A  B  1  E
0   5   A   B   1   E
0    5    A    B    1    E
0     5     A     B     1     E
0    5    A    B    1    E
0   5   A   B   1   E
0  5  A  B  1  E
0 5 A B 1 E
05AB1E

Input: )}/\
Output:
)}/\
) } / \
)  }  /  \
)   }   /   \
)  }  /  \
) } / \
)}/\
Kevin Cruijssen
quelle
1
Alles wird nur nervös !!! RAUMFAHRT !!!
WallyWest
1
Ich wusste, dass ich diese Ausgabe erkannte. Ich finde es toll, dass diese Idee immer noch geht.
Carcigenicate
2
Wenn Sie ein Muster in einer Frage vage erkennen, ಠ_ಠstellen Sie fest, dass Sie es vor einem Jahr versehentlich gemacht haben ಠ⌣ಠ.
Magic Octopus Urn
1
@MagicOctopusUrn Danke für die Inspiration. ; D
Kevin Cruijssen
3
@ KevinCruijssen danke, dass du das doofe Zitat behalten hast haha!
Magic Octopus Urn

Antworten:

11

Japt , 8 6 Bytes

Nimmt Eingaben als ein Array von Zeichen und gibt ein Array von Zeichenfolgen aus.

£qYçÃê

Versuch es


Erläuterung

£          :Map each element at (0-based) index Y
 q         :  Join input with
  Yç       :   Space repeated Y times
    Ã      :End Map
     ê     :Palindromise

Original, 8 Bytes

I / O ist eine Zeichenfolge. Verwendet die -RFlagge. Schließt nachfolgende Leerzeichen in jede Zeile ein.

¬£múYÄÃê

Versuch es

Erläuterung

             :Implicit input of string U
¬            :Split
 £           :Map each character at 0-based index Y
  m          :  Map original U
   ú         :    Right pad with spaces to length ...
    YÄ       :     Y+1
      Ã      :End map
       ê     :Palindromise
             :Implicitly join with newlines
Zottelig
quelle
S.ç()FTW noch einmal :-)
ETHproductions
1
Ernsthafte Frage: Wäre es möglich, alle 1 bis 6 Byte langen Lösungen für ein Puzzle wie dieses iterativ zu durchsuchen?
Filip
2
@filip Nein: Es gibt mehr als 256 ** 6 = 281474976710656 (zumindest naive) Kombinationen. Es ist wie ein Passwort erraten.
Kirill Bulygin
3
@KirillBulygin, es gibt über 37 Billionen (37.764.717.485.592) Möglichkeiten, die in Japt verfügbaren Zeichen zu einer Zeichenfolge mit einer Länge zwischen 1 und 6 Zeichen zu kombinieren. Wenn Sie alle anderen 1-Byte-Zeichen einschließen, die in Zeichenfolgenliteralen oder komprimierten Zeichenfolgen verwendet werden können, steigt diese Zahl auf über 276 Billionen (276.024.445.697.280). Also, nein, einen Bot zu schreiben, um all diese zu generieren, dann die gültigen Japt-Programme herauszufiltern und dann dasjenige (falls vorhanden) zu finden, das für die vorliegende Herausforderung geeignet ist, wäre wahrscheinlich nicht durchführbar. Abgesehen davon, wo ist der Spaß daran, einen Bot für Sie Golf spielen zu lassen ?!
Shaggy
6
@ Shaggy: "Wo ist der Spaß daran, einen Bot dein Golfen für dich machen zu lassen ?!" Was wäre, wenn du den Bot wirklich, wirklich kurz gemacht hättest?
Seltsame
11

R , 105 99 85 84 79 Bytes

-6 danke an @Kevin Cruissen und @Giuseppe

-14 von der Umstellung auf eine auf Regex basierende Methode

-1 danke an @ Giuseppe

-5 danke an @digEmALl

function(w,n=nchar(w)-1)write(trimws(Map(gsub,"",strrep(" ",n-abs(n:-n)),w)),1)

Probieren Sie es online!

J.Doe
quelle
Sie können 1 Byte Golf spielen, indem Sie den Raum an entfernen in(r<-.
Kevin Cruijssen
1
und Sie verwenden es nur seinmal, damit Sie es direkt als Argument verwenden writekönnen. wir bringen Sie auf 99 Bytes
Giuseppe
1
sollte das ein 1eher als ein ""in sein write? Ich grabe deine Verwendung von Map!
Giuseppe
1
Genial ! 79 Bytes mit Mathe :)
digEmAll
1
Ich war überzeugt, dass ich das mit dem collapseArgument zu schlagen könnte , pasteaber es passiert einfach nicht ...
JDL
6

Kohle , 10 Bytes

Eθ⪫θ× κ‖O↓

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

Eθ          Map over characters of input string
  ⪫θ        Join characters of input string using
    ×       a literal space repeated 
      κ     current index number of times
            Implicitly print each result on its own line
       ‖O↓  Reflect vertically with overlap
Neil
quelle
Charcoal spiegelt nicht Dinge wie [zu ]- oder ist das ein weiteres separates Kommando?
Magic Octopus Urn
@MagicOctopusUrn Es gibt separate Befehle, wenn Sie die Reflektion transformieren möchten. Siehe beispielsweise codegolf.stackexchange.com/a/127164 .
Neil
Ich dachte, ich hätte es schon einmal gesehen, war mir aber nicht sicher. Ordentlich!
Magic Octopus Urn
6

Python 2 , 72 70 68 66 65 Bytes

-2 Bytes dank Kevin Cruijssen
-3 Bytes dank ovs

w=input();c=s=-1
while c:print(' '*~c).join(w);s*=w[:c]>'';c+=s|1

Probieren Sie es online!

Stange
quelle
c==len(w)-1kann mit 1 Byte golfen werden c+2>len(w). BEARBEITEN: In deiner neuen 70-Byte-Version 0<ckann es sein c.
Kevin Cruijssen
6

05AB1E , 10 9 Bytes

Dank Adnan 1 Byte gespeichert

εINð×ý}û»

Probieren Sie es online!

Erläuterung

ε            # apply to each in input
 I           # push the input
  Nð×        # push <index> spaces
     ý       # merge the input on the spaces
      }      # end loop
       û     # palendromize
        »    # join on newlines
Emigna
quelle
Sie können die fallen lassen S. Die Eingabe ist flexibel, sodass die Eingabe als Liste zulässig ist.
Kevin Cruijssen
1
@ KevinCruijssen: Ihre erste Version ist jedoch 9 Byte alt, wie »weggelassen werden kann.
Emigna
1
Mit freundlichen Grüßen funktioniert das Vermächtnis auch in 9 Bytes, wenn Sie »die Schleife entfernen und vin eine Karte ändern ε.
Kevin Cruijssen
1
Hat die Antwort gepostet . Und derzeit schlägt uns Japt leider mit 6 Bytes. Oder meintest du den kürzesten in 05AB1E (Elixir Rewrite) und 05AB1E (Python Legacy)? :)
Kevin Cruijssen
2
Funktioniert das εINð×ý}û»auch?
Adnan
5

Ruby , 54 49 Bytes

->a{(-(z=a.size-1)..z).map{|i|a*(?\s*(z-i.abs))}}

Probieren Sie es online!

Nimmt Eingaben als ein Array von Zeichen und gibt ein Array von Zeichenfolgen aus.

Kirill L.
quelle
4

Japt , 9 8 Bytes

-1 Byte von @Shaggy

ÊƬqXîÃê

ÊƬqXîÃê        Full program, implicity input U
ÊÆ              Rage from 0 to U length and map
  ¬             split U at ""
   qXîà     join U using " " times range current value
        ê       horizontal mirror

Probieren Sie es online!

Luis Felipe De Jesus Munoz
quelle
Dang; Sieht aus, als hättest du mich wieder besoffen! Lass mich wissen, ob ich meine löschen soll.
Shaggy
1
@Shaggy nein, halten Sie Ihre Antwort, die Sie verwenden Array als Eingabe , während ich eine Zeichenfolge verwenden , so dass sie irgendwie anders xD sind
Luis Felipe de Jesus Munoz
1
SpX-> für eine 1-Byte-Speicherung.
Shaggy
4

PowerShell , 66 54 Bytes

-12 bytes dank mazzy

0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}

Probieren Sie es online!

Übernimmt die Eingabe per Splatting, was sich in TIO als separate Befehlszeilenargumente für jedes Zeichen manifestiert.

Wir setzen zuerst $a=$argsals Eingabeargument. Dann setzen wir $xgleich dem .countvon diesem Array -1. Wir müssen dann die Buchstaben durchlaufen, um das Raumschiff zu konstruieren. Dazu wird ein Bereich von 0bis erstellt $x, dann $xwieder nach unten, 0und dann Get-Uniqueder entsprechende Bereich herausgezogen.

Bei jeder Iteration nehmen wir unsere Eingabeargumente und -joindiese zusammen mit der entsprechenden Anzahl von Leerzeichen. Jede dieser Zeichenfolgen Write-Outputverbleibt in der Pipeline, und implizit erhalten wir nach Abschluss des Programms kostenlose Zeilenumbrüche.

AdmBorkBork
quelle
Versuchen Sie dies:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy
1
@mazzy Was zum ... wie funktioniert Get-Uniquedas auf der Range? Das ist verrückt! Vielen Dank!
AdmBorkBork
4

05AB1E (Legacy) , 9 Byte

εINúíJ}û»

Eingabe als Zeichenliste.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ε     }    # Map each character in the input to:
 I         #  Take the input
  Nú       #  Prepend each with the 0-indexed amount of spaces
           #   i.e. ["t","e","s","t"] & 3 → ["   t","   e","   s","   t"]
    í      #  Reverse each item
           #   i.e. ["   t","   e","   s","   t"] → ["t   ","e   ","s   ","t   "]
     J     #  Join them together to a single string
           #   i.e. ["t   ","e   ","s   ","t   "] → "t   e   s   t   "
       û»  # Palindromize the list, and join by newlines
           #  i.e. ["test","t e s t ","t  e  s  t  ","t   e   s   t   "]
           #   → "test\nt e s t \nt  e  s  t  \nt   e   s   t   \nt  e  s  t  \nt e s t \ntest"
Kevin Cruijssen
quelle
1
Oooooo, auch dies ist nicht gültig , da die Ausrichtung der Spiegel / \ ändert , wenn gespiegelt, mit gleichen [, ]und (, ). Vielleicht möchten Sie diese Fälle hinzufügen, um auch Holzkohle zu fangen. (Verschob die anderen Kommentare zu Emignas Antwort, weil er die Antwort war, die ich ursprünglich kommentierte)
Magic Octopus Urn
@MagicOctopusUrn Vielen Dank, dass Sie mich informiert haben. Behebung durch Verwenden von û»anstelle von .∊.
Kevin Cruijssen
4

Haskell , 60 59 Bytes

(init<>reverse).(scanl(?)<*>tail)
a?_=do u<-a;u:[' '|' '<u]

Probieren Sie es online!

Erläuterung

Für eine Zeichenfolge (zB "abc") gelten wir zuerst

scanl (?) <*> tail

das ist das gleiche wie

\str -> scanl (?) str (tail str)

Dies gilt wiederholt (?)(fügt jedem Zeichen im Bereich [33 ..] ein Leerzeichen hinzu ), strbis es so viele Zeichenfolgen gibt, wie strZeichen haben:["abc","a b c ", "a b c "]

Jetzt müssen wir nur noch das Ergebnis (abzüglich des letzten Elements) mit seinem umgekehrten Gegenstück verketten:

init<>reverse
ბიმო
quelle
4

MATL , 25 22 13 Bytes

zZv"Gtz@he!1e

Probieren Sie es online!

Vielen Dank an Luis Mendo , der mir einen 5-Byte-Golf vorgeschlagen hat, der mich dazu inspiriert hat, 4 weitere Bytes zu sparen!

Erklärung mit Beispieleingabe 'abc':

         # Implicit input, 'abc'
z        # find number of nonzero elements (length of string)
         # stack: [3]
Zv       # symmetric range
         # stack: [[1 2 3 2 1]]
"        # begin for loop, iterating over [1 2 3 2 1] as the loop indices
G        # push input
         # stack: ['abc']
tz       # dup and push length
         # stack: ['abc', 3]
@        # push loop index, i (for example, 2)
         # stack: ['abc', 3, 2]
h        # horizontally concatenate
         # stack: ['abc', [3, 2]]
e!       # reshape to matrix of 3 rows and i columns, padding with spaces, and transpose
         # stack: [['abc';'   ';'   ']]
1e       # reshape to matrix of 1 row, leaving last value on stack
         # stack: ['a  b  c  ']
         # implicit end of for loop
         # implicit end of program, display stack contents
Giuseppe
quelle
3

Gelee , 9 Bytes

jⱮLḶ⁶ẋƲŒḄ

Probieren Sie es online!

Gibt eine Liste von Zeilen zurück. Ausgang über TIO vorgegeben.

Erik der Outgolfer
quelle
Eine etwas andere 9: ,€⁶$LСŒḄ. Andere, ähnlicher, 9's: J’⁶ẋŒḄɓjⱮund J’⁶ẋŒḄjⱮ@(Ich suchte nach kürzeren, aber noch keine Freude)
Jonathan Allan
@JonathanAllan Ich bin ziemlich sicher , diese optimal ist, glaube ich nicht , dass es irgendeine Art und Weise kürzer zu schreiben LḶ⁶ẋoder ŒḄ. Wenn Sie es jedoch schaffen, eine Rettung zu finden, rufen Sie mich an. :-)
Erik der Outgolfer
Wenn ich ein bisschen darüber nachdenke, ,€⁶$LСŒḄkann es sein, dass meine Version ungültig ist, da sie ein verrücktes Nesting hat und daher möglicherweise Yein vollständiges Programm benötigt.
Jonathan Allan
@ JonathanAllan Ja, das ist es natürlich nicht. ['I', 'f', [[' '], 't', 'h', [['i']], 's'], ' ', 'i', ['s', ' '], 'a', [[' ', 's', 't'], 'r', ['i', 'n', 'g'], ' '], 'w', ['e', ' ', 'a', 'r', 'e'], ' ', 'd', 'o', ['o'], 'm', [[[[['e']]]]], [[[['d']]]], '!']Zumindest habe ich 05AB1E outgolfed ...
Erik the Outgolfer
Ich sagte, ich hätte 05AB1E übertroffen, was? Bah, nicht mehr. : /
Erik der Outgolfer
3

Stax , 10 Bytes

Ç·9ƒù▌╘Ä┘e

Führen Sie es aus und debuggen Sie es

Ausgabe mit nachgestelltem Leerzeichen in jeder Zeile.

Erläuterung:

%R|pmx{]n(m Full program, unpacked, implicit input
%           Length of input
 R          1-based range
  |p        Palindromize
    m       Map:
     x{   m   Map over characters of input:
       ]        Character -> string
        n(      Right-pad to length given by outer map value
              Implicit flatten and output
wastl
quelle
3

Java (JDK 10) , 115 Byte

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

Probieren Sie es online!

Olivier Grégoire
quelle
1
l-Math.abs(i)kann i<0?l+i:l-ifür -2 Bytes golfen werden .
Kevin Cruijssen
@ KevinCruijssen Danke! :)
Olivier Grégoire
könnte es sein l-i<0?-i:i?
Quintec
@ thecoder16 Du brauchst Klammern: l-(i<0?-i:i)(12 Bytes).
Jonathan Frech
3

K (OK) , 25 24 Bytes

Lösung:

,/'(1+a,1_|a:!#x)$\:+,x:

Probieren Sie es online!

Erläuterung:

Port meiner K4-Lösung :

,/'(1+a,1_|a:!#x)$\:+,x: / the solution
                      x: / save input as x
                     ,   / enlist
                    +    / flip
                 $\:     / pad ($) right by each-left (\:)
   (            )        / do this together
              #x         / count length of input,           e.g. 3
             !           / range 0..length,                 e.g. 0 1 2
           a:            / save as a
          |              / reverse it,                      e.g. 2 1 0
        1_               / drop first,                      e.g. 1 0
      a,                 / join to a,                       e.g. 0 1 2 1 0
    1+                   / add 1,                           e.g. 1 2 3 2 1
,/'                      / flatten (,/) each (')

Anmerkungen:

  • -1 Byte dank ngn
Streetster
quelle
1
,:'-> +,
14.
2

Pascal (FPC) , 143 135 Bytes

var s:string;i,j,l:word;begin read(s);l:=length(s);repeat i:=i+1;for j:=1to l do write(s[j],'':l-abs(l-i)-1);writeln until i=l*2-1 end.

Probieren Sie es online!

Ich werde wohl nur gegen Lenguage gewinnen ...

AlexRacer
quelle
2

PHP, 88 89 Bytes

for(;++$i<2*$e=count($a=str_split($argn));)echo join(str_pad("",~-$e-abs($i-$e)),$a),"\n";

benötigt PHP 5 oder neuer für str_split. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

Titus
quelle
Ich fürchte, Ihr Try-it-Online-Link liefert die falsche Ausgabe. In Ihrer Ausgabe haben alle Zeilen auch führende Leerzeichen anstatt nur zwischen Zeichen (oder optional nachgestellt). Das erste Zeichen sollte sich in der Ausgabe in derselben Spalte befinden.
Kevin Cruijssen
1
@KevinCruijssen Schaute die Ausgabe nicht nah genug an. Fest. (Obwohl imo meine vorherige Ausgabe eher wie eine Rakete aussah) ;-)
Titus
Es sah für mich wie eine Pfeilspitze aus. : D Aber +1 jetzt, wo es behoben ist.
Kevin Cruijssen
Wenn Sie anstelle von \ n eine aktuelle Zeile einfügen, speichern Sie ein Byte :)
Martijn
@Martijn Ich habe tatsächlich nur ein Byte dafür gezählt ... habe vergessen, es zu ersetzen, als ich den Code hier eingefügt habe.
Titus
2

K4 , 23 Bytes

Lösung:

,/'(1+a,1_|a:!#x)$\:$x:

Beispiel:

q)k),/'(1+a,1_|a:!#x)$\:$x:"Spaceship"
"Spaceship"
"S p a c e s h i p "
"S  p  a  c  e  s  h  i  p  "
"S   p   a   c   e   s   h   i   p   "
"S    p    a    c    e    s    h    i    p    "
"S     p     a     c     e     s     h     i     p     "
"S      p      a      c      e      s      h      i      p      "
"S       p       a       c       e       s       h       i       p       "
"S        p        a        c        e        s        h        i        p        "
"S       p       a       c       e       s       h       i       p       "
"S      p      a      c      e      s      h      i      p      "
"S     p     a     c     e     s     h     i     p     "
"S    p    a    c    e    s    h    i    p    "
"S   p   a   c   e   s   h   i   p   "
"S  p  a  c  e  s  h  i  p  "
"S p a c e s h i p "
"Spaceship"

Erläuterung:

Verfügt in jeder Zeile über nachgestellte Leerzeichen.

,/'(1+a,1_|a:!#x)$\:$x: / the solution
                     x: / save input as x,                 e.g. "abc"
                    $   / string,                          e.g. (,"a";,"b";,"c")
                 $\:    / pad ($) right by each-left (\:)
   (            )       / do this together
              #x        / count length of input,           e.g. 3
             !          / range 0..length,                 e.g. 0 1 2
           a:           / save as a
          |             / reverse it,                      e.g. 2 1 0
        1_              / drop first,                      e.g. 1 0
      a,                / join to a,                       e.g. 0 1 2 1 0
    1+                  / add 1,                           e.g. 1 2 3 2 1
,/'                     / flatten each
Streetster
quelle
2

C #, 113 105 98 Bytes

s=>{for(int l=s.Length,i=-l;++i<l;)WriteLine(Join("",s.Select(c=>$"{c}".PadRight(i<0?l+i:l-i))));}

Probieren Sie es online!

RobIII
quelle
Hallo. Derzeit ist Ihre Antwort ein Ausschnitt anstelle einer Funktion oder eines vollständigen Programms. Dies kann kostengünstig durch Hinzufügen von s=>{Vorher und }Nachher zu einer Lambda-Funktion behoben werden . Außerdem besteht eine Sache beim Golfen darin, die Klammern um die for-Schleife zu entfernen. Probieren Sie es online aus.
Kevin Cruijssen
@ KevinCruijssen Danke!
Ich habe
2

Scala , 82 Bytes

for(i<-(0 to a.size)union(-a.size to 0))println(a.map(_+" "*Math.abs(i)).mkString)

Probieren Sie es online aus

Scala hat viele Verknüpfungen, die mir hier helfen und die gut lesbar sind! Probieren Sie Scala

Andrew Kuleshov
quelle
Hallo, willkommen bei PPCG! Obwohl es eine nette Antwort ist, fürchte ich, dass zwei Dinge etwas falsch sind. Die Zeile mit den meisten Leerzeichen sollte nur einmal in der Mitte statt zweimal ausgegeben werden. Und derzeit drucken Sie von 0bis zu einer bestimmten lengthAnzahl von Leerzeichen anstatt von 0bis zu einer bestimmten length-1Anzahl von Leerzeichen. Ich kenne Scala nicht so gut, aber anscheinend können Sie beide Probleme mit +4 Bytes (insgesamt 86 Bytes) wie folgt beheben: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Nochmals willkommen, und genießen Sie Ihren Aufenthalt! :)
Kevin Cruijssen
2

Oracle SQL, 115 Byte

Keine Golfsprache, aber ...

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))FROM t CONNECT BY LEVEL<2*LENGTH(v)

Angenommen, der Wert befindet sich in vder Tabellenspalte t:

SQL-Geige

Oracle 11g R2 Schema Setup :

CREATE TABLE t ( v ) AS
  SELECT 'test' FROM DUAL;

Abfrage 1 :

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))
FROM   t
CONNECT BY LEVEL<2*LENGTH(v)

Ergebnisse :

(SQLFiddle gibt die Werte aus irgendeinem Grund rechtsbündig in der Spalte aus. Es gibt keine führenden Leerzeichen.)

| TRIM(REGEXP_REPLACE(V,'(.)',LPAD('\1',1+LENGTH(V)-ABS(LEVEL-LENGTH(V))))) |
|---------------------------------------------------------------------------|
|                                                                      test |
|                                                                   t e s t |
|                                                                t  e  s  t |
|                                                             t   e   s   t |
|                                                                t  e  s  t |
|                                                                   t e s t |
|                                                                      test |
MT0
quelle
Ihre SQL Fiddle-Ergebnisse scheinen nur einzelne Leerzeichen zwischen den Zeichen zu haben? Siehe diesen Screenshot . Ich nehme an, das liegt an SQL Fiddle und es funktioniert lokal? Übrigens, sind Sie sich nicht sicher, ob SQL (.)reguläre reguläre Ausdrücke verwendet, aber können Sie Golf spielen, .indem Sie \0anstelle von \1Java zum Beispiel verwenden, wie Sie es könnten? EDIT: Egal, das ist für $0, nicht \0.. ( Java-Beispiel von dem, was ich meinte ).
Kevin Cruijssen
1
@KevinCruijssen Klicken Sie auf den Abwärtspfeil neben der Schaltfläche "SQL ausführen" und ändern Sie die Ausgabe in "Nur-Text-Ausgabe" oder "Abwärts-Ausgabe". Die Leerzeichen werden angezeigt.
MT0
Vielen Dank. In diesem Fall sieht es in der Tat gut aus!
Kevin Cruijssen
2

8086 Maschinencode, 56 53 Bytes

00000000  bf 35 01 57 ba 01 00 52  be 82 00 b3 ff ac 59 51  |.5.W...R......YQ|
00000010  aa 3c 0d 74 07 b0 20 e2  f7 43 eb f1 b0 0a aa 59  |.<.t.. ..C.....Y|
00000020  00 d1 e3 08 38 cb d6 08  c2 51 eb dc c6 05 24 5a  |....8....Q....$Z|
00000030  b4 09 cd 21 c3                                    |...!.|
00000035

Zusammengesetzt aus:

org 0x100
use16
        mov di, buffer
        push di
        mov dx, 1
        push dx
nextl:  mov si, 0x82
        mov bl, -1
nextc:  lodsb
        pop cx
        push cx
stor:   stosb
        cmp al, 0x0d
        je cr
        mov al, ' '
        loop stor
        inc bx
        jmp nextc
cr:     mov al, 0x0a
        stosb
        pop cx
        add cl, dl
        jcxz done
        cmp bl, cl
        salc
        or dl, al
        push cx
        jmp nextl
done:   mov [di], byte '$'
        pop dx
        mov ah, 0x09
        int 0x21
        ret
buffer:

Testfall:

Bildschirmfoto

user5434231
quelle
Hallo. Ich denke, es gibt keinen online kompilierten 8086-Maschinencode, aber könnten Sie vielleicht einen Screenshot der Ausgabe für einen der Testfälle hinzufügen? Dann kann ich prüfen, ob alles in Ordnung ist. :)
Kevin Cruijssen
Getan. Auch rasiert ein weiteres Byte :)
user5434231
Danke für den Screenshot! Leider gibt es einen kleinen Fehler in der Ausgabe. Die mittlere Zeile enthält jetzt lengthLeerzeichen und insgesamt 9 Zeilen. Die mittlere Zeile sollte jedoch length-1Leerzeichen und insgesamt 7 Zeilen enthalten (für das 4-Buchstaben-Wort "test"). (Ich hoffe, es ist nicht zu teuer in Bezug auf Bytes zu reparieren?
Kevin Cruijssen
1
Ohh ich sehe. Das ist behoben, ich habe es sogar um ein weiteres Byte reduziert.
user5434231
2

Haskell, 64 60 59 Bytes

(""#)
a#s|l<-(:a)=<<s,w<-' ':a=l:[x|w<(' '<$s),x<-w#s++[l]]

Probieren Sie es online!

a#s                         -- take a string of spaces 'a' and the input string 's'
 |l<-(:a)=<<s               -- let 'l' be the current line, i.e. the spaces in 'a'
                            -- appended to each char in 's'
  w<-' ':a                  -- let 'w' be 'a' with an additional space   
 =l                         -- return that 'l'
   :[   |w<(' '<$s)   ]     -- and, if 'w' is shorter than 's',
     x  ,x<-w#s++[l]        -- followed by a recursive call with 'w' 
                            -- and by another copy of 'l'

(""#)                       -- start with an empty 'a'
nimi
quelle
2

Bash , 115 , 109 , 105 , 100 , 97 , 96 , 92 , 91 , 90 Bytes

-5 & -3 danke an Kevin Cruissen

read s;for((c=f=1;f;c-=2*(f>=${#s}),f+=c))
{ printf '%-'${f}'.c' `grep -o .<<<"$s"`
echo
}

Probieren Sie es online!


Beachten Sie, dass , da die \eine Shell - Escape char ist, der Testfall )}/\sollte mit einem extra eingegeben werden \wie folgt aus : )}/\\.

agc
quelle
Hallo. Ist es möglich, einen TIO-Link mit Testfällen hinzuzufügen ? Ich kenne Bash auch nicht sehr gut, aber ist es möglich, die Leerzeichen nach inund printfwie in Python zu entfernen ?
Kevin Cruijssen
1
@ KevinCruijssen, danke, siehe überarbeitete Antwort. Ich bin jedoch neu in TIO-Link und bin nicht sicher, wie ich mehrere Testfälle verwenden soll, da dieser bashCode nur eine Zeichenfolge eingibt ( dh nur eine Zeile). Die Testfälle funktionieren alle, )}/\ müssen jedoch wie folgt mit einfachen Anführungszeichen versehen sein <<< ')}/\' read s; ...etc. . Die Leerzeichen nach inund printfwerden benötigt.
Agc
Vielen Dank. Und ein einziger Testfall für TIO ist in Ordnung. Es ist vor allem zu überprüfen, ob alles wie erwartet funktioniert, was in der Tat der Fall zu sein scheint. +1 von mir. :)
Kevin Cruijssen
1
In Ihrer neuen Version können Sie 5 weitere Bytes wie dieses Golf spielen . Leerzeichen nach forund dokönnen entfernt werden. f=1kann geändert werden zu c=f=1. Und f=f+ckann sein f+=c.
Kevin Cruijssen
1
Oh, noch eine Kleinigkeit zum Golfen. War ich nicht sicher , ob es möglich in Bash, aber anscheinend ist es (ein weiterer Grund , warum ein TIO-Link ist praktisch;)), ist durch eine Änderung f!=0an fin der for-Schleife. Genau wie in JavaScript und Python 0ist es falsch und jede andere positive / negative Ganzzahl ist in Bash anscheinend wahr.
Kevin Cruijssen
2

Perl 6 , 43 Bytes

{(0....comb-1...0)>>.&{join ' 'x$^a,.comb}}

Probieren Sie es online!

Gibt eine Liste von Zeilen zurück.

Erläuterung:

 {                                         }  # Anonymous code block
  (0....comb-1...0) # A list from
   0                  # 0
    ...               # to
       .comb-1        # the length of the input string -1
              ...     # back to
                 0    # 0
                   >>.&{                  }  # Map each number to
                        join        ,.comb   # Join the list of characters
                             ' 'x$^a         # With the number of spaces
Scherzen
quelle
2

C (GCC) , 131 129 111 Bytes

i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Probieren Sie es online!

-20 bytes dank ceilingcat !

#import<string.h>
i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Probieren Sie es online!

Oder, wenn die Länge als Parameter akzeptiert werden kann:

C (gcc) 105 102 Bytes

-1 byte dank ceilingcat!

i;x;f(k,x,j)char*k,*j;{for(i=!x--;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Probieren Sie es online!

Conor O'Brien
quelle
@ceilingcat huh!
Conor O'Brien
1
In Ihrem 102 Bytes langen Golf, denke ich, ist das Globale xabgeschattet und somit redundant deklariert.
Jonathan Frech
2

PHP, 148 146 143 141 Bytes

function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Sie können es so testen:

<?php
error_reporting(0);

$s = 1234567890;
function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Ausgabe

1234567890
1 2 3 4 5 6 7 8 9 0 
1  2  3  4  5  6  7  8  9  0  
1   2   3   4   5   6   7   8   9   0   
1    2    3    4    5    6    7    8    9    0    
1     2     3     4     5     6     7     8     9     0     
1      2      3      4      5      6      7      8      9      0      
1       2       3       4       5       6       7       8       9       0       
1        2        3        4        5        6        7        8        9        0        
1         2         3         4         5         6         7         8         9         0         
1        2        3        4        5        6        7        8        9        0        
1       2       3       4       5       6       7       8       9       0       
1      2      3      4      5      6      7      8      9      0      
1     2     3     4     5     6     7     8     9     0     
1    2    3    4    5    6    7    8    9    0    
1   2   3   4   5   6   7   8   9   0   
1  2  3  4  5  6  7  8  9  0  
1 2 3 4 5 6 7 8 9 0 
1234567890

Sandkasten

Erweiterte Version

 function s($s){
    //loop upwards 0-10
    for(;$i<strlen($s);++$i) f($i,$s);
     //decrement so it's odd, from 9 loop downwards to 0
    for(--$i;--$i>=0;)f($i,$s);
 }
 //2nd function to save space
 function f($i,$s){
     //chunk it, split 1 char, insert $i number of spaces
     echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Versuch 2, 92 Bytes

Nachdem ich @ Titus Antwort gesehen hatte, reduzierte ich meine auf diese:

for(;++$i<2*$e=strlen($s=$argn);)echo chunk_split($s,1,str_repeat(' ',~-$e-abs($i-$e)))."
";

Ich habe versucht, einen Weg zu finden, 1 Schleife anstelle von 2 zu verwenden. Ob Sie es glauben oder nicht, ich verwende die forSchleife fast nie in "echtem" Code. Es war das ~bitweise Nicht, dass ich vermisst habe ...

Es ist noch ein bisschen länger bei 92 also fühle ich mich nicht so schlecht. Aber ich werde es trotzdem als zweiten Versuch einsetzen.

$argn ist die Eingabe von der Befehlszeile

Führe es als Pipe mit -nR aus oder versuche es online.

Sandkasten

ArtisticPhoenix
quelle
Es scheint mir , dass Ihre erste Version 4 Bytes kürzer sein würde , wenn Sie eine benannte Funktion fstatt Zuweisung eines anonymen ein bis $f- function f(speichert 2 Bytes über $f=function(, und Sie speichern ein anderes Byte jedes Mal , wenn Sie anrufen f(...)statt $f(...). Alternativ könnten Sie die $s2 Bytes speichern - ($i)use($s)ist 4 Bytes länger als ($i,$s), aber Sie sparen 3 Bytes für jeden Aufruf an $f($i)statt $f($s,$i); In Sprachen mit automatischer Erfassung wie JS ist dies häufiger eine sinnvolle Einsparung, da Sie die Strafe für die useAbrechnung nicht bezahlen .
IMSoP
Ich weiß die Hilfe zu schätzen, ich bin ziemlich neu im Codieren von Golf und mache nicht so viel, aber auf den regulären SO-Seiten wird es einem langweilig. Ich habe über die Verwendung nachgedacht, useaber es fühlt sich länger an. Um zu tun, dass der Sinn $idynamisch ist, müsste er als Referenz übergeben werden. So muss es sein use(&$i)und das $imuss definiert werden, bevor es als Referenz übergeben wird $f. Das heißt, Sie müssen es in der übergeordneten Funktion oder vor einer anderen Funktion festlegen. Für die Funktion könnte es sein function s($s,$i)und nur wissen, dass es mit aufgerufen werden muss, s($s,0) aber es scheint hässlich, und das ist in der Nähe11 bytes, use(&$i),$i
ArtisticPhoenix
Wir könnten aber verwenden $sund die \nin eine echte Zeilenumbruch ändern . Das bringt es auf 143 2 vom Zeilenende und 1 vom Gebrauch
ArtisticPhoenix
Ja, ich hatte nicht einmal darüber nachgedacht, $ i in die Nutzung einzubeziehen, da $ s die "natürliche" Erfassung empfand, aber es lohnt sich immer, die Nettoersparnis zu berechnen. Sie können jedoch immer noch 2 Bytes sparen, indem Sie nur eine benannte Funktion fanstelle eines Closuresfunction s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))." ";}
deklarieren
Aktualisiert, ein paar gerettet
ArtisticPhoenix