ฉันทำยานอวกาศกระเพาะปลาแล้ว!


39

บทนำ:

แรงบันดาลใจจากความคิดเห็นนี้@MagicOctopusUrnบน@Emignaคำตอบ 05AB1E 'sสำหรับฉัน' มันเป็นเพียงข้อผิดพลาด ' ความท้าทาย :

8F9ÝÀNð×ý}».∊ฉันทำยานอวกาศกระเพาะปลาแล้ว! และฉันก็ตื่นเต้นกับการแนะนำการแก้ไขแบบ 12 ไบต์ - Magic Octopus Urn 17 กรกฎาคม '17 เวลา 20:10

โปรแกรม05AB1E (ดั้งเดิม) ตัวใดที่ทำให้เกิดผลลัพธ์นี้:

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

ลองออนไลน์

ท้าทาย:

อินพุต: สตริงที่ไม่ว่างเปล่า

เอาท์พุท: length - 1จากภายนอกจะเข้ามาเพิ่มอีกหนึ่งพื้นที่มากขึ้นระหว่างตัวละครแต่ละบรรทัดทุกที่คล้ายกันทำในการส่งออกดังกล่าวข้างต้นเท่ากับ ดังนั้นสำหรับอินพุต1234567890เอาต์พุตจะเป็นเช่นนี้แทน:

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

ทำไม? ความยาวของมี1234567890 10ดังนั้นเราเริ่มต้นด้วยการแสดงผล 10 บรรทัด: บรรทัดแรกโดยไม่มีช่องว่าง ที่สองที่มีตัวคั่นพื้นที่หนึ่ง; สามกับสอง; เป็นต้นและจากนั้น (โดยไม่ต้องมีบรรทัดกลางที่มีlength - 1ช่องว่างซ้ำกัน) เรากลับไปที่อินพุตเริ่มต้นในขณะที่ลง

กฏท้าทาย:

  • อินพุตรับประกันว่าไม่ว่างเปล่า (ความยาว>= 1) (สำหรับอินพุตอักขระเดี่ยวเราเพียงแค่แสดงตัวอักษรนั้น)
  • จำนวนช่องว่างต่อท้าย / นำหน้า / บรรทัดใหม่ใด ๆ ที่ได้รับอนุญาตตราบใดที่การส่งออกตัวเอง (ที่ใดก็ได้บนหน้าจอ) ถูกต้อง (บรรทัดว่างระหว่างบรรทัดเอาท์พุทยังไม่ได้รับอนุญาตด้วย)
  • ข้อมูลที่ป้อนจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้นยกเว้นช่องว่าง (ช่วงรหัสจุด[33, 126])
  • I / O ยืดหยุ่นได้ อินพุตอาจถูกใช้เป็น STDIN, อาร์กิวเมนต์หรือพารามิเตอร์ฟังก์ชัน อาจเป็นรายการ / อาร์เรย์ / สตรีมของอักขระแทนสตริง ผลลัพธ์อาจเป็นรายการ / อาร์เรย์ / สตรีมของอักขระแทนสตริง อาจถูกพิมพ์ไปยัง STDOUT; ส่งคืนเป็นสตริงที่คั่นด้วย newline; เป็นต้น

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

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
ได้รับเพียงแค่กระวนกระวายใจ !!! ยานอวกาศ !!!
WallyWest

1
ฉันรู้ว่าฉันรับรู้ผลลัพธ์นั้น ฉันรักว่าความคิดนี้ยังดำเนินต่อไป
Carcigenicate

2
TFW คุณรางรับรู้รูปแบบในคำถามแล้วรู้ว่ามันเป็นเพราะคุณไม่ได้ตั้งใจทำให้มันปีที่ผ่านมาಠ_ಠ ಠ⌣ಠ
Magic Octopus Urn

1
@ MagicOctopusUrn ขอบคุณสำหรับแรงบันดาลใจ ; D
Kevin Cruijssen

3
@KevinCruijssen ขอบคุณที่รักษาใบเสนอราคาโง่ ๆ ฮ่า ๆ !
Magic Octopus Urn

คำตอบ:


11

Japt , 8 6 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระส่งออกอาร์เรย์ของสตริง

£qYçÃê

ลองมัน


คำอธิบาย

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

ดั้งเดิม 8 ไบต์

I / O เป็นสตริง ใช้-Rธง รวมช่องว่างต่อท้ายในแต่ละบรรทัด

¬£múYÄÃê

ลองมัน

คำอธิบาย

             :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 อีกครั้ง :-)
ETHproductions

1
คำถามที่จริงจัง: เป็นไปได้ไหมที่จะค้นหาซ้ำ ๆ ผ่านทางแก้ปัญหาแบบยาวทั้งหมด 1 ถึง 6 ไบต์สำหรับปริศนาเช่นนี้
ฆา

2
@filip ไม่: มีมากกว่า 256 ** 6 = 281474976710656 (อย่างน้อยก็ไร้เดียงสา) มันเหมือนกับการเดารหัสผ่าน
Kirill Bulygin

3
@KirillBulygin มีวิธีที่เป็นไปได้มากกว่า 37 ล้านล้าน (37,764,717,485,592) ที่รวมตัวอักขระที่มีอยู่ใน Japt ให้เป็นสตริงระหว่างความยาว 1 และ 6 ตัวอักษร หากคุณรวมอักขระ 1 ไบต์อื่น ๆ ทั้งหมดซึ่งสามารถใช้ในตัวอักษรสตริงหรือสตริงที่บีบอัดตัวเลขนั้นจะเพิ่มขึ้นเป็นมากกว่า276ล้านล้าน (276,024,445,697,280) ดังนั้นไม่เขียนบอทเพื่อสร้างสิ่งเหล่านั้นจากนั้นกรองโปรแกรม Japt ที่ถูกต้องจากนั้นหาโปรแกรม (ถ้ามี) ที่ใช้งานได้สำหรับความท้าทายในมืออาจจะไม่เป็นไปได้ นอกจากความสนุกในการให้บอทเล่นกอล์ฟให้คุณแล้ว!
Shaggy

6
@Shaggy: "ที่ไหนที่สนุกในการให้บอทเล่นกอล์ฟให้คุณ?!" ถ้าคุณทำบอทสั้น ๆ จริง ๆ ล่ะ?
Oddthinking

11

R , 105 99 85 84 79 ไบต์

-6 ขอบคุณ @Kevin Cruissen และ @Giuseppe

-14 จากการเปลี่ยนเป็นวิธีการตาม regex

-1 ต้องขอบคุณ @Giuseppe

-5 ขอบคุณ @digEmALl

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

ลองออนไลน์!


คุณสามารถกอล์ฟ 1 in(r<-ไบต์โดยการเอาพื้นที่ที่
Kevin Cruijssen

1
และคุณใช้เพียงsครั้งเดียวเพื่อให้คุณสามารถใช้มันเป็นอาร์กิวเมนต์writeโดยตรง นำคุณลงไปที่99 bytes
Giuseppe

1
ที่ควรจะเป็น1มากกว่า""ในwrite? ฉันกำลังขุดการใช้ของMapคุณ!
Giuseppe


1
ผมเชื่อผมสามารถเอาชนะนี้ด้วยcollapseอาร์กิวเมนต์pasteแต่ก็ไม่ได้เกิดขึ้น ...
JDL

6

JavaScript (ES6), 53 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ

f=(s,p=i='',o=s.join(p)+`
`)=>s[++i]?o+f(s,p+' ')+o:o

ลองออนไลน์!



6

ถ่าน 10 ไบต์

Eθ⪫θ× κ‖O↓

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

ถ่านไม่ได้สะท้อนให้เห็นถึงสิ่งที่ต้องการ[ไป]- หรือเป็นที่คำสั่งแยกต่างหากอื่นได้หรือไม่
Magic Octopus Urn

@MagicOctopusUrn มีคำสั่งแยกต่างหากหากคุณต้องการแปลงการสะท้อนกลับ ดูcodegolf.stackexchange.com/a/127164ตัวอย่าง
Neil

ฉันคิดว่าฉันเคยเห็นมันสะท้อนมาก่อน แต่ไม่แน่ใจ เรียบร้อย!
Magic Octopus Urn

6

Canvas ขนาด 8 ไบต์

┐² ×*]──

ลองที่นี่!

7 ไบต์รุ่นเป็นสิ่งที่ดีเกินไปสำหรับความท้าทายนี้ ..


ฉันชอบเวอร์ชั่น 7 ไบต์ของคุณ คุณยินดีที่จะอธิบายวิธีการทำงานหรือไม่ ตัวดำเนินการใดที่ซ้อนทับทั้งสอง/เป็น a X?
Kaya

3
@Kaya เป็นอักขระตัวสุดท้าย - - แนวตั้ง palindromize palindromization ผ้าใบสิ่งที่ไม่เย็น ส่วนที่ทับซ้อนกันก็มีตัวของมันเองเช่นกัน
dzaima

6

Python 2 , 72 70 68 66 65 ไบต์

-2 ไบต์ขอบคุณ Kevin Cruijssen
-3 ไบต์ขอบคุณ ovs

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

ลองออนไลน์!


c==len(w)-1สามารถแข็งแรงเล่นกอล์ฟโดย 1 c+2>len(w)ไบต์ด้วย แก้ไข: ในรุ่น 70 ไบต์ใหม่ของคุณสามารถ0<c c
Kevin Cruijssen

6

05AB1E , 10 9 ไบต์

บันทึก 1 ไบต์ขอบคุณAdnan

εINð×ý}û»

ลองออนไลน์!

คำอธิบาย

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

Sคุณสามารถวาง อินพุตมีความยืดหยุ่นดังนั้นจึงอนุญาตให้ป้อนตามรายการได้
Kevin Cruijssen

1
@KevinCruijssen: รุ่นแรกของคุณคือ 9 ไบต์โดยเป็นแบบดั้งเดิมซึ่ง»สามารถละเว้นได้
Emigna

1
ขอใช้งานได้จริงในมรดกใน 9 ไบต์เช่นกันถ้าคุณลบ»และเปลี่ยนวงไปยังแผนที่v ε
Kevin Cruijssen

1
โพสต์คำตอบ ตอนนี้ Japt กำลังเต้นเราด้วย 6 ไบต์ฉันกลัว หรือคุณหมายถึงสั้นที่สุดใน 05AB1E (Elixir rewrite) และ 05AB1E (Python legacy) :)
Kevin Cruijssen

2
ไม่εINð×ý}û»ทำงาน?
Adnan


4

Japt , 9 8 ไบต์

-1 ไบต์จาก @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

ลองออนไลน์!


แดง; ดูเหมือนว่าคุณนินจาฉันอีกครั้ง! Lemme รู้ไหมถ้าคุณต้องการให้ฉันลบของฉัน
ขนปุย

1
@Shaggy ไม่ให้คำตอบของคุณคุณกำลังใช้อาร์เรย์เป็นอินพุตในขณะที่ฉันใช้สตริงดังนั้นพวกเขาจึงเป็น xD ที่แตกต่างกัน
Luis felipe De jesus Munoz

1
SpX-> สำหรับการบันทึก 1 ไบต์
Shaggy

4

PowerShell , 66 54 ไบต์

-12 ไบต์ต้องขอบคุณเขา

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

ลองออนไลน์!

รับอินพุตผ่านการกระจายซึ่งใน TIO จะแสดงว่าเป็นอาร์กิวเมนต์บรรทัดคำสั่งที่แยกต่างหากสำหรับแต่ละอักขระ

ก่อนอื่นเราตั้งค่า$a=$argsเป็นอาร์กิวเมนต์อินพุต จากนั้นเราตั้งค่า$xเท่ากับ.countอาร์เรย์-1นั้น จากนั้นเราต้องวนรอบตัวอักษรเพื่อสร้างยานอวกาศ ทำได้โดยการสร้างช่วงจาก0ถึง$xจากนั้น$xย้อนกลับไปที่0จากนั้นใช้Get-Uniqueเพื่อดึงเฉพาะช่วงที่เหมาะสม

การวนซ้ำแต่ละครั้งเรานำอาร์กิวเมนต์การป้อนเข้าของเรามา-joinรวมกับช่องว่างที่เกี่ยวข้อง แต่ละสตริงเหล่านั้นจะถูกปล่อยไว้ที่ไพพ์ไลน์และนัยก็Write-Outputให้เราขึ้นบรรทัดใหม่ได้ฟรีเมื่อโปรแกรมเสร็จสมบูรณ์


ลองนี้:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy อะไรนะ ... มันมีวิธีGet-Uniqueทำงานอย่างไรในช่วงนี้? มันบ้ามาก! ขอบคุณ!
AdmBorkBork

4

05AB1E (ดั้งเดิม) 9 ไบต์

εINúíJ}û»

อินพุตเป็นรายการของอักขระ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ε     }    # 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 ยังนี้ไม่ถูกต้องเพราะกระจกเปลี่ยนแปลงทิศทางของ / เพื่อ \ เมื่อสะท้อนเช่นเดียวกับ[, ]และ,( )อาจต้องการเพิ่มกรณีเหล่านั้นเพื่อจับถ่านด้วย (ย้ายความคิดเห็นอื่น ๆ ไปยังคำตอบของ Emigna เพราะเขาเป็นคำตอบที่ฉันพูดถึงในตอนแรก)
Magic Octopus Urn

@ MagicOctopusUrn ขอบคุณที่แจ้งให้เราทราบ คงที่โดยใช้แทนû» .∊
Kevin Cruijssen

4

Haskell , 60 59 ไบต์

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

ลองออนไลน์!

คำอธิบาย

สำหรับสตริง (เช่น"abc") เราจะสมัครก่อน

scanl (?) <*> tail

ซึ่งเหมือนกับ

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

สิ่งนี้ใช้ซ้ำ ๆ(?)(ผนวกช่องว่างกับอักขระแต่ละตัวในช่วง[33 .. ] ) strจนกระทั่งมีสตริงจำนวนมากที่strมีอักขระ:["abc","a b c ", "a b c "]

ตอนนี้เราเพียงต้องการเชื่อมผลลัพธ์ (ลบองค์ประกอบสุดท้าย) ด้วยส่วนเคาน์เตอร์ตรงกันข้าม:

init<>reverse

4

MATL , 25 22 13 ไบต์

zZv"Gtz@he!1e

ลองออนไลน์!

ขอบคุณLuis Mendo ที่แนะนำกอล์ฟขนาด 5 ไบต์ซึ่งเป็นแรงบันดาลใจให้ฉันโกนหนวดออกไปอีก 4 ไบต์!

คำอธิบายพร้อมอินพุตตัวอย่าง'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

เยลลี่ขนาด 9 ไบต์

jⱮLḶ⁶ẋƲŒḄ

ลองออนไลน์!

ส่งคืนรายการบรรทัด เอาท์พุท prettified กว่า TIO


แตกต่างกันบ้าง ,€⁶$LСŒḄ9: อื่น ๆ ที่คล้ายกันมากขึ้น 9 ของ: J’⁶ẋŒḄɓjⱮและJ’⁶ẋŒḄjⱮ@(ฉันกำลังมองหาที่สั้นกว่า แต่ยังไม่มีความสุข)
Jonathan Allan

@JonathanAllan ผมค่อนข้างมั่นใจว่านี้เป็นที่ดีที่สุดผมไม่คิดว่ามีวิธีใดที่จะเขียนสั้นหรือLḶ⁶ẋ ŒḄอย่างไรก็ตามถ้าคุณจัดการเพื่อหาบันทึกทำ ping ฉัน :-)
Erik the Outgolfer

คิดเกี่ยวกับมันเล็กน้อยของฉัน,€⁶$LСŒḄอาจไม่ถูกต้องเพราะมันมีการทำรังอย่างบ้าคลั่งดังนั้นอาจต้องใช้Yและเป็นโปรแกรมเต็มรูปแบบ
Jonathan Allan

@ Jonathanathan Allan Yeah แน่นอนว่าไม่ใช่ ['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']]]], '!']อย่างน้อยฉันก็แซงหน้า 05AB1E ...
Erik the Outgolfer

ฉันบอกว่าฉันแซงหน้า 05AB1E ใช่มั้ย เฮ้ไม่ได้อีกแล้ว : /
Erik the Outgolfer


3

Stax , 10 ไบต์

Ç·9ƒù▌╘Ä┘e

เรียกใช้และแก้ไขข้อบกพร่อง

ส่งออกด้วยช่องว่างต่อท้ายในแต่ละบรรทัด

คำอธิบาย:

%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 ไบต์

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

ลองออนไลน์!


1
l-Math.abs(i)สามารถเล่นกอล์ฟได้ถึงi<0?l+i:l-i2 ไบต์
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! :)
Olivier Grégoire

มันจะเป็นl-i<0?-i:iอย่างไร
Quintec

@ thecoder16 คุณจะต้องใช้วงเล็บ: l-(i<0?-i:i)(12 ไบต์)
Jonathan Frech

3

K (oK) , 25 24 ไบต์

วิธีการแก้:

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

ลองออนไลน์!

คำอธิบาย:

พอร์ตของโซลูชัน 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 (')

หมายเหตุ:

  • -1 ไบต์ขอบคุณ ngn

1
,:'-> +,
NGN


2

PHP, 88 89 ไบต์

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

ต้องใช้ PHP 5 str_splitหรือสูงกว่าสำหรับ ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


ลิงก์ลองออนไลน์ของคุณให้ผลลัพธ์ที่ไม่ถูกต้องฉันกลัว ในเอาต์พุตของคุณบรรทัดทั้งหมดยังมีช่องว่างนำหน้าแทนที่จะเป็นระหว่างอักขระเท่านั้น อักขระตัวแรกควรอยู่ในคอลัมน์เดียวกันในเอาต์พุต
Kevin Cruijssen

1
@KevinCruijssen ไม่ได้ดูผลลัพธ์ใกล้พอ แก้ไขแล้ว. (แม้ว่าฉันจะเอาท์พุทก่อนหน้าของฉันดูเหมือนจรวด) ;-)
ติตัส

มันดูเหมือนหัวของลูกธนูกับฉัน : D แต่ +1 ทันทีว่าได้รับการแก้ไขแล้ว
Kevin Cruijssen

หากคุณวางขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงแทน \ n คุณประหยัดไบต์ :)
Martijn

@ Martinij ฉันจริง ๆ แล้วนับหนึ่งไบต์เท่านั้น ... ลืมที่จะแทนที่เมื่อฉันวางรหัสที่นี่
ติตัส

2

K4 , 23 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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"

คำอธิบาย:

มีช่องว่างต่อท้ายในแต่ละบรรทัด

,/'(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 ไบต์

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

ลองออนไลน์!


สวัสดี. ปัจจุบันคำตอบของคุณคือตัวอย่างข้อมูลแทนที่จะเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ สิ่งนี้สามารถถูกแก้ไขได้โดยการเพิ่มs=>{ก่อนและ}หลังเพื่อให้เป็นฟังก์ชันแลมบ์ดา นอกจากนี้สิ่งหนึ่งที่ต้องตีกอล์ฟก็คือการถอดตัวยึดรอบ ๆ วงแหวนสำหรับวง ลองออนไลน์
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! ลืมแก้ไขก่อนโพสต์ ...
RobIII

2

สกาลา , 82 ไบต์

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

ลองออนไลน์

สกาล่ามีทางลัดมากมายที่ช่วยฉันที่นี่และอ่านได้ง่าย! ลองสกาล่า


สวัสดียินดีต้อนรับสู่ PPCG! แม้ว่ามันจะเป็นคำตอบที่ดี แต่ฉันก็กลัวว่าสองสิ่งนั้นไม่ถูกต้อง บรรทัดที่มีช่องว่างมากที่สุดควรส่งออกครั้งเดียวในช่วงกลางแทนสองครั้ง และขณะที่คุณพิมพ์จาก0การlengthปริมาณของพื้นที่แทนการ0ที่จะlength-1มีจำนวนของช่องว่าง ฉันไม่ทราบว่าสกาล่าดีเกินไป แต่ดูเหมือนคุณสามารถแก้ไขปัญหาทั้งสองด้วย +4 ไบต์ (รวม 86 ไบต์) เช่นนี้: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)ยินดีต้อนรับอีกครั้งและสนุกกับการเข้าพักของคุณ! :)
Kevin Cruijssen

2

Oracle SQL ขนาด 115 ไบต์

ไม่ใช่ภาษากอล์ฟ แต่ ...

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

สมมติว่าค่าอยู่ในคอลัมน์vของตารางt:

ซอ Fiddle

การตั้งค่า Schema ของ Oracle 11g R2 :

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

แบบสอบถาม 1 :

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

ผลลัพธ์ :

(SQLFiddle พิมพ์ค่าจัดชิดขวาในคอลัมน์ด้วยเหตุผลบางอย่าง ... ไม่มีช่องว่างนำหน้า)

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

ดูเหมือนว่าผลลัพธ์ของ SQL Fiddle ของคุณจะมีช่องว่างระหว่างตัวอักษรเท่านั้นหรือ ดูภาพหน้าจอนี้ ฉันคิดว่านี่เป็นเพราะ SQL Fiddle และมันทำงานในพื้นที่ได้หรือไม่ Btw ไม่แน่ใจว่า SQL ใช้กฎ regex มาตรฐาน แต่สามารถเล่น(.)กอล์ฟได้.โดยใช้\0แทนที่จะเป็น\1เช่นที่คุณทำใน Java ใช่ไหม แก้ไข: ไม่เป็นไรสำหรับ$0ใช่ไม่ใช่\0.. ( ตัวอย่าง Java ของสิ่งที่ฉันหมายถึง )
Kevin Cruijssen

1
@KevinCruijssen คลิกที่ลูกศรลงถัดจากปุ่ม "Run SQL" และเปลี่ยนผลลัพธ์เป็น "Plaintext Output" หรือ "Markdown Output" และคุณจะเห็นช่องว่าง
MT0

ขอบคุณ มันดูดีในกรณีนี้จริง ๆ !
Kevin Cruijssen

2

รหัสเครื่อง 8086, 56 53 ไบต์

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

ประกอบจาก:

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:

กรณีทดสอบ:

ภาพหน้าจอ


สวัสดี. ฉันเดาว่าจะไม่มีการรวบรวมออนไลน์สำหรับรหัสเครื่อง 8086 แต่คุณสามารถเพิ่มภาพหน้าจอของผลลัพธ์สำหรับหนึ่งในกรณีทดสอบได้หรือไม่ จากนั้นฉันสามารถตรวจสอบว่าทุกอย่างถูกต้อง :)
Kevin Cruijssen

เสร็จสิ้น นอกจากนี้ยังได้ตัดทิ้งอีกหนึ่งไบต์ :)
user5434231

ขอบคุณสำหรับภาพหน้าจอ! น่าเสียดายที่มีข้อผิดพลาดเล็กน้อยในผลลัพธ์ บรรทัดกลางตอนนี้มีlengthจำนวนช่องว่างและมีทั้งหมด 9 บรรทัด แต่บรรทัดกลางควรมีlength-1จำนวนช่องว่างและควรมีจำนวน 7 บรรทัดแทน (สำหรับคำ 4 ตัวอักษร 'test'`) .. : (ผมหวังว่ามันจะไม่ได้มีราคาแพงในแง่ของไบต์แก้ไข?
เควิน Cruijssen

1
โอ้ฉันเห็นแล้ว ตอนนี้ได้รับการแก้ไขแล้วฉันยังลดลงอีกหนึ่งไบต์
user5434231

2

Haskell, 64 60 59 ไบต์

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

ลองออนไลน์!

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 ไบต์

-5 & -3 ขอบคุณKevin Cruissen

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

ลองออนไลน์!


หมายเหตุว่าตั้งแต่\เป็นถ่านเปลือกหนีกรณีทดสอบ)}/\ควรจะใส่กับพิเศษเช่นนี้\)}/\\


สวัสดี. เป็นไปได้หรือไม่ที่จะเพิ่มTIO-linkพร้อมกรณีทดสอบ? นอกจากนี้ฉันไม่รู้จัก Bash เป็นอย่างดี แต่สามารถลบช่องว่างหลังจากinและprintfชอบใน Python ได้หรือไม่
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณดูคำตอบที่แก้ไขแล้ว ฉันใหม่เพื่อติ้วลิงค์อย่างไรและผมไม่แน่ใจว่าจะใช้กรณีทดสอบหลายตั้งแต่นี้bashรหัสเฉพาะปัจจัยการผลิตสตริง ( เช่นเพียงหนึ่งบรรทัด) กรณีทดสอบการทำงานทั้งหมดอย่างไรก็ตามแม้ว่า จะต้องเป็นคนเดียวที่ยกมาเช่นนี้ ช่องว่างหลังจากและมีความจำเป็น )}/\ <<< ')}/\' read s; ...etc.inprintf
agc

ขอบคุณ และกรณีทดสอบเดียวสำหรับ TIO ก็โอเค ส่วนใหญ่จะเป็นการตรวจสอบว่าทุกอย่างทำงานได้ตามที่คาดไว้หรือไม่ +1 จากฉัน :)
Kevin Cruijssen

1
ในรุ่นใหม่ของคุณคุณสามารถกอล์ฟ 5 ไบต์มากขึ้นเช่นนี้ ช่องว่างหลังจากforและdoสามารถลบได้ สามารถเปลี่ยนเป็นf=1 c=f=1และสามารถf=f+c f+=c
Kevin Cruijssen

1
โอ้อีกสิ่งหนึ่งสำหรับกอล์ฟ ไม่แน่ใจว่ามันเป็นไปได้ในการทุบตี แต่เห็นได้ชัดว่ามันเป็น (เหตุผลหนึ่งที่มากขึ้นว่าทำไมติ้วเชื่อมโยงเป็นประโยชน์;)) เป็นโดยการเปลี่ยนf!=0ไปfในสำหรับวง เช่นเดียวกับใน JavaScript และ Python 0จะมีความผิดพลาดและจำนวนเต็มบวก / ลบอื่น ๆ ทั้งหมดนั้นเป็นความจริงใน Bash
Kevin Cruijssen

2

Perl 6 , 43 ไบต์

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

ลองออนไลน์!

ส่งคืนรายการบรรทัด

คำอธิบาย:

 {                                         }  # 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 ไบต์

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

ลองออนไลน์!

-20 ไบต์ต้องขอบคุณแมวป่า !

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

ลองออนไลน์!

หรือหากความยาวสามารถยอมรับได้เป็นพารามิเตอร์:

C (gcc), 105 102 ไบต์

-1 ไบต์ขอบคุณไปที่ catcat!

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

ลองออนไลน์!


@ceilingcat huh!
Conor O'Brien

1
ในสนามกอล์ฟขนาด 102 ไบต์ของคุณฉันคิดว่าโลกxนี้มีเงาและมีการประกาศซ้ำซ้อน
Jonathan Frech

2

PHP, 148 146 143 141 ไบต์

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

คุณสามารถทดสอบได้ดังนี้:

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

เอาท์พุต

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

Sandbox

รุ่นขยาย

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

ลอง 2, 92 ไบต์

หลังจากเห็น @Titus คำตอบฉันลดของฉันไปที่นี้:

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

ฉันพยายามคิดวิธีใช้ 1 loop แทนที่จะเป็น 2 ... เชื่อหรือไม่ฉันแทบไม่เคยใช้forloop ในรหัส "ของจริง" มันเป็น~บิตที่ไม่ใช่ว่าฉันหายไป ...

มันนานกว่านี้นิดหน่อย92ดังนั้นฉันจึงไม่รู้สึกแย่ขนาดนั้น แต่ฉันจะใส่มันในความพยายามครั้งที่สองต่อไป

$argn คืออินพุตจากบรรทัดรับคำสั่ง

เรียกใช้เป็นไพพ์ด้วย -nR หรือลองออนไลน์

Sandbox


ดูเหมือนว่าผมว่ารุ่นแรกของคุณจะสั้นกว่า 4 ไบต์ถ้าคุณใช้ฟังก์ชั่นการตั้งชื่อfแทนของการกำหนดอย่างใดอย่างหนึ่งที่ไม่ระบุชื่อ$f- function f(ช่วยประหยัด 2 ไบต์มากกว่า$f=function(และคุณประหยัดไบต์อีกทุกครั้งที่คุณโทรแทนf(...) $f(...)หรือคุณสามารถจับภาพ$sประหยัด 2 ไบต์ - ($i)use($s)4 ไบต์นานกว่า($i,$s)แต่คุณประหยัด 3 ไบต์สำหรับการโทรแต่ละที่จะ$f($i)แทน$f($s,$i); ในภาษาที่มีการจับภาพอัตโนมัติเช่นเดียวกับ JS สิ่งนี้จะประหยัดได้มากกว่าเพราะคุณไม่ต้องจ่ายค่าปรับของuseคำสั่ง
IMSoP

ฉันซาบซึ้งในความช่วยเหลือฉันค่อนข้างใหม่ในการเขียนโค้ดกอล์ฟและไม่ได้ทำสิ่งนั้นมากจริงๆใคร ๆ ก็เบื่อกับหน้า SO ปกติ ฉันคิดเกี่ยวกับการใช้useแต่มันรู้สึกได้นานกว่าการทำความรู้สึก$iนั้นเป็นแบบไดนามิกมันจะต้องถูกส่งผ่านโดยการอ้างอิง ดังนั้นมันจะต้องมีuse(&$i)และจะต้องมีการกำหนดไว้ก่อนที่จะผ่านได้โดยการอ้างอิงถึง$i $fซึ่งหมายความว่าการตั้งค่าในฟังก์ชั่นผู้ปกครองหรือก่อนอื่น ๆ สำหรับฟังก์ชั่นอาจเป็นได้function s($s,$i)และเพิ่งรู้ว่ามันต้องถูกเรียกใช้ด้วยs($s,0) แต่ดูเหมือนว่าน่าเกลียดและนั่นคือรอบ11 bytes, use(&$i),$i
ArtisticPhoenix

เราสามารถใช้$sแม้ว่าและเปลี่ยน\nเป็นผลตอบแทนบรรทัดที่แท้จริง นั่นทำให้มันเป็น143 2 จากการสิ้นสุดของบรรทัดและ 1 จากการใช้
ArtisticPhoenix

ใช่ฉันไม่ได้คิดว่าจะนำ $ i ไปใช้เพราะ $ s รู้สึกถึงการจับ "เป็นธรรมชาติ" แต่มันก็คุ้มค่าที่จะคำนวณการประหยัดสุทธิ อย่างไรก็ตามคุณยังสามารถบันทึก 2 ไบต์โดยเพียงแค่ประกาศฟังก์ชั่นที่มีชื่อfแทนการปิด: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))." ";}อนุญาตให้ใช้ฟังก์ชันพิเศษเช่นนี้ได้ตามการประกาศของเมตา: codegolf.meta.stackexchange.com/questions/7614/ …
IMSoP

อัปเดตบันทึกคู่รัก
ArtisticPhoenix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.