Zrobiłem zrobiłem paszczę statku kosmicznego!


39

Wprowadzenie:

Zainspirowany tym komentarzem @MagicOctopusUrn na @Emigna „s 05AB1E odpowiedź dla mojego « To było po prostu bug »wyzwanie :

8F9ÝÀNð×ý}».∊Zrobiłem zrobiłem paszczę statku kosmicznego! Byłem podekscytowany sugestią 12-bajtowej edycji. - Magic Octopus Urn 17 lipca 17 o 20:10

Który jest programem 05AB1E (starszym), w wyniku czego:

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

Wypróbuj online.

Wyzwanie:

Dane wejściowe: niepuste ciąg

Wyjście: Z zewnątrz idąc do wewnątrz, dodaj jedną spację między każdym znakiem w każdym wierszu, podobnie jak na powyższym wyjściu, równą length - 1. Tak więc dla danych wejściowych 1234567890wyjście byłoby w rzeczywistości takie:

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

Czemu? Długość 1234567890wynosi 10. Zaczynamy od wypisania 10 linii: pierwsza linia bez spacji; drugi z jednym ogranicznikiem spacji; trzeci z dwoma; itd. A następnie (bez length - 1zduplikowanej linii środkowej ze spacjami) wracamy do początkowego wejścia podczas schodzenia.

Zasady konkursu:

  • Dane wejściowe są gwarantowane jako niepuste (długość >= 1). (Dla danych wejściowych dla pojedynczego znaku po prostu wypisujemy ten znak.)
  • Dowolna ilość spacji / wiodących spacji / znaków nowej linii jest dozwolona, ​​pod warunkiem że dane wyjściowe (gdziekolwiek na ekranie) są poprawne. (Puste linie między wierszami wyjściowymi również nie są dozwolone.)
  • Dane wejściowe będą zawierać tylko drukowalne znaki ASCII z wyjątkiem białych znaków (zakres punktów kodowych [33, 126])
  • I / O jest elastyczny. Dane wejściowe można traktować jako parametr STDIN, argument lub funkcję. Może być listą / tablicą / strumieniem znaków zamiast łańcucha. Wyjściem może być również lista / tablica / strumień znaków zamiast ciągów; można wydrukować na STDOUT; zwrócone jako ciąg rozdzielany znakiem nowej linii; itp.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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:
)}/\
) } / \
)  }  /  \
)   }   /   \
)  }  /  \
) } / \
)}/\

1
Dostaje wszystko tylko roztrzęsiony !!! PRZESTRZEŃ !!!
WallyWest,

1
Wiedziałem, że rozpoznałem ten wynik. Podoba mi się, że ten pomysł wciąż się rozwija.
Carcigenicate,

2
TFW niejasno rozpoznajesz wzór w pytaniu, ಠ_ಠa potem zdajesz sobie sprawę, że to dlatego, że przypadkiem udało ci się go rok temu ಠ⌣ಠ.
Magic Octopus Urn

1
@MagicOctopusUrn Dzięki za inspirację. ; D
Kevin Cruijssen

3
@KevinCruijssen dzięki za utrzymanie głupiego cytatu haha!
Magic Octopus Urn

Odpowiedzi:


11

Japt , 8 6 bajtów

Pobiera dane wejściowe jako tablicę znaków, wyświetla tablicę ciągów znaków.

£qYçÃê

Spróbuj


Wyjaśnienie

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

Oryginał, 8 bajtów

I / O to ciąg znaków. Używa -Rflagi. Zawiera końcowe spacje w każdej linii.

¬£múYÄÃê

Spróbuj

Wyjaśnienie

             :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

S.ç()FTW jeszcze raz :-)
ETHprodukcje

1
Poważne pytanie: czy wykonalne byłoby przeszukiwanie wszystkich rozwiązań o długości od 1 do 6 bajtów dla takiej układanki?
Filip

2
@ Filip nr: istnieje ponad 256 ** 6 = 281474976710656 (przynajmniej naiwnych) kombinacji. To jak zgadywanie hasła.
Kirill Bulygin

3
@KirillBulygin, istnieje ponad 37 trylionów ( 37 764 771 485 592) możliwych sposobów łączenia znaków dostępnych w Japt w ciąg o długości od 1 do 6 znaków. Jeśli dodasz wszystkie pozostałe 1-bajtowe znaki, które mogą być użyte w literałach ciągów lub skompresowanych ciągach, liczba ta wzrośnie do ponad 276 bilionów (276,024,445,697,280). Więc nie, napisanie bota do wygenerowania wszystkich, a następnie odfiltrowanie prawidłowych programów Japt, a następnie znalezienie tego (jeśli istnieje), który działa dla danego wyzwania, prawdopodobnie nie będzie wykonalny. Poza tym, jak fajnie jest pozwolić botowi uprawiać dla ciebie golfa ?!
Shaggy

6
@Shaggy: „gdzie jest zabawa pozwalająca botowi grać dla ciebie w golfa ?!” Co się stanie, jeśli zrobisz bota naprawdę, naprawdę krótkim?
Dziwne,

11

R , 105 99 85 84 79 bajtów

-6 dzięki @Kevin Cruissen i @Giuseppe

-14 od zmiany na metodę opartą na wyrażeniach regularnych

-1 dzięki @Giuseppe

-5 dzięki @digEmALl

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

Wypróbuj online!


Możesz zagrać w golfa 1 bajt, usuwając spację na in(r<-.
Kevin Cruijssen

1
i używasz tylko sraz, więc możesz po prostu użyć go jako argumentu writebezpośrednio; sprowadzając cię do 99 bajtów
Giuseppe

1
powinno to być 1raczej niż ""w write? Kopię twoje wykorzystanie Map!
Giuseppe,


1
Byłem przekonany, że mogę pokonać to collapseargumentem, pasteale tak się nie dzieje ...
JDL


6

Węgiel drzewny , 10 bajtów

Eθ⪫θ× κ‖O↓

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Węgiel nie odzwierciedla takie rzeczy [się ]- czy to innego odrębnego polecenia?
Magic Octopus Urn

@MagicOctopusUrn Istnieją osobne polecenia, jeśli chcesz przekształcić odbicie. Zobacz na przykład codegolf.stackexchange.com/a/127164 .
Neil

Myślałem, że widziałem to wcześniej, ale nie byłem pewien. Schludny!
Magic Octopus Urn


6

Python 2 , 72 70 68 66 65 bajtów

-2 bajty dzięki Kevin Cruijssen
-3 bajty dzięki ovs

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

Wypróbuj online!


c==len(w)-1można zagrać w golfa o 1 bajt za pomocą c+2>len(w). EDYCJA: W nowej wersji 70-bajtowej 0<cmoże być c.
Kevin Cruijssen

6

05AB1E , 10 9 bajtów

Zaoszczędzono 1 bajt dzięki Adnan

εINð×ý}û»

Wypróbuj online!

Wyjaśnienie

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

Możesz upuścić S. Wprowadzanie danych jest elastyczne, więc wprowadzanie danych jest dozwolone.
Kevin Cruijssen

1
@KevinCruijssen: Twoja pierwsza wersja ma już 9 bajtów, co »można pominąć.
Emigna

1
Twój faktycznie działa również w starszej wersji w 9 bajtach, jeśli usuniesz »i zmienisz pętlę vna mapę ε.
Kevin Cruijssen

1
Wysłałem odpowiedź . I obawiam się, że obecnie Japt bije nas 6 bajtami. A może miałeś na myśli najkrótszy w 05AB1E (przepisanie Elixiru) i 05AB1E (starsza wersja Pythona)? :)
Kevin Cruijssen

2
Działa εINð×ý}û»również?
Adnan


4

Japt , 9 8 bajtów

-1 bajt z @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

Wypróbuj online!


Dang; wygląda na to, że znów mnie ninja! Daj mi znać, jeśli chcesz, żebym usunął mój.
Shaggy

1
@Shaggy nie, zachowaj odpowiedź, używasz tablicy jako danych wejściowych, a ja używam ciągu znaków, więc są one trochę inne xD
Luis felipe De jesus Munoz

1
SpX-> dla oszczędności 1 bajtu.
Shaggy

4

PowerShell , 66 54 bajtów

-12 bajtów dzięki mazzy

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

Wypróbuj online!

Pobiera dane wejściowe poprzez rozpryskiwanie, które w TIO przejawia się jako osobne argumenty wiersza poleceń dla każdego znaku.

Najpierw ustawiamy $a=$argsjako argument wejściowy. Następnie ustawiamy wartość $xrówną .counttej tablicy -1. Następnie musimy zapętlić litery, aby zbudować statek kosmiczny. Dokonuje się tego, konstruując zakres od 0do $x, a następnie z $xpowrotem do 0, a następnie używając, Get-Uniqueaby wyciągnąć tylko odpowiedni zakres.

W każdej iteracji bierzemy nasze argumenty wejściowe i -joinje razem z odpowiednią liczbą spacji. Każdy z tych ciągów pozostaje w kolejce, a domniemany Write-Outputdaje nam nowe wiersze za darmo po zakończeniu programu.


Spróbuj tego:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy Co ... jak to Get-Uniquedziała w tym zakresie? To szalone! Dzięki!
AdmBorkBork,

4

05AB1E (starsza wersja) , 9 bajtów

εINúíJ}û»

Wprowadź jako listę znaków.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ε     }    # 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"

1
Oooooo, także nie jest to ważne, ponieważ lustro zmienia orientację / do \ Kiedy dublowany, samo [, ]i (, ). Może chcę dodać te skrzynki, aby złapać węgiel drzewny. (Przeniosłem pozostałe komentarze do odpowiedzi Emigny, ponieważ był odpowiedzią, na którą pierwotnie skomentowałem)
Magic Octopus Urn

@MagicOctopusUrn Dzięki za poinformowanie mnie. Naprawiono to za pomocą û»zamiast .∊.
Kevin Cruijssen

4

Haskell , 60 59 bajtów

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

Wypróbuj online!

Wyjaśnienie

W przypadku ciągu (np. "abc") Najpierw stosujemy

scanl (?) <*> tail

który jest taki sam jak

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

Dotyczy to wielokrotnie (?)(dodaje spację do każdego znaku w zakresie [33 ..] ), strdopóki nie będzie tylu łańcuchów, ile strznaków:["abc","a b c ", "a b c "]

Teraz musimy tylko połączyć wynik (minus ostatni element) z jego odwróconą częścią przeciwną:

init<>reverse

4

MATL , 25 22 13 bajtów

zZv"Gtz@he!1e

Wypróbuj online!

Podziękowania dla Luisa Mendo za zasugerowanie 5-bajtowego golfa, który następnie zainspirował mnie do ogolenia 4 kolejnych bajtów!

Objaśnienie, z przykładowym wejściem '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

3

Galaretka , 9 bajtów

jⱮLḶ⁶ẋƲŒḄ

Wypróbuj online!

Zwraca listę linii; wyjście prettified ponad TIO.


Nieco inny 9: ,€⁶$LСŒḄ. Inne, bardziej podobne, 9-te: J’⁶ẋŒḄɓjⱮi J’⁶ẋŒḄjⱮ@(szukałem krótszej, ale jeszcze nie radości)
Jonathan Allan

@JonathanAllan Jestem pewien, że jest to optymalne, nie sądzę, że istnieje krótszy sposób pisania LḶ⁶ẋlub ŒḄ. Jeśli jednak uda ci się znaleźć zapis, zrób ping do mnie. :-)
Erik the Outgolfer

Myśląc o tym trochę, moje ,€⁶$LСŒḄmoże nie być poprawne, ponieważ ma szalone zagnieżdżanie, więc może potrzebować Ypełnego programu.
Jonathan Allan,

@JonathanAllan Tak, oczywiście, że nie. ['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']]]], '!']Przynajmniej pokonałem 05AB1E ...
Erik Outgolfer

Powiedziałem, że wygrałem z 05AB1E, co? Nie, już nie. : /
Erik the Outgolfer


3

Stax , 10 bajtów

Ç·9ƒù▌╘Ä┘e

Uruchom i debuguj

Dane wyjściowe z końcowymi spacjami w każdej linii.

Wyjaśnienie:

%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


3

K (oK) , 25 24 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Port mojego rozwiązania K4 :

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

Uwagi:

  • -1 bajt dzięki ngn

1
,:'-> +,
ngn

2

Pascal (FPC) , 143 135 bajtów

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.

Wypróbuj online!

Prawdopodobnie wygram tylko z Lenguage ...


2

PHP, 88 89 bajtów

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

wymaga PHP w wersji 5 lub nowszej str_split. Uruchom jako potok z -nRlub spróbuj online .


Obawiam się, że link do try-it-online daje niewłaściwe wyniki. W twoich wynikach wszystkie wiersze mają również spacje wiodące, zamiast tylko między znakami (lub opcjonalnie końcowymi). Pierwszy znak powinien znajdować się w tej samej kolumnie na wyjściu.
Kevin Cruijssen

1
@KevinCruijssen Nie spojrzał na wyjście wystarczająco blisko. Naprawiony. (Chociaż imo moja poprzednia produkcja wyglądała bardziej jak rakieta) ;-)
Titus

Dla mnie wyglądało to trochę jak strzała. : D Ale +1 teraz, kiedy jest naprawione.
Kevin Cruijssen

Jeśli zamiast \ n umieścisz rzeczywistą nową linię, zapisujesz bajt :)
Martijn

@Martijn Właściwie naliczyłem tylko jeden bajt ... zapomniałem go zastąpić, kiedy wkleiłem tutaj kod.
Tytus

2

K4 , 23 bajty

Rozwiązanie:

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

Przykład:

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"

Wyjaśnienie:

W każdej linii ma końcowe spacje.

,/'(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

2

C #, 113 105 98 bajtów

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

Wypróbuj online!


Cześć. Obecnie twoją odpowiedzią jest urywek zamiast funkcji lub pełnego programu. Można to tanio naprawić, dodając s=>{przed i }po, aby uczynić go funkcją lambda. Ponadto jedną z rzeczy do golfa jest usunięcie wsporników wokół pętli for. Wypróbuj online.
Kevin Cruijssen

@KevinCruijssen Thanks! Zapomniałem to naprawić przed opublikowaniem ...
RobIII

2

Scala , 82 bajty

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

Wypróbuj online

Scala ma wiele skrótów, które mi tu pomagają i jest to całkiem czytelne! Wypróbuj Scala


Cześć, witamy w PPCG! Chociaż to ładna odpowiedź, obawiam się, że dwie rzeczy są nieco niepoprawne. Linia z największą liczbą spacji powinna być wypisywana tylko raz na środku zamiast dwa razy. I obecnie drukujesz od 0do lengthliczby spacji, zamiast 0do length-1ilości spacji. Nie znam zbyt dobrze Scali, ale wydaje się, że możesz rozwiązać oba problemy z +4 bajtami (łącznie 86 bajtów) w ten sposób: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Ponownie witamy i życzymy miłego pobytu! :)
Kevin Cruijssen

2

Oracle SQL, 115 bajtów

Nie język golfa, ale ...

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

Zakładając, że wartość znajduje się w kolumnie vtabeli t:

SQL Fiddle

Konfiguracja schematu Oracle 11g R2 :

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

Zapytanie 1 :

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

Wyniki :

(SQLFiddle drukuje wartości wyrównane do kolumny z jakiegoś powodu ... nie ma spacji wiodących)

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

Twoje wyniki Fiddle SQL wydają się zawierać tylko pojedyncze spacje między znakami? Zobacz ten zrzut ekranu . Zakładam, że jest to spowodowane SQL Fiddle i działa lokalnie? Przy okazji, nie jestem pewien, czy SQL używa standardowych reguł wyrażeń regularnych, ale można (.)grać w golfa ., używając \0zamiast na \1przykład w Javie? EDYCJA: Nieważne, to znaczy $0nie, \0( przykład Java o co mi chodziło ).
Kevin Cruijssen

1
@KevinCruijssen Kliknij strzałkę w dół obok przycisku „Uruchom SQL” i zmień wyjście na „Wyjście zwykłego tekstu” lub „Wyjście Markdown”, a zobaczysz spacje.
MT0,

Dzięki. W tym przypadku rzeczywiście wygląda dobrze!
Kevin Cruijssen

2

Kod maszynowy 8086, 56 53 bajtów

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

Zmontowano z:

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:

Przypadek testowy:

zrzut ekranu


Cześć. Chyba nie ma skompilowanego online kodu maszynowego 8086, ale czy mógłbyś dodać zrzut ekranu wyjścia dla jednego z przypadków testowych? Następnie mogę sprawdzić, czy wszystko jest w porządku. :)
Kevin Cruijssen

Gotowy.
Ogoliłem

Dzięki za zrzut ekranu! Niestety jest jeden mały błąd w danych wyjściowych. Środkowa linia ma teraz lengthliczbę spacji i jest w sumie 9 linii, ale środkowa linia powinna mieć length-1ilość spacji i zamiast tego powinno być w sumie 7 linii (dla 4-literowego słowa „test”) ..: (Mam nadzieję, że naprawa nie jest zbyt droga pod względem bajtów?
Kevin Cruijssen,

1
Ohh widzę. Naprawiono to teraz, nawet zmniejszyłem go o jeszcze jeden bajt.
user5434231,

2

Haskell, 64 60 59 bajtów

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

Wypróbuj 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'

2

Bash , 115 , 109 , 105 , 100 , 97 , 96 , 92 , 91 , 90 bajtów

-5 i -3 dzięki Kevin Cruissen

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

Wypróbuj online!


Należy zauważyć, że ponieważ \jest powłoką char ucieczka, przypadek testowy )}/\powinien być wprowadzony z dodatkowym \takiego: )}/\\.


Cześć. Czy można dodać łącze TIO do przypadków testowych? Poza tym nie znam Basha zbyt dobrze, ale czy można usunąć spacje po ini printfjak w Pythonie?
Kevin Cruijssen

1
@KevinCruijssen, Dzięki, zobacz poprawioną odpowiedź. Jestem nowy na TIO-link jednakże, i nie jestem pewien, w jaki sposób korzystać z wielu przypadków testowych, ponieważ ten bashkod wejść tylko na łańcuch, ( czyli tylko jedna linia). Wszystkie przypadki testowe działają jednak, ale )}/\ muszą być tak cytowane <<< ')}/\' read s; ...etc. . Spacje po ini printfsą potrzebne.
agc

Dzięki. Jeden przypadek testowy dla TIO jest w porządku. Chodzi głównie o sprawdzenie, czy wszystko działa zgodnie z oczekiwaniami, co rzeczywiście wydaje się mieć miejsce. +1 ode mnie :)
Kevin Cruijssen

1
W nowej wersji możesz zagrać w golfa o 5 dodatkowych bajtów w ten sposób . Spacje po fori domożna je usunąć. f=1można zmienić na c=f=1. I f=f+cmoże być f+=c.
Kevin Cruijssen

1
Och, jeszcze jedna drobna rzecz do gry w golfa. Nie byłem pewien, czy jest to możliwe w Bash, ale najwyraźniej tak (jeszcze jeden powód, dla którego przydatny jest link TIO;)), zmienia f!=0się fw pętlę for. Podobnie jak w JavaScript i Python, 0jest falsey, a każda dodatnia / ujemna liczba całkowita jest pozornie prawdziwa w Bash.
Kevin Cruijssen

2

Perl 6 , 43 bajtów

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

Wypróbuj online!

Zwraca listę wierszy.

Wyjaśnienie:

 {                                         }  # 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

2

C (gcc) , 131 129 111 bajtów

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

Wypróbuj online!

-20 bajtów dzięki pułapowi cat !

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

Wypróbuj online!

Lub, jeśli długość można zaakceptować jako parametr:

C (gcc), 105 102 bajtów

-1 bajt dzięki pułapkowi cat!

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

Wypróbuj online!


@ceilingcat huh!
Conor O'Brien

1
W golfie o długości 102 bajtów myślę, że xglob jest zacieniony, a zatem nadmiarowo zadeklarowany.
Jonathan Frech,

2

PHP, 148 146 143 141 bajtów

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

Możesz to przetestować w następujący sposób:

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

Wydajność

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

Piaskownica

Wersja rozszerzona

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

Próba 2, 92 bajtów

po zobaczeniu odpowiedzi @Titus zredukowałem mój do tego:

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

Próbowałem wymyślić sposób użycia 1 pętli zamiast 2 ... Wierzcie lub nie, prawie nigdy nie używam forpętli w „prawdziwym” kodzie. To było ~trochę nie. Nie tęskniłem ...

Jest trochę dłużej, 92więc nie czuję się tak źle. Ale i tak zastosuję to jako drugą próbę.

$argn to dane wejściowe z wiersza poleceń

Uruchom jako potok z opcją -nR lub wypróbuj online.

Piaskownica


Wydaje mi się, że pierwsza wersja byłaby 4 bajty krótszy, jeśli używana jest funkcja o nazwie fzamiast przypisywania anonimowy jeden do $f- function f(oszczędność ponad 2 bajty $f=function(, i zaoszczędzić kolejny bajt za każdym razem zadzwonić f(...)zamiast $f(...). Alternatywnie możesz przechwycić $s, zapisując 2 bajty - ($i)use($s)jest o 4 bajty dłuższy niż ($i,$s), ale zapisujesz 3 bajty dla każdego wywołania $f($i)zamiast $f($s,$i); w językach z automatycznym przechwytywaniem, takich jak JS, jest to częściej realne oszczędności, ponieważ nie płacisz kary za usewyciąg.
IMSoP,

Doceniam pomoc, jestem całkiem nowy w kodowaniu golfa i tak naprawdę nie robię tego zbyt wiele, ale nudzi się na zwykłych stronach SO. Zastanawiałem się nad użyciem, useale wydaje mi się, że dłużej, aby poczucie tego $ibyło dynamiczne, musiałoby zostać przekazane przez odniesienie. Tak musi być use(&$i)i $imusi zostać zdefiniowane przed przekazaniem go przez odniesienie $f. Co oznacza ustawienie go w funkcji nadrzędnej lub przed jakąkolwiek inną. Dla funkcji może to być function s($s,$i)i po prostu wiedzieć, że należy ją wywołać, s($s,0) ale wydaje się brzydka, i to już jest11 bytes, use(&$i),$i
ArtisticPhoenix

Możemy jednak użyć $si zmienić \nrzeczywisty powrót do linii. To prowadzi do 143 2 od końca linii i 1 od użycia
ArtisticPhoenix

Tak, nawet nie zastanawiałem się nad wprowadzeniem $ i do użytku, ponieważ $ s wyczuwało „naturalne” przechwytywanie, ale zawsze warto obliczyć oszczędności netto. Jednak nadal możesz zapisać 2 bajty, po prostu deklarując nazwaną funkcję fzamiast zamknięcia: 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))." ";}dodatkowe funkcje tego typu są dozwolone zgodnie z tym meta postem: codegolf.meta.stackexchange.com/questions/7614/…
IMSoP

Zaktualizowano, zapisano parę
ArtisticPhoenix
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.