Saya sudah melakukan membuat pesawat ruang angkasa!


39

Pengantar:

Terinspirasi oleh komentar ini dari @MagicOctopusUrn pada @Emigna 's jawaban 05AB1E untuk saya ' Itu hanya bug ' tantangan :

8F9ÝÀNð×ý}».∊Saya sudah melakukan membuat pesawat ruang angkasa! Dan saya sangat senang menyarankan edit 12 byte. - Magic Gurita Guci 17 Jul 17 'at 20:10

Yang merupakan program (legacy) 05AB1E menghasilkan ini:

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

Cobalah online.

Tantangan:

Input: String yang tidak kosong

Output: Dari luar menuju ke dalam, tambahkan satu spasi lagi di antara setiap karakter setiap baris, sama seperti yang dilakukan pada output di atas, sama dengan length - 1. Jadi untuk input 1234567890, output sebenarnya adalah ini:

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

Mengapa? Panjangnya 1234567890adalah 10. Jadi kita mulai dengan menghasilkan 10 baris: baris pertama tanpa spasi; kedua dengan satu pembatas ruang; ketiga dengan dua; dll. Dan kemudian (tanpa garis tengah dengan length - 1spasi diduplikasi), kita kembali ke input awal sambil turun.

Aturan tantangan:

  • Input dijamin tidak kosong (panjang >= 1). (Untuk input karakter tunggal, kami cukup menampilkan karakter itu.)
  • Jumlah spasi / spasi utama / baris baru diizinkan, selama output itu sendiri (di mana pun di layar) sudah benar. (Baris kosong di antara jalur output juga tidak diperbolehkan.)
  • Input hanya akan berisi karakter ASCII yang dapat dicetak tidak termasuk spasi putih (rentang titik kode [33, 126])
  • I / O fleksibel. Input dapat diambil sebagai parameter STDIN, argumen, atau fungsi. Mungkin daftar / array / aliran karakter, bukan string. Output juga dapat berupa daftar / array / aliran karakter, bukan string; dapat dicetak ke STDOUT; dikembalikan sebagai string yang dibatasi baris baru; dll.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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
Mendapat semua hanya gelisah !!! SPACESHIP !!!
WallyWest

1
Saya tahu saya mengenali output itu. Saya suka ide ini masih berjalan.
Carcigenicate

2
TFW Anda secara samar-samar mengenali suatu pola dalam sebuah pertanyaan ಠ_ಠlalu menyadari itu karena Anda secara tidak sengaja membuatnya setahun lalu ಠ⌣ಠ.
Magic Octopus Urn

1
@MagicOctopusUrn Terima kasih atas inspirasinya. ; D
Kevin Cruijssen

3
@KevinCruijssen terima kasih telah menyimpan kutipan konyol haha!
Magic Octopus Urn

Jawaban:


11

Japt , 8 6 byte

Mengambil input sebagai array karakter, menghasilkan array string.

£qYçÃê

Cobalah


Penjelasan

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

Asli, 8 byte

I / O adalah sebuah string. Menggunakan -Rbendera. Termasuk spasi tambahan di setiap baris.

¬£múYÄÃê

Cobalah

Penjelasan

             :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 sekali lagi :-)
ETHproduk

1
Pertanyaan serius: apakah layak untuk mencari secara iteratif melalui semua solusi panjang 1 hingga 6 byte untuk puzzle seperti ini?
filip

2
@filip No: ada lebih dari 256 ** 6 = 281474976710656 (setidaknya naif) kombinasi. Ini seperti menebak kata sandi.
Kirill Bulygin

3
@ KirillBulygin, ada lebih dari 37 triliun (37.764.717.485.592) cara yang memungkinkan untuk menggabungkan karakter yang tersedia di Japt menjadi string dengan panjang antara 1 & 6 karakter. Jika Anda memasukkan semua karakter 1 byte lainnya yang dapat digunakan dalam string literal atau string terkompresi, angka itu tumbuh lebih dari 276 triliun (276.024.445.697.280). Jadi, tidak, menulis bot untuk menghasilkan semua itu kemudian menyaring program Japt yang valid kemudian menemukan yang (jika ada) yang berfungsi untuk tantangan yang ada mungkin tidak akan layak. Selain dari mana asyiknya membiarkan bot bermain golf untukmu ?!
Shaggy

6
@Shaggy: "di mana asyiknya membiarkan bot bermain golf untukmu ?!" Bagaimana jika Anda membuat bot benar-benar pendek?
Oddthinking

11

R , 105 99 85 84 79 byte

-6 terima kasih kepada @Kevin Cruissen dan @Giuseppe

-14 dari perubahan ke metode berbasis regex

-1 terima kasih kepada @Giuseppe

-5 terima kasih kepada @digEmALl

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

Cobalah online!


Anda dapat bermain golf 1 byte dengan menghapus spasi pada in(r<-.
Kevin Cruijssen

1
dan Anda hanya menggunakan ssekali sehingga Anda bisa menggunakannya sebagai argumen writesecara langsung; membawa Anda ke 99 byte
Giuseppe

1
haruskah itu 1bukan ""di dalam write? Saya menggali penggunaan Anda Map!
Giuseppe


1
Saya yakin saya bisa mengalahkan ini dengan collapseargumen untuk pastetetapi itu tidak terjadi ...
JDL


6

Arang , 10 byte

Eθ⪫θ× κ‖O↓

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Arang tidak mencerminkan hal-hal seperti [untuk ]- atau adalah bahwa perintah terpisah lain?
Magic Octopus Urn

@MagicOctopusUrn Ada perintah terpisah jika Anda ingin mengubah refleksi. Lihat codegolf.stackexchange.com/a/127164 misalnya.
Neil

Saya pikir saya telah melihatnya mencerminkan sebelumnya, tetapi tidak yakin. Rapi!
Magic Octopus Urn


6

Python 2 , 72 70 68 66 65 byte

-2 byte terima kasih kepada Kevin Cruijssen
-3 byte berkat ovs

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

Cobalah online!


c==len(w)-1dapat golf dengan 1 byte dengan c+2>len(w). EDIT: Di versi 70-byte baru Anda, 0<cbisa c.
Kevin Cruijssen

6

05AB1E , 10 9 byte

Disimpan 1 byte berkat Adnan

εINð×ý}û»

Cobalah online!

Penjelasan

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

Anda dapat menjatuhkan S. Input fleksibel, sehingga input sesuai daftar diperbolehkan.
Kevin Cruijssen

1
@KevinCruijssen: Versi pertama Anda adalah 9 byte sebelumnya, karena »dapat dihilangkan.
Emigna

1
Hormat sebenarnya bekerja di legacy dalam 9 byte juga jika Anda menghapus »dan mengubah loop vke peta ε.
Kevin Cruijssen

1
Diposting jawabannya . Dan saat ini Japt mengalahkan kami dengan 6 byte, saya khawatir. Atau maksud Anda terpendek di 05AB1E (Elixir menulis ulang) dan 05AB1E (warisan Python)? :)
Kevin Cruijssen

2
Apakah εINð×ý}û»juga berfungsi?
Adnan


4

Japt , 9 8 byte

-1 byte dari @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

Cobalah online!


Dang; Sepertinya kamu ninja lagi! Saya tahu jika Anda ingin saya menghapus milik saya.
Shaggy

1
@Shaggy tidak, pertahankan jawaban Anda, Anda menggunakan array sebagai input sementara saya menggunakan string sehingga mereka agak berbeda xD
Luis felipe De jesus Munoz

1
SpX-> untuk penghematan 1 byte.
Shaggy

4

PowerShell , 66 54 byte

-12 byte berkat mazzy

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

Cobalah online!

Mengambil input melalui splatting, yang pada TIO bermanifestasi sebagai argumen baris perintah terpisah untuk setiap karakter.

Kami pertama-tama ditetapkan $a=$argssebagai argumen input. Kemudian kita set $xsama dengan .countarray itu -1. Kita kemudian perlu mengulang surat untuk membangun pesawat ruang angkasa. Itu dilakukan dengan membuat rentang dari 0ke $x, lalu $xkembali ke 0, lalu menggunakan Get-Uniqueuntuk menarik hanya rentang yang sesuai.

Setiap iterasi, kami mengambil argumen masukan kami dan -joinmereka bersama-sama dengan jumlah spasi yang sesuai. Masing-masing string tersebut ditinggalkan di jalur pipa, dan sebuah implisit Write-Outputmemberi kita baris baru secara gratis ketika program selesai.


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

1
@ Mazzy Apa ... bagaimana cara Get-Uniquekerjanya di kisaran? Itu gila! Terima kasih!
AdmBorkBork

4

05AB1E (warisan) , 9 byte

εINúíJ}û»

Masukan sebagai daftar karakter.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ε     }    # 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, juga ini tidak valid karena cermin perubahan orientasi / ke \ ketika cermin, sama dengan [, ]dan (, ). Mungkin ingin menambahkan kasing itu untuk menangkap arang juga. (Pindah komentar lain untuk jawaban Emigna, karena dia adalah jawaban yang saya awalnya mengomentari)
Magic Octopus Mm

@ MagicOctopusUrn Terima kasih telah memberi tahu saya. Memperbaikinya dengan menggunakan û»alih-alih .∊.
Kevin Cruijssen

4

Haskell , 60 59 byte

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

Cobalah online!

Penjelasan

Untuk string (mis. "abc") Kami menerapkan terlebih dahulu

scanl (?) <*> tail

yang sama dengan

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

Ini berulang kali berlaku (?)(menambahkan spasi untuk setiap karakter dalam kisaran [33 ..] ) kestr hingga ada banyak string seperti yang strmemiliki karakter:["abc","a b c ", "a b c "]

Sekarang kita hanya perlu menggabungkan hasilnya (minus elemen terakhir) dengan bagian pembaliknya:

init<>reverse

4

MATL , 25 22 13 byte

zZv"Gtz@he!1e

Cobalah online!

Terimakasih untuk Luis Mendo karena menyarankan golf 5 byte, yang kemudian mengilhami saya untuk mengurangi 4 byte lagi!

Penjelasan, dengan contoh input '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

Jelly , 9 byte

jⱮLḶ⁶ẋƲŒḄ

Cobalah online!

Mengembalikan daftar garis; output yang di-prettified melalui TIO.


Yang agak berbeda 9: ,€⁶$LСŒḄ. Lainnya, lebih mirip, 9-an: J’⁶ẋŒḄɓjⱮdan J’⁶ẋŒḄjⱮ@(saya sedang mencari yang lebih pendek tetapi belum ada sukacita)
Jonathan Allan

@ Jonathan Allan Saya cukup yakin ini optimal, saya tidak berpikir ada cara yang lebih pendek untuk menulis LḶ⁶ẋatau ŒḄ. Namun, jika Anda berhasil menemukan save, lakukan ping saya. :-)
Erik the Outgolfer

Memikirkannya sedikit ,€⁶$LСŒḄmungkin tidak valid karena memiliki sarang gila sehingga mungkin perlu Ydan menjadi program lengkap.
Jonathan Allan

@ Jonathan Allan Ya, tentu saja tidak. ['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']]]], '!']Setidaknya saya sudah mengungguli 05AB1E ...
Erik the Outgolfer

Saya bilang saya mengungguli 05AB1E, eh? Bah, tidak lagi. : /
Erik the Outgolfer


3

Stax , 10 byte

Ç·9ƒù▌╘Ä┘e

Jalankan dan debug itu

Output dengan spasi spasi di setiap baris.

Penjelasan:

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

Larutan:

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

Cobalah online!

Penjelasan:

Port solusi K4 saya :

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

Catatan:

  • -1 byte terima kasih kepada ngn

1
,:'-> +,
ngn

2

Pascal (FPC) , 143 135 byte

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.

Cobalah online!

Saya mungkin akan menang hanya melawan Bahasa ...


2

PHP, 88 89 byte

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

membutuhkan PHP 5 atau lebih baru untuk str_split. Jalankan sebagai pipa dengan -nRatau coba online .


Tautan try-it-online Anda memberikan hasil yang salah, saya khawatir. Dalam output Anda, semua baris juga memiliki spasi di depan, alih-alih hanya di antara karakter (atau opsional tambahan). Semua karakter pertama harus di kolom yang sama di output.
Kevin Cruijssen

1
@KevinCruijssen Tidak melihat output yang cukup dekat. Tetap. (Meskipun begitu keluaran saya sebelumnya tampak lebih seperti roket) ;-)
Titus

Bagiku itu seperti kepala panah bagiku. : D Tapi +1 sekarang sudah diperbaiki.
Kevin Cruijssen

Jika Anda menempatkan baris baru yang sebenarnya sebagai ganti \ n, Anda menyimpan byte :)
Martijn

@ Martijn sebenarnya saya hanya menghitung satu byte untuk itu ... lupa untuk menggantinya ketika saya menempelkan kode di sini.
Titus

2

K4 , 23 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Memiliki spasi spasi di setiap baris.

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

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

Cobalah online!


Hai yang disana. Saat ini jawaban Anda adalah potongan bukannya fungsi atau program lengkap. Ini dapat diperbaiki dengan murah dengan menambahkan s=>{sebelum dan }sesudah menjadikannya fungsi lambda. Selain itu, satu hal untuk golf adalah melepas tanda kurung di sekitar for-loop. Cobalah online.
Kevin Cruijssen

@KevinCruijssen Terima kasih! Lupa memperbaikinya sebelum memposting ...
RobIII

2

Scala , 82 byte

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

Cobalah online

Scala memiliki banyak pintasan yang membantu saya di sini dan itu cukup mudah dibaca! Coba Scala


Halo, selamat datang di PPCG! Meskipun ini jawaban yang bagus, saya khawatir dua hal sedikit salah. Garis dengan spasi terbanyak seharusnya hanya berupa output sekali di tengah, bukan dua kali. Dan saat Anda mencetak dari 0ke lengthjumlah ruang, bukan 0untuk length-1berjumlah ruang. Saya tidak terlalu mengenal Scala, tetapi sepertinya Anda dapat memperbaiki kedua masalah dengan +4 byte (total 86 byte) seperti ini: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Sekali lagi selamat datang, dan nikmati masa tinggal Anda! :)
Kevin Cruijssen

2

Oracle SQL, 115 byte

Bukan bahasa golf tapi ...

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

Dengan asumsi bahwa nilainya ada dalam kolom vtabel t:

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

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

Pertanyaan 1 :

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

Hasil :

(SQLFiddle mencetak nilai yang tepat di kolom untuk beberapa alasan ... tidak ada spasi terkemuka)

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

Hasil SQL Fiddle Anda tampaknya hanya memiliki satu spasi di antara karakter? Lihat tangkapan layar ini . Saya menganggap ini karena SQL Fiddle dan itu berfungsi secara lokal? Btw, tidak yakin apakah SQL menggunakan aturan regex standar, tetapi dapat di (.)-golf .dengan menggunakan \0alih-alih \1seperti yang Anda lakukan di Java misalnya? EDIT: Sudahlah, itu untuk $0, bukan \0.. ( Jawa contoh apa yang saya maksud ).
Kevin Cruijssen

1
@KevinCruijssen Klik panah bawah di sebelah tombol "Run SQL" dan ubah output menjadi "Plaintext Output" atau "Markdown Output" dan Anda akan melihat spasi.
MT0

Terima kasih. Memang terlihat bagus dalam kasus itu!
Kevin Cruijssen

2

8086 kode mesin, 56 53 byte

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

Dirakit dari:

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:

Kasus cobaan:

tangkapan layar


Hai yang disana. Saya kira tidak ada kompilasi online untuk 8086 kode mesin, tetapi bisakah Anda menambahkan screenshot dari output untuk salah satu kasus uji? Maka saya dapat memeriksa apakah semuanya benar. :)
Kevin Cruijssen

Selesai Juga
memangkas

Terima kasih untuk tangkapan layarnya! Sayangnya ada satu kesalahan kecil dalam output. Baris tengah sekarang memiliki lengthjumlah spasi dan total ada 9 baris, tetapi garis tengah harus memiliki length-1jumlah spasi dan harus ada total 7 baris sebagai gantinya (untuk kata 'test'` 4 huruf) ..: (Saya harap ini tidak mahal dalam hal byte untuk diperbaiki?
Kevin Cruijssen

1
Ohh begitu. Itu sudah diperbaiki sekarang, saya bahkan mengurangi satu byte lagi.
user5434231

2

Haskell, 64 60 59 byte

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

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

-5 & -3 Terima kasih kepada Kevin Cruissen

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

Cobalah online!


Perhatikan bahwa karena \ini adalah shell pelarian karakter, kasus uji)}/\ harus dimasukkan dengan tambahan \seperti ini: )}/\\.


Hai yang disana. Apakah mungkin menambahkan tautan TIO dengan case uji? Juga, saya tidak tahu Bash dengan sangat baik, tetapi apakah mungkin untuk menghapus spasi setelah indan printfsuka dengan Python?
Kevin Cruijssen

1
@KevinCruijssen, Terima kasih, lihat jawaban yang direvisi. Aku baru untuk TIO-link Namun, dan saya tidak yakin bagaimana untuk menggunakan beberapa uji kasus, karena ini bashkode hanya masukan sebuah tali, ( yaitu hanya satu baris). Namun, semua kasus uji berfungsi, namun )}/\ harus tunggal yang dikutip seperti ini <<< ')}/\' read s; ...etc. . Ruang setelah indan printfdibutuhkan.
agc

Terima kasih. Dan satu test case untuk TIO baik-baik saja. Ini terutama untuk memverifikasi apakah semuanya berfungsi seperti yang diharapkan, yang memang tampaknya demikian. +1 dari saya. :)
Kevin Cruijssen

1
Di versi baru Anda, Anda bisa bermain golf 5 byte lebih seperti ini . Spasi setelah fordan dodapat dihapus. f=1dapat diubah menjadi c=f=1. Dan f=f+cbisa jadi f+=c.
Kevin Cruijssen

1
Oh, satu hal kecil lagi untuk bermain golf. Tidak yakin apakah itu mungkin di Bash, tetapi ternyata itu (salah satu alasan mengapa TIO-link berguna;)), adalah dengan mengubah f!=0ke fdalam for-loop. Sama seperti dalam JavaScript dan Python, 0adalah falsey dan setiap bilangan bulat positif / negatif lainnya tampaknya benar di Bash.
Kevin Cruijssen

2

Perl 6 , 43 byte

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

Cobalah online!

Mengembalikan daftar garis.

Penjelasan:

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

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

Cobalah online!

Terima kasih -20 byte 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,"");}

Cobalah online!

Atau, jika panjang dapat diterima sebagai parameter:

C (gcc), 105 102 byte

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

Cobalah online!


@ceilingcat ya!
Conor O'Brien

1
Dalam 102 byte golf panjang Anda, saya pikir global xdibayangi dan dengan demikian dinyatakan secara berlebihan.
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))."
";}

Anda dapat mengujinya seperti ini:

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

Keluaran

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

Bak pasir

Versi yang diperluas

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

Percobaan 2, 92 byte

setelah melihat jawaban @Titus saya mengurangi milik saya menjadi ini:

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

Saya mencoba memikirkan cara untuk menggunakan 1 loop, bukannya 2 ... Percaya atau tidak, saya hampir tidak pernah menggunakan forloop dalam kode "nyata". Itu adalah~ bitwise Tidak, bahwa saya hilang ...

Ini sedikit lebih lama 92sehingga saya tidak merasa begitu buruk. Tapi saya akan memasukkannya sebagai upaya kedua.

$argn adalah input dari baris perintah

Jalankan sebagai pipa dengan -nR atau coba online.

Bak pasir


Sepertinya saya bahwa versi pertama Anda akan menjadi 4 bytes lebih pendek jika Anda menggunakan fungsi bernama fbukannya menetapkan satu anonim untuk $f- function f(menyimpan 2 bytes lebih $f=function(, dan Anda menyimpan byte lain setiap kali Anda menelepon f(...)bukan $f(...). Atau, Anda dapat menangkap $s, menghemat 2 byte - ($i)use($s)lebih lama 4 byte ($i,$s), tetapi Anda menyimpan 3 byte untuk setiap panggilan, $f($i)bukan $f($s,$i); dalam bahasa dengan penangkapan otomatis, seperti JS, ini lebih sering merupakan penghematan, karena Anda tidak membayar penalti usepernyataan itu.
IMSoP

Saya menghargai bantuannya, saya cukup baru untuk kode golf dan tidak terlalu sering melakukannya, orang bosan dengan halaman SO biasa. Saya memang berpikir untuk menggunakan usetetapi rasanya lebih lama, untuk melakukan itu $iadalah dinamis, itu harus diteruskan dengan referensi. Jadi itu harus use(&$i)dan $iharus didefinisikan sebelum meneruskannya dengan referensi $f. Yang berarti mengaturnya di fungsi induk, atau sebelum yang lain. Untuk fungsi itu bisa function s($s,$i)dan hanya tahu itu harus dipanggil dengan s($s,0) tetapi tampaknya jelek, dan itu ada11 bytes, use(&$i),$i
ArtisticPhoenix

Kita bisa menggunakan $sdan mengubah \nkembali garis nyata. Itu membuatnya menjadi 143 2 dari akhir baris dan 1 dari penggunaan
ArtisticPhoenix

Ya, saya bahkan tidak mempertimbangkan memasukkan $ i ke dalam penggunaan, karena $ s merasakan tangkapan "alami", tetapi selalu layak menghitung penghematan bersih. Namun, Anda masih dapat menyimpan 2 byte dengan hanya mendeklarasikan fungsi bernama falih-alih penutupan: 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))." ";}Fungsi tambahan seperti ini diizinkan menurut meta post ini: codegolf.meta.stackexchange.com/questions/7614/…
IMSoP

Diperbarui, menyimpan pasangan
ArtisticPhoenix
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.