Tôi đã làm một con tàu vũ trụ!


39

Giới thiệu:

Lấy cảm hứng từ nhận xét này của @MagicOctopusUrn trên @Emigna 's câu trả lời 05AB1E cho tôi ' Đó chỉ là một lỗi ' thách thức :

8F9ÝÀNð×ý}».∊Tôi đã làm một con tàu vũ trụ! Và tôi rất phấn khích khi đề xuất chỉnh sửa 12 byte. - Bạch tuộc ma thuật Urn ngày 17 tháng 7 năm 17 lúc 20:10

Đó là chương trình 05AB1E (di sản) dẫn đến điều này:

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

Hãy thử trực tuyến.

Thử thách:

Đầu vào: Một chuỗi không trống

Đầu ra: Từ bên ngoài đi vào bên trong, thêm một khoảng trắng giữa mỗi ký tự mỗi dòng, tương tự như được thực hiện ở đầu ra ở trên, bằng với length - 1. Vì vậy, đối với một đầu vào 1234567890, đầu ra thực sự sẽ là thế này:

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

Tại sao? Độ dài của 123456789010. Vì vậy, chúng tôi bắt đầu bằng cách xuất ra 10 dòng: dòng đầu tiên không có khoảng trắng; thứ hai với một dấu phân cách không gian; thứ ba với hai; vv Và sau đó (không có đường giữa với các length - 1khoảng trắng được nhân đôi), chúng ta quay trở lại đầu vào ban đầu trong khi đi xuống.

Quy tắc thử thách:

  • Đầu vào được đảm bảo không trống (chiều dài >= 1). (Đối với các đầu vào char đơn, chúng ta chỉ cần xuất ký tự đó.)
  • Bất kỳ số lượng dấu vết / khoảng trắng hàng đầu / dòng mới nào đều được cho phép, miễn là bản thân đầu ra (bất cứ nơi nào trên màn hình) là chính xác. (Các dòng trống ở giữa các dòng đầu ra cũng không được phép.)
  • Đầu vào sẽ chỉ chứa các ký tự ASCII có thể in được, ngoại trừ khoảng trắng (phạm vi điểm mã [33, 126])
  • I / O là linh hoạt. Đầu vào có thể được lấy dưới dạng STDIN, đối số hoặc tham số hàm. Có thể là một danh sách / mảng / luồng ký tự thay vì chuỗi. Đầu ra cũng có thể là một danh sách / mảng / luồng ký tự thay vì chuỗi; có thể được in ra STDOUT; trả về dưới dạng chuỗi phân cách dòng mới; v.v.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm:

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
Được tất cả chỉ là hốt hoảng !!! SPACESHIP !!!
WallyWest

1
Tôi biết tôi đã nhận ra đầu ra đó. Tôi thích ý tưởng này vẫn còn.
Carcigenicate

2
TFW bạn mơ hồ nhận ra một mẫu trong một câu hỏi và ಠ_ಠsau đó nhận ra nó bởi vì bạn đã vô tình tạo ra nó một năm trước ಠ⌣ಠ.
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn Cảm ơn đã truyền cảm hứng. ; D
Kevin Cruijssen

3
@KevinCruijssen cảm ơn vì đã giữ trích dẫn ngớ ngẩn haha!
Bạch tuộc ma thuật Urn

Câu trả lời:


11

Japt , 8 6 byte

Lấy đầu vào là một mảng các ký tự, xuất ra một chuỗi các chuỗi.

£qYçÃê

Thử nó


Giải trình

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

Bản gốc, 8 byte

I / O là một chuỗi. Sử dụng -Rcờ. Bao gồm các dấu cách trên mỗi dòng.

¬£múYÄÃê

Thử nó

Giải trình

             :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 một lần nữa :-)
ETHproductions

1
Câu hỏi nghiêm túc: có khả thi khi tìm kiếm lặp đi lặp lại qua tất cả các giải pháp dài từ 1 đến 6 byte cho một câu đố như thế này không?
filip

2
@filip Không: có hơn 256 kết hợp ** 6 = 281474976710656 (ít nhất là ngây thơ). Nó giống như đoán mật khẩu.
Kirill Bulygin

3
@KirillBulygin, có hơn 37 nghìn tỷ (37,764,717,485,592) cách kết hợp các ký tự có sẵn trong Japt thành một chuỗi dài từ 1 đến 6 ký tự. Nếu bạn bao gồm tất cả các ký tự 1 byte khác có thể được sử dụng trong chuỗi ký tự hoặc chuỗi nén, thì con số đó tăng lên hơn 276 nghìn tỷ đồng (276.024.445.697.280). Vì vậy, không, viết một bot để tạo ra tất cả những chương trình sau đó lọc ra các chương trình Japt hợp lệ, sau đó tìm một chương trình (nếu có) hoạt động cho thử thách trong tay có lẽ sẽ không khả thi. Bên cạnh đó là niềm vui trong việc để một con bot chơi golf cho bạn?!
Xù xì

6
@Shaggy: "Đâu là niềm vui khi để bot làm việc đánh gôn cho bạn?!" Điều gì nếu bạn làm bot thực sự, thực sự ngắn?
Oddthinking

11

R , 105 99 85 84 79 byte

-6 cảm ơn @Kevin Cruissen và @Giuseppe

-14 từ thay đổi sang phương pháp dựa trên regex

-1 cảm ơn @Giuseppe

-5 cảm ơn @digEmALl

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

Hãy thử trực tuyến!


Bạn có thể chơi golf 1 byte bằng cách xóa khoảng trống tại in(r<-.
Kevin Cruijssen

1
và bạn chỉ sử dụng smột lần để bạn có thể sử dụng nó làm đối số writetrực tiếp; đưa bạn xuống 99 byte
Giuseppe

1
đó có nên là một 1thay vì một ""trong write? Tôi đang đào sử dụng của bạn Map!
Giuseppe


1
Tôi đã bị thuyết phục rằng tôi có thể đánh bại điều này bằng collapselập luận pastenhưng điều đó không xảy ra ...
JDL


6

Than , 10 byte

Eθ⪫θ× κ‖O↓

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Than không phản ánh những thứ như [để ]- hoặc là một lệnh riêng biệt?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Có các lệnh riêng nếu bạn muốn chuyển đổi sự phản chiếu. Xem codegolf.stackexchange.com/a/127164 chẳng hạn.
Neil

Tôi nghĩ rằng tôi đã thấy nó phản ánh trước đó, nhưng không chắc chắn. Khéo léo!
Bạch tuộc ma thuật Urn

6

Canvas , 8 byte

┐² ×*]──

Hãy thử nó ở đây!

Các 7 byte phiên bản là quá tốt cho thách thức này ..


Tôi thích phiên bản 7 byte của bạn. Bạn có sẵn lòng giải thích nó hoạt động như thế nào không? Toán tử nào chồng chéo hai /s thành một X?
Kaya

3
@Kaya đó là nhân vật cuối cùng - - palindromize dọc. Việc palindromization của Canvas làm những điều tuyệt vời . Phần chồng chéo cũng có đặc điểm riêng của nó.
dzaima

6

Python 2 , 72 70 68 66 65 byte

-2 byte nhờ Kevin Cruijssen
-3 byte nhờ các lò nướng

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

Hãy thử trực tuyến!


c==len(w)-1có thể được chơi bằng 1 byte với c+2>len(w). EDIT: Trong phiên bản 70 byte mới của bạn, 0<ccó thể c.
Kevin Cruijssen

6

05AB1E , 10 9 byte

Đã lưu 1 byte nhờ Adnan

εINð×ý}û»

Hãy thử trực tuyến!

Giải trình

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

Bạn có thể thả S. Đầu vào là linh hoạt, vì vậy, nhập vào như danh sách được cho phép.
Kevin Cruijssen

1
@KevinCruijssen: Phiên bản đầu tiên của bạn là 9 byte kế thừa, như »có thể được bỏ qua.
Emigna

1
Bạn cũng thực sự làm việc theo di sản trong 9 byte nếu bạn loại bỏ »và thay đổi vòng lặp vthành bản đồ ε.
Kevin Cruijssen

1
Đăng câu trả lời . Và hiện tại Japt đang đánh bại chúng tôi với 6 byte tôi sợ. Hay bạn có nghĩa là ngắn nhất trong 05AB1E (Elixir viết lại) và 05AB1E (di sản Python)? :)
Kevin Cruijssen

2
εINð×ý}û»cũng làm việc không?
Ad Nam


4

Japt , 9 8 byte

-1 byte từ @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

Hãy thử trực tuyến!


Đăng; Có vẻ như bạn ninja tôi một lần nữa! Để tôi biết nếu bạn muốn tôi xóa tôi.
Xù xì

1
@Shaggy không, hãy giữ câu trả lời của bạn, bạn đang sử dụng mảng làm đầu vào trong khi tôi sử dụng một chuỗi để chúng là loại xD khác nhau
Luis felipe De jesus Munoz

1
SpX-> để tiết kiệm 1 byte.
Xù xì

4

PowerShell , 66 54 byte

-12 byte nhờ mazzy

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

Hãy thử trực tuyến!

Đưa đầu vào thông qua tính năng ghép hình, trên TIO biểu hiện dưới dạng các đối số dòng lệnh riêng biệt cho mỗi ký tự.

Đầu tiên chúng ta đặt $a=$argslàm đối số đầu vào. Sau đó, chúng tôi đặt $xbằng với .countmảng đó -1. Sau đó chúng ta cần lặp qua các chữ cái để xây dựng tàu vũ trụ. Điều đó được thực hiện bằng cách xây dựng một phạm vi từ 0đến $x, sau đó $xquay xuống 0, sau đó sử dụng Get-Uniqueđể lấy ra phạm vi phù hợp.

Mỗi lần lặp, chúng ta lấy các đối số đầu vào của chúng và -joinchúng cùng với số lượng khoảng trắng tương ứng. Mỗi chuỗi đó được để lại trên đường ống và một ẩn Write-Outputcho chúng ta những dòng mới miễn phí khi chương trình hoàn thành.


Hãy thử điều này:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy Cái gì ... làm thế nào mà Get-Uniquehoạt động như vậy trên phạm vi? Thật điên rồ! Cảm ơn!
admBorkBork

4

05AB1E (di sản) , 9 byte

εINúíJ}û»

Nhập dưới dạng danh sách các ký tự.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ε     }    # 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, điều này cũng không hợp lệ vì gương thay đổi hướng của / thành \ khi được nhân đôi, cùng với [, ](, ). Có thể muốn thêm những trường hợp để bắt than quá. (Chuyển các bình luận khác sang câu trả lời của Emigna, bởi vì anh ấy là câu trả lời ban đầu tôi nhận xét)
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Cảm ơn đã cho tôi biết. Đã sửa nó bằng cách sử dụng û»thay vì .∊.
Kevin Cruijssen

4

Haskell , 60 59 byte

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

Hãy thử trực tuyến!

Giải trình

Đối với một chuỗi (ví dụ. "abc") Chúng tôi áp dụng đầu tiên

scanl (?) <*> tail

giống như

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

Điều này được áp dụng nhiều lần (?)(nối thêm một khoảng trắng cho mỗi ký tự trong phạm vi [33 ..] ) chostr cho đến khi có nhiều chuỗi strcó ký tự:["abc","a b c ", "a b c "]

Bây giờ chúng ta chỉ cần nối kết quả (trừ phần tử cuối cùng) với phần bộ đếm đảo ngược của nó:

init<>reverse

4

MATL , 25 22 13 byte

zZv"Gtz@he!1e

Hãy thử trực tuyến!

Nhờ vào Luis Mendo vì đã gợi ý một golf 5 byte, sau đó đã truyền cảm hứng cho tôi để loại bỏ thêm 4 byte!

Giải thích, với ví dụ đầu vào '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

Thạch , 9 byte

jⱮLḶ⁶ẋƲŒḄ

Hãy thử trực tuyến!

Trả về một danh sách các dòng; sản lượng được bổ sung qua TIO.


Một chút khác nhau 9 : ,€⁶$LСŒḄ. Khác, tương tự hơn, 9: J’⁶ẋŒḄɓjⱮJ’⁶ẋŒḄjⱮ@(Tôi đang tìm kiếm ngắn hơn nhưng chưa có niềm vui nào)
Jonathan Allan

@Jonathan ALLan Tôi khá chắc chắn rằng điều này là tối ưu, tôi không nghĩ có cách nào ngắn hơn để viết LḶ⁶ẋhay ŒḄ. Tuy nhiên, nếu bạn quản lý để tìm một lưu, hãy ping tôi. :-)
Erik the Outgolfer

Suy nghĩ về nó một chút tôi ,€⁶$LСŒḄcó thể không hợp lệ vì nó có lồng nhau điên rồ nên có thể cần một Yvà là một chương trình đầy đủ.
Jonathan Allan

@Jonathan ALLan Vâng, tất nhiên là không rồi. ['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']]]], '!']Ít nhất tôi đã vượt qua 05AB1E ...
Erik the Outgolfer

Tôi nói tôi đã vượt qua 05AB1E, eh? Bah, không còn nữa. : /
Erik the Outgolfer


3

Stax , 10 byte

Ç·9ƒù▌╘Ä┘e

Chạy và gỡ lỗi nó

Đầu ra với khoảng trắng theo sau trên mỗi dòng.

Giải trình:

%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

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

Hãy thử trực tuyến!


1
l-Math.abs(i)có thể được đánh gôn tới i<0?l+i:l-i-2 byte.
Kevin Cruijssen

@KevinCruijssen Cảm ơn! :)
Olivier Grégoire

nó có thể được l-i<0?-i:ikhông
Quintec

@ thecoder16 Bạn sẽ cần dấu ngoặc đơn: l-(i<0?-i:i)(12 byte).
Jonathan Frech

3

K (oK) , 25 24 byte

Giải pháp:

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

Hãy thử trực tuyến!

Giải trình:

Cổng giải pháp K4 của tôi :

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

Ghi chú:

  • -1 byte nhờ 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.

Hãy thử trực tuyến!

Tôi có lẽ sẽ chỉ giành chiến thắng trước Lenguage ...


2

PHP, 88 89 byte

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

yêu cầu PHP 5 trở lên cho str_split. Chạy như ống với -nRhoặc thử trực tuyến .


Liên kết dùng thử trực tuyến của bạn cung cấp đầu ra sai tôi sợ. Trong đầu ra của bạn, tất cả các dòng cũng có khoảng trắng ở đầu, thay vì chỉ giữa các ký tự (hoặc tùy chọn theo dõi). Tất cả các ký tự đầu tiên phải ở trong cùng một cột trong đầu ra.
Kevin Cruijssen

1
@KevinCruijssen Didn Nhìn vào đầu ra đủ gần. Đã sửa. (Mặc dù imo đầu ra trước đây của tôi trông giống như một tên lửa) ;-)
Titus

Nó trông giống như đầu mũi tên đối với tôi. : D Nhưng +1 bây giờ đã được sửa.
Kevin Cruijssen

Nếu bạn đặt một dòng mới thực sự thay vì \ n, bạn sẽ lưu một byte :)
Martijn

@Martijn Tôi thực sự chỉ đếm một byte cho nó ... quên thay thế nó khi tôi dán mã ở đây.
Tít

2

K4 , 23 byte

Giải pháp:

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

Thí dụ:

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"

Giải trình:

Có khoảng trắng ở cuối mỗi dòng.

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

Hãy thử trực tuyến!


Chào bạn Hiện tại câu trả lời của bạn là một đoạn thay vì một chức năng hoặc chương trình đầy đủ. Điều này có thể được sửa chữa với giá rẻ bằng cách thêm s=>{trước và }sau để biến nó thành hàm lambda. Ngoài ra, một điều để chơi golf là loại bỏ các dấu ngoặc quanh vòng lặp for. Hãy thử trực tuyến.
Kevin Cruijssen

@KevinCruijssen Cảm ơn! Quên sửa nó trước khi đăng ...
RobIII

2

Scala , 82 byte

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

Dùng thử trực tuyến

Scala có rất nhiều phím tắt đang giúp tôi ở đây và điều đó khá dễ đọc! Hãy thử Scala


Xin chào, chào mừng đến với PPCG! Mặc dù đó là một câu trả lời hay, tôi sợ hai điều hơi sai. Dòng có nhiều khoảng trắng nhất chỉ nên được xuất một lần ở giữa thay vì hai lần. Và hiện tại bạn in từ 0để lengthlượng không gian, thay vì 0để length-1số tiền của không gian. Tôi không biết Scala quá rõ, nhưng có vẻ như bạn có thể khắc phục cả hai vấn đề với +4 byte (tổng cộng 86 byte) như thế này:for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString) Một lần nữa xin chào mừng và tận hưởng kỳ nghỉ của bạn! :)
Kevin Cruijssen

2

Oracle SQL, 115 byte

Không phải ngôn ngữ chơi gôn nhưng ...

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

Giả sử rằng giá trị nằm trong cột vcủa bảng t:

Câu đố SQL

Thiết lập lược đồ Oracle 11g R2 :

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

Truy vấn 1 :

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

Các kết quả :

(SQLFiddle in các giá trị được căn phải trong cột vì một số lý do ... không có khoảng trắng hàng đầu)

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

Kết quả SQL Fiddle của bạn dường như chỉ có khoảng trắng ở giữa các ký tự? Xem ảnh chụp màn hình này . Tôi giả sử điều này là do SQL Fiddle và nó hoạt động cục bộ? Btw, không chắc chắn nếu SQL sử dụng các quy tắc regex tiêu chuẩn, nhưng có thể (.)được chơi .bằng cách sử dụng \0thay vì \1như bạn có thể làm trong Java chẳng hạn? EDIT: Đừng bận tâm, đó là vì $0, không phải \0.. ( ví dụ về ý nghĩa của Java ).
Kevin Cruijssen

1
@KevinCruijssen Nhấp vào mũi tên xuống bên cạnh nút "Chạy SQL" và thay đổi đầu ra thành "Đầu ra văn bản gốc" hoặc "Đầu ra đánh dấu" và bạn sẽ thấy khoảng trắng.
MT0

Cảm ơn. Nó thực sự có vẻ tốt trong trường hợp đó!
Kevin Cruijssen

2

Mã máy 8086, 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

Lắp ráp từ:

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:

Trường hợp thử nghiệm:

ảnh chụp màn hình


Chào bạn Tôi đoán không có bất kỳ mã trực tuyến nào được biên dịch cho mã máy 8086, nhưng có lẽ bạn có thể thêm một ảnh chụp màn hình đầu ra cho một trong các trường hợp thử nghiệm? Sau đó tôi có thể kiểm tra xem mọi thứ có đúng không. :)
Kevin Cruijssen

Làm xong. Đồng thời cạo thêm một byte :)
user5434231

Cảm ơn vì ảnh chụp màn hình! Thật không may, có một lỗi nhỏ trong đầu ra. Đường giữa hiện có lengthsố lượng khoảng trắng và có tổng cộng 9 dòng, nhưng đường giữa nên có length-1số lượng khoảng trắng và nên có tổng cộng 7 dòng thay thế (đối với từ 4 chữ cái 'test'`) ..: (Tôi hy vọng nó không tốn kém về mặt byte để sửa chữa?
Kevin Cruijssen

1
Ồ tôi hiểu rồi. Bây giờ đã được sửa, tôi thậm chí còn giảm thêm một byte nữa.
user5434231

2

Haskell, 64 60 59 byte

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

Hãy thử trực tuyến!

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 nhờ Kevin Cruissen

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

Hãy thử trực tuyến!


Lưu ý rằng vì \là char thoát shell, )}/\nên nhập trường hợp kiểm tra với phần bổ sung \như thế này : )}/\\.


Chào bạn Có thể thêm liên kết TIO với (các) trường hợp thử nghiệm không? Ngoài ra, tôi không biết rõ về Bash, nhưng liệu có thể xóa các khoảng trắng sau inprintfnhư trong Python không?
Kevin Cruijssen

1
@KevinCruijssen, Cảm ơn, xem câu trả lời sửa đổi. Tuy nhiên, tôi chưa quen với TIO-link và không chắc chắn cách sử dụng nhiều trường hợp thử nghiệm, vì bashmã này chỉ nhập một chuỗi, ( tức là chỉ một dòng). Tuy nhiên, tất cả các trường hợp thử nghiệm đều hoạt động, mặc dù )}/\ phải được trích dẫn như thế này <<< ')}/\' read s; ...etc. . Các không gian sau inprintflà cần thiết.
agc

Cảm ơn. Và một trường hợp thử nghiệm duy nhất cho TIO là tốt. Chủ yếu là để xác minh nếu mọi thứ đang hoạt động như mong đợi, thực sự có vẻ như vậy. +1 từ tôi. :)
Kevin Cruijssen

1
Trong phiên bản mới của bạn, bạn có thể chơi thêm 5 byte như thế này . Không gian sau fordocó thể được gỡ bỏ. f=1có thể được thay đổi thành c=f=1. Và f=f+ccó thể được f+=c.
Kevin Cruijssen

1
Ồ, thêm một điều nhỏ để chơi gôn. Không chắc là nó có thể ở Bash hay không, nhưng rõ ràng là vậy (một lý do nữa khiến liên kết TIO trở nên tiện dụng;)), là bằng cách thay đổif!=0 thành fvòng lặp for. Giống như trong JavaScript và Python, 0là falsey và mọi số nguyên dương / âm khác rõ ràng là sự thật trong Bash.
Kevin Cruijssen

2

Perl 6 , 43 byte

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

Hãy thử trực tuyến!

Trả về một danh sách các dòng.

Giải trình:

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

Hãy thử trực tuyến!

-20 byte nhờ vào trần nhà !

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

Hãy thử trực tuyến!

Hoặc, nếu độ dài có thể được chấp nhận làm tham số:

C (gcc), 105 102 byte

-1 byte nhờ trần nhà!

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

Hãy thử trực tuyến!


@ceilingcat hả!
Conor O'Brien

1
Trong golf dài 102 byte của bạn, tôi nghĩ rằng toàn cầu xbị che khuất và do đó được tuyên bố thừa.
Jonathan Frech

2

PHP, 148 146 143 141 byte

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

Bạn có thể kiểm tra nó như thế này:

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

Đầu ra

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

Hộp cát

Phiên bản mở rộng

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

Cố gắng 2, 92 byte

Sau khi thấy câu trả lời của @Titus, tôi đã giảm tôi về điều này:

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

Tôi đã cố gắng nghĩ cách sử dụng 1 vòng lặp, thay vì 2 ... Tin hay không, tôi gần như không bao giờ sử dụng forvòng lặp trong mã "thực". Đó là ~bitwise Không, rằng tôi đã mất tích ...

Nó dài hơn một chút 92vì vậy tôi không cảm thấy quá tệ. Nhưng dù sao tôi cũng sẽ đặt nó vào như một nỗ lực thứ hai.

$argn là đầu vào từ dòng lệnh

Chạy như ống với -nR hoặc thử trực tuyến.

Hộp cát


Đối với tôi, dường như phiên bản đầu tiên của bạn sẽ ngắn hơn 4 byte nếu bạn sử dụng một hàm được đặt tên fthay vì gán một ẩn danh cho $f- function f(tiết kiệm 2 byte $f=function(và bạn lưu một byte khác mỗi lần bạn gọi f(...)thay vì $f(...). Ngoài ra, bạn có thể chụp $s, lưu 2 byte - ($i)use($s)dài hơn 4 byte ($i,$s), nhưng bạn lưu 3 byte cho mỗi cuộc gọi $f($i)thay vì $f($s,$i); trong các ngôn ngữ có chức năng chụp tự động, như JS, đây thường là một cách tiết kiệm khả thi, vì bạn không phải trả tiền phạt cho usetuyên bố.
IMSoP

Tôi đánh giá cao sự giúp đỡ, mặc dù tôi khá mới để chơi golf và không thực sự làm điều đó nhiều, tuy nhiên người ta cảm thấy nhàm chán trên các trang SO thông thường. Tôi đã nghĩ về việc sử dụng usenhưng nó cảm thấy lâu hơn, để làm điều đó $ilà năng động, nó sẽ phải được thông qua bằng cách tham khảo. Vì vậy, nó phải được use(&$i)$iphải được xác định trước khi chuyển nó bằng cách tham chiếu đến $f. Có nghĩa là đặt nó trong hàm cha hoặc trước bất kỳ hàm nào khác. Đối với chức năng nó có thể function s($s,$i)và chỉ cần biết nó phải được gọi với s($s,0) nhưng nó có vẻ xấu, và đó là xung quanh11 bytes, use(&$i),$i
ArtisticPhoenix

Chúng tôi có thể sử dụng $smặc dù và thay đổi \ntrở lại dòng thực. Điều đó giúp nó tăng lên 143 2 từ kết thúc dòng và 1 từ sử dụng
ArtisticPhoenix

Có, tôi thậm chí đã không cân nhắc việc đưa $ i vào sử dụng, bởi vì $ s cảm thấy việc nắm bắt "tự nhiên", nhưng nó luôn đáng để tính toán tiết kiệm ròng. Tuy nhiên, bạn vẫn có thể lưu 2 byte chỉ bằng cách khai báo một hàm được đặt tên fthay vì đóng: 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))." ";}Các hàm bổ sung như thế này được cho phép theo meta post này: codegolf.meta.stackexchange.com/questions/7614/,
IMSoP

Đã cập nhật, lưu một cặp vợ chồng
ArtisticPhoenix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.