วาด S-Chain


27

พื้นหลัง

เมื่อฉันยังเด็กฉันถูกสอนวิธีการวาดรูปร่าง "S" แปลก ๆ ที่ฉัน (พร้อมกับเพื่อนร่วมชั้น) พบว่ามีเสน่ห์ วันนี้ฉันได้ค้นพบมันอีกครั้งและเนื่องจากวิธีการเขียนแบบสูตรที่เป็นรูปเป็นร่างจึงคิดว่ามันอาจนำไปสู่ความท้าทายที่น่าสนใจ: P

การวาด "S"

S สามารถวาดได้โดยทำตามขั้นตอนง่าย ๆ เหล่านี้:

ก่อนอื่นให้วาด 2 แถวสามบรรทัดในแนวดิ่ง

| | |

| | |

ถัดไปเชื่อมต่อสายซ้ายบนกับเส้นกลางล่างและตรงกลางด้านบนด้วยเส้นล่างขวาเพื่อสร้าง

| | |
 \ \
| | |

ในที่สุดก็ให้วาดบนและล่างลงบนภาพที่วาดในปัจจุบันเพื่อให้มันดูเป็นแบบนั้น

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

อย่างที่คุณเห็นผลลัพธ์นี้มีรูปร่าง "S" อย่างไรก็ตามเมื่อขยาย (วาดด้วยแถวมากกว่า 2 แถว) จะสร้างรูปแบบที่น่าสนใจมาก งานของคุณคือการทำซ้ำรูปแบบที่น่าสนใจนี้

งาน

รับจำนวนเต็มที่n >= 2ส่งออก S กับnแถวที่จะทำจากมัน เอาต์พุตอาจถูกส่งคืนจากฟังก์ชันและอินพุตอาจถูกใช้ในวิธีมาตรฐาน การลาก / เว้นวรรคนำหน้าสำหรับทั้งภาพรวมและแต่ละบรรทัดถือว่าใช้ได้ อย่างไรก็ตามช่องว่างของเส้นนำต้องสอดคล้องกันเพื่อให้ "ไม่เสียคุณอาจส่งออกเป็นรายการของบรรทัด

กรณีทดสอบ

input
output
---

2

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

---

8
  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

---

10

  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

นี่คือสั้นที่สุดที่จะชนะ! โชคดี,


13
วิกิพีเดียเรียกเย็น S , และเรียกร้องรุ่นที่ไม่มีที่สิ้นสุดของนั้นSS Chain
สตีเฟ่น

เราสามารถส่งออกเป็นรายการบรรทัดได้หรือไม่?
Mr. Xcoder

@ Mr.Xcoder คุณอาจ
coinairingaahing ที่

@ สตีเฟ่น 10 นาที googling และนี่ไม่ได้เกิดขึ้น ฉันจะแก้ไขชื่อของคำถาม
caird coinheringaahing

@cairdcoinheringaahing ฉันค้นหาภาพที่อาจเป็นไปได้: P
Stephen

คำตอบ:



10

C # (. NET Core) , 73 69 66 64 62 ไบต์

สองไบต์น้อยลงและมีลักษณะเหมือน perl ต้องขอบคุณ Barodus ไม่คิดว่าจะใช้ int ใช่ไหม สำหรับ nulls

n=>$@"  ^
 / {string.Join(@"\
| | |
 \ ",new int?[++n])}/
  v"

ลองออนไลน์!


1
หากนี่คือสนามกอล์ฟของคำตอบ C # ที่มีอยู่ฉันก็จะไม่สามารถบอกได้ ทำได้ดีมาก :-)
ETHproductions

คุณสามารถอธิบายสิ่งที่new string[n+1]ทำ? ฉันไม่เคยเห็นมันมาก่อน
เอียนเอช

สร้างอาร์เรย์ของสตริงว่าง AFAIK ฉันใช้แฮ็คที่มีสตริงเข้าร่วมหรือที่รู้จักเข้าร่วม {"", "", "", "} กับตัวคั่น" \ \ n | | | \ n \ "
คำสรรพนามของฉันคือ monicareinstate

@someone Woah ฉันไม่เคยยอมรับเคล็ดลับนี้มาก่อน เจ๋งจริงๆ! (ยังไม่ดีของฉันฉันแม้ new string[n+1]เป็นชนิดบางส่วนของตัวสร้างสตริงยุ่งยากและไม่ได้การประกาศอาร์เรย์ -.-)
เอียนเอช

6

Python 3 , 48  56 59 61 ไบต์

lambda k:'  ^\n / %s/\n  v'%('\\\n| | |\n \ '*k)

ลองออนไลน์!


คุณสามารถบันทึก 2 ไบต์ได้ด้วยการยกเลิกการลบเครื่องหมายแบ็กสแลชโลน
L3viathan

@ L3viathan เพิ่งอัปเดตด้วย
Mr. Xcoder


@ L3viathan นั่นไม่ถูกต้อง \ \พิเศษ
Mr. Xcoder

ใน TIO: ใช่ ใน terminal ของฉัน: ไม่
L3viathan

6

05AB1E , 27 26 ไบต์

…^
/ð"\
| | |
\ "I×…/
vJ.c

ลองออนไลน์!

รุ่นสำรอง 27 ไบต์

'^…/ \©IF…| |û…\ \}\®R'v».c

ลองออนไลน์!

คำอธิบาย

'^                             # push "^"
  …/ \©                        # push "/ \" and store a copy in register
       IF                      # input times do:
         …| |û                 # push "| | |"
              …\ \             # push "\ \"
                  }            # end loop
                   \           # discard top of stack (the extra "\ \")
                    ®R         # push "/ \" reversed = "\ /"
                      'v       # push "v"
                        »      # join stack on newlines
                         .c    # center each row

5
รหัสของคุณดูเหมือนช้างสำหรับฉัน :)
Wojowu

มันช่างน่ากลัวแค่ไหนที่คำตอบของฉันใกล้เคียงกับคุณมากแค่ไหน'^…/ \©IF„| ûû„\ û}\®R'v).Cโดยไม่ได้มอง
Magic Octopus Urn

6

Japt , 34 25 23 ไบต์

" ^ /{ç'\²i|³1}/ v"¬¸ò5

ทดสอบออนไลน์! เอาต์พุตเป็นอาร์เรย์ของบรรทัด -Rเพิ่มการตั้งค่าสถานะเพื่อเข้าร่วมในการขึ้นบรรทัดใหม่แล้ว (ขอบคุณ @Shaggy)

ความพยายามครั้งที่สองครั้งแรกอาจเป็นไปไม่ได้ ...

มันทำงานอย่างไร

" ^ /{ ç'\²  i |³  1}/ v"¬ ¸  ò5
" ^ /{Uç'\p2 i'|p3 1}/ v"q qS ò5   Ungolfed
                                   Implicit: U = input number
        '\p2                       Repeat a backslash twice, giving "\\".
             i     1               Insert at index 1
              '|p3                   3 vertical bars. This gives "\|||\".
      Uç                           Make U copies of this string. U = 2: "\|||\\|||\"
" ^ /{              }/ v"          Insert this into this string.    " ^ /\|||\\|||\/ v"
                         q qS      Split into chars; join on spaces."  ^   / \ | | | \ \ | | | \ /   v"
                              ò5   Split into rows of length 5.    ["  ^  "," / \ ","| | |"," \ \ ","| | |"," \ / ","  v"]
                                   Joining on newlines gives "  ^  
                                                               / \ 
                                                              | | |
                                                               \ \
                                                              | | |
                                                               \ /
                                                                v"

ตีถ่านและผูก SOGL? เยี่ยมมาก!
Shaggy

คุณสามารถส่งออกอาร์เรย์ของบรรทัดโดยวิธีการดังนั้นคุณสามารถทิ้ง 2 อักขระสุดท้าย
Shaggy

@Shaggy เยี่ยมมากตอนนี้เราชนะแล้ว!
ETHproductions

เราได้รับการทำดีเมื่อเร็ว ๆ นี้ :)
ปุย

6

SOGL V0.12 , 26 25 18 ไบต์

°I-‘*"∑ūCƨΩ)¹‘@∑5n

ลองที่นี่!

ใช้กลยุทธ์เดียวกันกับคำตอบ Japt ของ ETHproductions

คำอธิบาย:

..‘           push "\|||\"
   *          repeat input times
    "..‘      push " ^ /ŗ/ v ", with ŗ replaced with POP. The reason why there's a trailing
              space is because otherwise it didn't have enough repeating characters to compress
        @∑    join with spaces
          5n  split to line lengths of 5

2
push "|" and " "สิ่งที่เป็นตัวสร้างห่า
สตีเวนเอช

1
@StevenHewitt เหล่านั้นเป็นสองอิน แต่ฉันเข้าร่วมด้วยกัน (เหมือนที่ฉันทำกับสิ่งอื่น) เพราะฉันไม่คิดว่ามันไม่จำเป็นที่จะต้องแยกสิ่งต่าง ๆ ที่จะถูกนำมาใช้ร่วมกันในไม่ช้า
dzaima

5

JavaScript (ES6), 60 ไบต์

n=>`  ^
 / \\
${`| | |
 \\ \\
`.repeat(n-1)}| | |
 \\ /
  v`

ตัวอย่างการทดสอบ


1
57: n=>' ^\n /${' \\ \\\n| | |\n'.repeat(n).slice(2)} \\ /\n v'(ใช้ backticks และขึ้นบรรทัดใหม่ตามตัวอักษร)
edc65

5

ถ่าน , 27 26 25 ไบต์

-1 ไบต์ขอบคุณ Carlos Alejo -1 ไบต์ต้องขอบคุณ ASCII-only

  ^⸿ / ×\⸿| | |⸿ \ N/⸿  v

ลองออนไลน์! ลิงก์คือเวอร์ชัน verbose # ถ่าน verbose-obfucation


1
คุณสามารถบันทึก 1 ไบต์เพียงแค่เรียกใช้พิมพ์ (แทนที่จะเพิ่มสตริง) และใช้\r: `^ ⸿ / × \ ⸿ | | | ⸿ \ Iθ / ⸿ v` รุ่นอย่างละเอียด
Charlie

อ่า ... ฉันจะต้องจำไว้\rว่าวิธีการที่จะได้บรรทัดใหม่อย่างมีสติ ขอบคุณ!
สิ้นเชิง


@ ASCII เท่านั้น: P -
เต็มเปามนุษย์

4

Perl 5 , 39 37 ไบต์

say"  ^
 / ".'\
| | |
 \ 'x<>."/
  v"

ลองออนไลน์!

โกนสองไบต์ด้วยคำแนะนำของ @DomHastings


หากคุณใช้เครื่องหมายคำพูดเดี่ยวคุณไม่จำเป็นต้องหลบหลีกแบ็กสแลชอีกต่อไปสำหรับ -2! :)
Dom Hastings




3

C # (.NET แกน) , 101 77 73 ไบต์

บันทึก 24 ไบต์ขอบคุณi cri everytim !
บันทึกแล้ว 4 ไบต์ขอบคุณKevin Cruijssen !

n=>{var s="  ^\n / ";for(;n-->0;s+="\\\n| | |\n \\ ");return s+"/\n  v";}

ลองออนไลน์!

ตามปกติการทำซ้ำสตริงใน C # เป็นความเจ็บปวด



@icrieverytim Ahhh แน่นอนนั่นเป็นวิธีที่ดีกว่า
เอียนเอช

คุณสามารถเปลี่ยน--n>=0ไปn-->0และs+="/\n v";return s;เพื่อreturn s+"/\n v";ที่จะบันทึกไบต์บาง
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณแก้ไขแล้ว!
เอียนเอช

3

เรติน่า , 38 ไบต์

.+
$*
1
¶|||¶x\\
^
 ^¶x/\
.$
/¶ v
x?
 

ลองออนไลน์!

พิมพ์คอลัมน์ของช่องว่างนำหน้าและบนพื้นที่ต่อท้ายในแต่ละบรรทัด

คำอธิบาย

การประหยัดไบต์หลักมาจากการเว้นช่องว่างในทุกส่วนที่เป็นตัวอักษรและแทรกในตอนท้าย รูปมีโครงสร้างแบบที่ไม่เคยมีสองช่องว่างติดกันดังนั้นถ้าเราเพิ่งลบออกทั้งหมดเราเกือบจะสามารถแก้ไขรูปร่างได้ด้วยการแทรกช่องว่างที่ตำแหน่งทุกจุดในตอนท้าย:

^
/\
|||
\\
|||
\/
v

กลายเป็น:

 ^ 
 / \ 
 | | | 
 \ \ 
 | | | 
 \ / 
 v 

เกือบจะถูกต้องยกเว้นการเยื้อง ^และvจะหายไปสองช่องว่าง จริง ๆ แล้วง่ายต่อการแก้ไขเพราะถ้าเราเพิ่งแทรกช่องว่างที่ชัดเจนต่อหน้าพวกเขาแต่ละคนนั่นจะส่งผลให้มีช่องว่างเพิ่มเติมสองในตอนท้าย เส้นที่มีสแลชนั้นมีความซับซ้อนกว่าเพราะต้องการพื้นที่เพิ่มเพียงหนึ่ง ในการแก้ไขปัญหานี้เราได้ใส่ตัวยึดตำแหน่งไว้ที่นั่น ( x) เมื่อเราใส่ช่องว่างในตอนท้ายเราไม่ได้ใส่แค่พวกเขาสำหรับการแข่งขันทุกที่ว่างเปล่า xแต่เราเลือกที่ตรงกับ นั่นหมายความว่าแทนที่จะใส่พื้นที่ในด้านหน้าของxที่xตัวเองได้รับการแทนที่ xและแล้วเราก็จะยังคงเป็นการแข่งขันทางด้านขวาที่ว่างเปล่าหลังจากที่ นั่นหมายถึงทุกคนxเพิ่มหนึ่งช่องว่างโดยไม่เปลี่ยนสิ่งอื่นใด ดังนั้นสิ่งที่เราต้องการตั้งค่าคือ:

 ^
x/\
|||
x\\
|||
x\/
 v

ซึ่งจะให้ผลลัพธ์ที่ต้องการ ดังนั้นนี่คือรหัส:

.+
$*

แปลงอินพุตเป็น unary

1
¶|||¶x\\

แปลงแต่ละ1บรรทัดเป็นสองบรรทัดด้วย|||และx\\(และ linefeed ชั้นนำ)

^
 ^¶x/\

Inser สองบรรทัดแรกด้วยและ^x/\

.$
/¶ v

แก้ไขครั้งสุดท้ายx\\โดยการหมุนที่ผ่าน\เข้ามาในและท้ายสอดคล้องกับที่/v

x?
 

แทนที่การxจับคู่แต่ละอันหรือเปล่าด้วยช่องว่าง


วิธีการเรียบร้อย ฉันพยายามหาวิธีใช้ join-on-space สำหรับโซลูชัน Pip ของฉัน แต่มันก็ไม่ได้ผลนักเนื่องจากจำนวนช่องว่างนำหน้าในแถวต่างกัน
DLosc


2

Pyth, 40 ไบต์

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v

ค่อนข้างคล้ายกับของ Steven Hewitt แต่พัฒนาอย่างอิสระ

ลองออนไลน์

คำอธิบาย

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v
K" / \ ""                                 Set K = " / \ "
        "  ^"                       "  v  Draw the end points.
             K                    _K      Draw the slants.
                         *Q]*3"| "        Draw the vertical bars...
              j+b+*2+d\\b                 ... interspersed with slants.


2

เรติน่า 45 ไบต์

นี่เป็นวิธีแก้ปัญหาที่ง่ายมาก

.+
$*
^1
  ^¶ /x
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

ลองออนไลน์

หากงานศิลปะสามารถจัดทำดัชนี 1 ชิ้นได้ก็จะสั้นลงเล็กน้อย (44 ไบต์):

.+
  ^¶ /x$0$*1
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

2

Pip , 45 42 33 ไบต์

"  ^
 / "."\
| | |
 \ "Xa."/
  v"

ลองออนไลน์!

คำอธิบาย

รหัสนั้นง่ายมากแม้ว่าบรรทัดใหม่จะทำให้อ่านยากขึ้น นี่เป็นวิธีที่ดีกว่าในการดูโครงสร้าง:

"prefix" . "repeated" X a . "suffix"

องค์ประกอบซ้ำใน S-chain คือ

   \
| | |
 \

ใช้สิ่งนี้เป็นสตริงตัวอักษรและทำซ้ำaครั้ง (ที่aเป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก) จากนั้นเติมคำนำหน้า:

  ^
 /

และผนวกคำต่อท้าย:

   /
  v

และพิมพ์

(ฉันชอบที่สิ่งนี้จบลงด้วยการมองหาโปรแกรม> <>


ดูเหมือนว่าเจ้าหญิงอวกาศแห่งนี้จาก Adventure Time :)
YSC



1

Excel, 60 ไบต์

="  ^
 / \
"&REPT("| | |
 \ \
",A1-1)&"| | |
 \ /
  v"

คุณควรพิจารณาตรวจสอบเพื่อดูว่านี่เป็นภาษาพูดได้หลายภาษากับ Google ชีตหรือไม่
Taylor Scott

1

PowerShell , 83 , 57 ไบต์

"  ^
 / \"
1..--$args[0]|%{"| | |
 \ \"}
"| | |
 \ /
  v"

ลองออนไลน์!

ตามคำแนะนำของ @ AdmBorkBork

  • ประยุกต์forโดยใช้ช่วงตัวเลข
  • แทนที่;สตริงและรวมกันแล้ว
  • ลบนิยามตัวแปรที่ไม่จำเป็นออก

คุณสามารถตีforห่วง1..--$args[0]|%{ }ได้บ่อยครั้งโดยใช้
AdmBorkBork

นอกจากนี้คุณสามารถใช้การขึ้นบรรทัดใหม่ตามตัวอักษรระหว่างสตริงที่อยู่ติดกันเพื่อบันทึก";"และมีราคาถูกกว่าเพื่อกำจัด$sทั้งหมด 57 bytes
AdmBorkBork

เนียน. ฉันชอบการขึ้นบรรทัดใหม่ ตลกที่ฉันพลาด1..$argsโอกาส ฉันไม่แน่ใจว่ามารยาทที่ถูกต้องคืออะไรในเว็บไซต์นี้ ฉันจะเปลี่ยนแปลงคำตอบและให้เครดิตคุณหรือไม่หรือคุณโพสต์โซลูชันเป็นคำตอบแยกต่างหาก
รูต

การแก้ไขในการเปลี่ยนแปลงและการให้เครดิตเป็นมารยาทที่เหมาะสม ยินดีต้อนรับสู่ PPCG
AdmBorkBork


1

เยลลี่ 32 ไบต์

น่าเบื่อพอร์ตของการแก้ปัญหาหลามของลินน์

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”

ลองออนไลน์!

คำอธิบาย:

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”    Example input: 5
“\¶| | |¶ \ ”                       Literal string "\¶| | |¶ \ " (¶ = newline). Result: "\¶| | |¶ \ "
             ẋ                      Repeat as many times as the (implicit) input. Result: "\¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
              ṭ                     Tack that on the end of...
               “  ^¶ / ”            ...the string "  ^¶ / ". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
                        ;           Append...
                         “/¶  v”    The string "/¶  v". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ /¶  v"
                                    Implicit print

1

ที่จริงแล้ว 30 ไบต์

สิ่งนี้ทำงานบนหลักการเดียวกันกับคำตอบ Japt ของ ETHproductionsซึ่งมีการเพิ่มช่องว่างเพิ่มเติมในภายหลังและสตริงทั้งหมดจะถูกแบ่งออกเป็นแถวละ 5 เพื่อพิมพ์โดยปริยาย ลองออนไลน์!

"\|||\"*" ^ /"+"/ v"@+#' j5@╪i

Ungolfing

            Implicit input.
"\|||\"*    Add the middle portion and multiply that by the input.
" ^ /"+     Append the top.
"/ v"@+     Append the bottom.
#           Convert into a list of strings
' j         Join with spaces.
5@╪         Split into a list of length-5 strings.
i           Flatten list onto the stack for implicit printing with newlines.

เป็นงานที่ดีมากเมื่อใช้เมโกในภาษาของเขา!
caird coinheringaahing

1

เยลลี่ , 25 23 ไบต์

สิ่งนี้ทำงานบนหลักการเดียวกันกับคำตอบ Japt ของ ETHproductionsซึ่งมีการเพิ่มช่องว่างเพิ่มเติมในภายหลังและสตริงทั้งหมดจะถูกแบ่งออกเป็นสตริงความยาว 5 ก่อนการพิมพ์ ลองออนไลน์!

แก้ไข:ฉันรู้ว่ามีวิธีในการเข้าร่วมด้านบนและด้านล่างของ S-chain ในแบบนักเล่นกอล์ฟ ขอบคุณ Erik the Outgolfer ขนาด 2 ไบต์

“\|||\”ẋ“ ^ /“/ v”jKs5Y

Ungolfing

                Left argument: n
“\|||\”ẋ        Repeat the middle portion n times.
“ ^ /“/ v”j     Append the top and bottom.
K               Join with spaces.
s5              Split into a list of length-5 strings.
Y               Print the strings with linefeeds.

“\|||\”ẋ“ ^ /“/ v”jKs5Y
Erik the Outgolfer

1

ถ่าน 25 ไบต์

↘^\¶/¶G→⁵↓⊕⊗N←⁵|¶ \↗¶\¶v/

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


ตลกว่าCharcoal คำตอบอื่น ๆนั้นนับเป็นจำนวนไบต์เดียวกันโดยใช้วิธีที่แตกต่างอย่างสิ้นเชิง ฉันชอบคุณมากกว่า อีกอันหนึ่งใกล้กับรหัสตายตัว แต่จริง ๆ แล้วคุณกำลังใช้ความแข็งแกร่งของ Charcoal
Kevin Cruijssen

@KevinCruijssen คุณพูดถึงความแข็งแกร่ง แต่นั่นควรจะพิมพ์แนวทแยงมุมจริงๆ เศร้าที่ดีที่สุดที่ฉันจะทำมี 29 ไบต์:↘^\|¶/|\|¶|F⊖N↘\|\|¶|↘\|/¶|\v
นีล


0

Java 8, 93 76 ไบต์

n->{String r="  ^\n / ";for(;n-->0;r+="\\\n| | |\n \\ ");return r+"/\n  v";}

พอร์ตของ@IanH ตอบ C # .NETหลังจากที่ฉันเล่นกอล์ฟเพิ่มขึ้นอีกนิด

ลองที่นี่


มันตลกวิธีนี้เกือบจะเหมือนกับว่าคาดหวังสำหรับstringVS varส่วนหนึ่ง
Ian H.

@IanH และn->vs n=>;)
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.