คุณคือเจ้าแห่งการแข่งขันกีฬาโอลิมปิก!


17

คุณเป็นเจ้าภาพการแข่งขันกีฬาโอลิมปิกและต้องสร้างสระว่ายน้ำที่ยอดเยี่ยมเพื่อโอกาส แต่หัวหน้างานมักจะเปลี่ยนใจเกี่ยวกับขนาดและต้องการวิธีที่รวดเร็วในการสร้างใหม่ตามขนาดที่ร้องขอ!


รับจำนวนเต็มสองจำนวนLและxงานของคุณคือสร้างสระว่ายน้ำที่มีความยาวLและxเลน

สระว่ายน้ำสร้างขึ้นได้อย่างไร?

  • มันประกอบด้วยสี่เหลี่ยมด้านในซึ่งผนังแนวนอนทำด้วยLเครื่องหมายขีดกลาง ( -) และผนังแนวตั้งทำจาก3x - 1บาร์ ( |) นอกจากนี้ 4+สัญญาณทั้งอยู่ในแต่ละมุม ลองมาตัวอย่าง ( L = 10, x = 2):

    + + ----------
    | |
    | |
    | |
    | |
    | |
    + + ----------
    
  • แต่ละเลนมีความกว้าง 2 ยูนิตในแนวตั้ง จตุรัสด้านในเต็มไปด้วยx-1ตัวแยกเลนซึ่งประกอบด้วยสัญลักษณ์ที่Lต่อเนื่องกันในแนวนอน :หลังจากใส่ตัวแยกเลนสระของเราควรมีลักษณะเช่นนี้:

    + + ----------
    | |
    | |
    | :::::::::: |
    | |
    | |
    + + ----------
    
  • สระว่ายน้ำยังมีช่องว่างภายใน (ตารางด้านนอก) ซึ่งผนังแนวนอนคือ (L + 4) -s และผนังแนวตั้งเป็น (3x + 1) |s ที่ล้อมรอบสี่เหลี่ยมด้านใน:

    + + --------------
    | + ---------- + |
    | | | |
    | | | |
    | | :::::::::: | |
    | | | |
    | | | |
    | + ---------- + |
    + + --------------
    

และนั่นคือสระว่ายน้ำขนาดโอลิมปิกของเรา!


รายละเอียด:

  • เพื่อวัตถุประสงค์ในการออกแบบและการทำงานคุณจะรับประกันว่าและ100 ≥ L ≥ 1015 ≥ x ≥ 2

  • ผลลัพธ์จะต้องตรงตามที่แสดง การแสดงผลพูล "* ที่สร้างในแนวตั้ง" ไม่ได้รับอนุญาต

  • อนุญาตให้ใช้ช่องว่างส่วนท้ายและส่วนหน้า

  • คุณอาจจะใช้การป้อนข้อมูลและจัดให้มีการส่งออกผ่านวิธีการมาตรฐานใด

  • มีการใช้ช่องโหว่เริ่มต้น


ตัวอย่าง / กรณีทดสอบ:

L = 20, x = 3

+ + ------------------------
| + -------------------- + |
| | | |
| | | |
| | :::::::::::::::::::: | |
| | | |
| | | |
| | :::::::::::::::::::: | |
| | | |
| | | |
| + -------------------- + |
+ + ------------------------



L = 50, x = 5:

+ ------------------------------------------------- ----- +
| + ------------------------------------------------- - + |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| + ------------------------------------------------- - + |
+ ------------------------------------------------- ----- +


L = 10, x = 15

+ + --------------
| + ---------- + |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| + ---------- + |
+ + --------------

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!

* น้ำอาจไหลออกหากสร้างในแนวตั้ง: P

** ใช่ฉันรู้ว่ายิ่งมีช่องทางมากเท่าไหร่และยิ่งมีสระว่ายน้ำที่สั้นมากเท่าไหร่รูปวาดก็จะดูเหมือนสระน้อยกว่า!


Sandboxสำหรับผู้ที่สามารถดูโพสต์ที่ถูกลบ
Mr. Xcoder

จะเกิดอะไรขึ้นถ้าx>=L?
CraigR8806

@ CraigR8806 อัลกอริทึมเดียวกัน เพียงแค่มีเลนมากกว่าความยาวของสระ ฉันมีความรู้สึกว่าคุณผิดคำถาม ...
นาย Xcoder

สิ่งที่เกี่ยวกับกรณีที่ไหนL=10และx=15? จะไม่มีเลนมากกว่าที่จะวางในสระหรือไม่ ฉันอาจเข้าใจผิดเจตนา
CraigR8806

@ CraigR8806 ความยาวไม่มีส่วนเกี่ยวข้องกับเลน! คุณสามารถทดสอบด้วยตัวเองด้วยหนึ่งในคำตอบที่มีอยู่
Mr. Xcoder

คำตอบ:


13

ถ่าน 32 ไบต์

NθNη↓Eθ×η:  B⁺θ²⁺׳η¹↖←B⁺θ⁶⁺׳η³

ลองออนไลน์!

-4 ขอบคุณที่นีล

AST:

Program
├N: Input Number
│└θ: Identifier θ
├N: Input Number
│└η: Identifier η
├Print
│├↓: Down
│└E: Map
│ ├θ: Identifier θ
│ └×: Product
│  ├η: Identifier η
│  └':  ': String ':  '
├B: Box
│├⁺: Sum
││├θ: Identifier θ
││└2: Number 2
│└⁺: Sum
│ ├×: Product
│ │├3: Number 3
│ │└η: Identifier η
│ └1: Number 1
├Move
│└↖: Up Left
├Move
│└←: Left
└B: Box
 ├⁺: Sum
 │├θ: Identifier θ
 │└6: Number 6
 └⁺: Sum
  ├×: Product
  │├3: Number 3
  │└η: Identifier η
  └3: Number 3

ว้าว Charcoal ได้รับการท้าทายนี้ :) :)
Downgoat

คุณยังคงซื่อสัตย์ต่อชื่อของคุณคุณทำให้ฉันก้าวร้าว
notjagan

2
ตามปกติคำขอคำอธิบาย
CalculatorFeline

@CalculatorFeline ใช่ฉันไม่มีเวลาทำคำอธิบายเหล่านั้นทั้งหมดในขณะที่ฉันกำลังมองหาบางสิ่งบางอย่างที่จะ outgolf ... นอกจากนี้คุณสามารถตรวจสอบ AST โดยใช้-aอาร์กิวเมนต์บรรทัดคำสั่ง
Erik the Outgolfer

สาเหตุที่ทำให้-aเกิดข้อผิดพลาด> _ <
Erik the Outgolfer

12

ถ่าน , 40 39 37 ไบต์

NθNηB⁺θ⁶⁺׳η³↘→B⁺θ²⁺׳η¹→F⁻η¹«M³↓P×:θ

ลองออนไลน์!

ฉันรู้ว่าNeilมีคำตอบ Charcoal อยู่ที่ความยาวเท่ากัน แต่ฉันใช้วิธีที่แตกต่างกันเล็กน้อยดังนั้นฉันจึงคิดว่าฉันอาจโพสต์ของฉันได้เช่นกัน

คำอธิบาย

NθNηB⁺θ⁶⁺׳η³↘→B⁺θ²⁺׳η¹→F⁻η¹«M³↓P×:θ
NθNη                                         take the two inputs as numbers in θ and η
      B⁺θ⁶⁺×³η³                               draw a rectangle θ + 6 by 3η + 3
                                               (characters default to |, - and +)
                ↘→                             move the cursor down one and right two
                   B⁺θ²⁺×³η¹                  draw a rectangle θ + 2 by 3η + 1
                             F⁻η¹«            for ι (unused) from 0 up until η - 1:
                                   M³↓            move the cursor down by 3
                                       P×:θ       print θ :s without moving the cursor
                                               [implicit end of for]

1
กรุณาอธิบาย
CalculatorFeline

@CalculatorFeline เพิ่มแล้ว
notjagan

1
อืมพารามิเตอร์ที่สามเป็นตัวเลือกหรือไม่? เยี่ยมมากนั่นช่วยฉันสองไบต์!
Neil

11

ถ่าน, 40 38 36 31 ไบต์

A⁺²NθA⁺¹×³NηUOθη:¶¶Bθη↖←B⁺⁴θ⁺²η

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

A⁺²Nθ       Assign(Plus(2, InputNumber()), q);

การวาดแบบดั้งเดิมของ Charcoal ใช้การนับตัวละครโดยรวมรวมถึง+s อย่างไรก็ตามการป้อนข้อมูลเป็นเพียงจำนวน-s ดังนั้นเราจำเป็นต้องเพิ่ม 2 เพื่อให้ได้ความกว้างของผนังด้านใน

A⁺¹×³Nη     Assign(Plus(1, Times(3, InputNumber())), h);

คำนวณความสูงของผนังด้านในอีกครั้งรวมแถวด้านล่างดังนั้นสามต่อเลนบวกหนึ่ง

UOθη:¶¶     Oblong(q, h, ":\n\n");

วาดเลน นี่เป็นรูปสี่เหลี่ยมผืนผ้าที่เต็มไปด้วย:s คั่นในแนวตั้งด้วยสองบรรทัดว่าง (pilcrows แสดงถึงอักขระบรรทัดใหม่)

Bθη         Box(q, h);

Rectangleคำสั่งเป็นสิ่งที่เราจำเป็นต้องวาดผนังด้าน แก้ไข: Boxอนุญาตให้คุณข้ามพารามิเตอร์ตัวที่สามซึ่งจะช่วยฉัน 2 ไบต์

↖           Move(:UpLeft);
←           Move(:Left);
B⁺⁴θ⁺²η     Box(Plus(4, q), Plus(2, h));

และอีกครั้งเพื่อวาดผนังด้านนอกยกเว้นกว้างขึ้นเล็กน้อยและสูงขึ้นและอยู่กึ่งกลางบนผนังด้านใน


1
ทำไมลิงค์ถึงรหัส Charcoal ที่ TIO ไม่เคยไปถึงรหัสที่แท้จริง?
Jonathan Allan

1
@JanathanAllan ฉันเชื่อมโยงไปยังรหัส verbose เนื่องจากสามารถอ่านได้มากขึ้นรวมถึงฉันเพิ่มอาร์กิวเมนต์เพื่อสร้างรหัสรวบรัดโดยอัตโนมัติเพื่อวัตถุประสงค์ในการตรวจสอบ
Neil

... แต่ 219 ตัวอักษรอ่านได้มากกว่า 40 อย่างไร : p
Jonathan Allan

ฉันจะได้มองเพียงแค่ยากและพบเคล็ดลับนี้ :)
โจนาธานอัลลัน

1
ตามปกติโปรดอธิบาย
CalculatorFeline

8

T-SQL, 284 281 ไบต์

DECLARE @ INT,@x INT,@S VARCHAR(MAX)='+--d--+b| +d+ |b'SELECT @=L,@x=x FROM t
P:SET @S+='| |s| |b| |s| |b| |c| |b'SET @x-=1IF @x>0GOTO P
PRINT REPLACE(REPLACE(REPLACE(REPLACE(LEFT(@S,LEN(@S)-6)+'+d+ |b+--d--+','d',REPLICATE('-',@)),'b',CHAR(13)),'s',SPACE(@)),'c',REPLICATE(':',@))

อินพุตถูกนำมาจากคอลัมน์ INT Lและxในนิยายตารางที , ต่อวิธีการป้อนข้อมูลของเราได้รับอนุญาต

โดยพื้นฐานแล้วฉันกำลังสร้างสตริงที่มีความยาวพร้อมตัวอักษรที่แสดงถึงตัวละครซ้ำ (d = เครื่องหมายขีดคั่น, s = ช่องว่าง, c = โคลอน, b = ตัวแบ่งบรรทัด) จากนั้นแทนที่พวกเขาทั้งหมดในตอนท้ายด้วยตัวเติมที่เหมาะสม

จัดรูปแบบ:

DECLARE @ INT,@x INT,@S VARCHAR(MAX)='+--d--+b| +d+ |b'
SELECT @=L,@x=x FROM t
P:
    SET @S+='| |s| |b| |s| |b| |c| |b'
    SET @x-=1
IF @x>0 GOTO P
PRINT REPLACE(REPLACE(REPLACE(REPLACE( LEFT(@S,LEN(@S)-6)+'+d+ |b+--d--+'
     ,'d',REPLICATE('-',@))
     ,'b',CHAR(13))
     ,'s',SPACE(@))
     ,'c',REPLICATE(':',@))

ภายในลูปฉันจะต่อท้ายช่องว่าง 2 แถวและโคลอน 1 แถวจากนั้นในตอนท้ายฉันจะตัดแถวตัวแบ่งออกและผนวกเส้นขอบพูลก่อนต่อท้ายการแทนที่

แก้ไข : บันทึก 3 ไบต์โดยเปลี่ยน@เป็นตัวแปรที่ใช้บ่อยที่สุดและสลับลำดับการเริ่มต้น


8

JavaScript (ES6), 137 124 ไบต์

วางมือลงบนโทรศัพท์ของฉันและทำตามได้มากกว่า

x=>y=>`+--0--+
| +0+ |
${((a=`| |1| |
`)+a+`| |2| |
`).repeat(y-1)+a+a}| +0+ |
+--0--+`.replace(/\d/g,n=>"- :"[n].repeat(x))

ลองมัน

f=
x=>y=>`+--0--+
| +0+ |
${((a=`| |1| |
`)+a+`| |2| |
`).repeat(y-1)+a+a}| +0+ |
+--0--+`.replace(/\d/g,n=>"- :"[n].repeat(x))
oninput=_=>o.innerText=f(+i.value)(+j.value);o.innerText=f(i.value=50)(j.value=5)
input{font-family:sans-serif;margin:0 5px 0 0;width:50px;}
<label for=i>L: </label><input id=i type=number><label for=j>x: </label><input id=j type=number><pre id=o>


ฉันชอบอันนี้เพราะมันเป็นแบบโต้ตอบ: D
xDaizu

@xDaizu ตรวจสอบโซลูชัน JS อื่น ๆ ของฉันดังนั้น;)
Shaggy


4

SOGL V0.12 , 52 51 ไบต์

:┌* +1Ο;@*┐1ΟG∙⁴++⁰
b3*Ie4+⁰b3*He⁰32žbH∫3*2+4;e :*ž

ลองที่นี่!
ไม่เลวเมื่อพิจารณาว่า 20 ไบต์ของฟังก์ชั่นนี้เป็นรูปสี่เหลี่ยมผืนผ้าซึ่งถ่านมีในตัว

คำอธิบาย:

Rectangle function: (example: on stack 4, 2)
:                   duplicate the top of stack (X pos)      [4, 2, 2]
 ┌*                 get that many "-"es                     [4, 2, "--"]
    +               push "+"                                [4, 2, "--", "+"]
     1Ο             wrap the dashes in pluses               [4, 2, "+--+"]
       ;            get the duplicated X position           [4, "+--+", 2]
        @*          get that many spaces                    [4, "+--+", "  "]
          ┐         push "|"                                [4, "+--+", "  ", "|"]
           1Ο       wrap the spaces with "|"                [4, "+--+", "|  |"]
             G      get the Y value ontop                   ["+--+", "|  |", 4]
              ∙     get an array with that many strings     ["+--+", ["|  |", "|  |", "|  |", "|  |"]]
               ⁴    duplicate the dashes wrapped in pluses  ["+--+", ["|  |", "|  |", "|  |", "|  |"], "+--+"]
                ++  add everything to one array             [["+--+", "|  |", "|  |", "|  |", "|  |", "+--+"]]
Main function: (example input: 2, 5)
b3*                              push variable B (input 1, Y length) multiplied by 3                     [6]
   I                             increase it                                                             [7]
    e4+                          push variable E (input 2, X length) + 4                                 [7, 9]
       ⁰                         execute the rectangle function [in X: E+4, Y: b*3+1]                    [["+---------+","|         |","|         |","|         |","|         |","|         |","|         |","|         |","+---------+"]]
        b3*                      push variable B * 3                                                     [["+---------+",..,"+---------+"], 6]
           H                     decrease it                                                             [["+---------+",..,"+---------+"], 5]
            e                    push variable E                                                         [["+---------+",..,"+---------+"], 5, 5]
             ⁰                   execute the rectangle function [on X: E, Y: B*3-1]                      [["+---------+",..,"+---------+"], ["+-----+","|     |","|     |","|     |","|     |","|     |","+-----+"]]
              32ž                at coordinates [3;2] (1-indexed) in the first rectangle put in the 2nd  [["+---------+",
                                                                                                           "| +-----+ |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| +-----+ |",
                                                                                                           "+---------+"]
                 bH∫             iterate over the numbers from 1 to B-1:                                 [[...], 1]
                    3*2+           push pop()*3+2                                                        [[...], 5]
                        4;         push 4 one below the stack                                            [[...], 4, 5]
                          e        push the variable E (X length)                                        [[...], 4, 5, 5]
                            :*     get that many colons                                                  [[...], 4, 5, ":::::"]
                              ž    insert [at coordinates [4; cIter*3+2] the colons]                     


4

Python 2 , 128 126 ไบต์

L,x=input()
k='+'+'-'*(L+4)+'+\n| +'+'-'*L+'+ |\n'
f=lambda k:'| |'+k*L+'| |\n'
print k+f(':').join([f(' ')*2]*x)[:-1]+k[::-1]

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ @ Mr.Xcoder



@ Mr.Xcoder ถูกต้องขอบคุณฉันไม่รู้ว่าฉันกำลังคิดอะไรกับวงเล็บพิเศษเหล่านั้น: P
HyperNeutrino



2

ถ่าน , 36 ไบต์

NθNηFη«M³↑P×θ:»←B⁺θ²⁺׳η¹↖←B⁺θ⁶⁺׳η³

ลองออนไลน์!

นี่เป็นอัลกอริทึม Charcoal-y มากกว่าคำตอบอื่น ๆ ของฉัน


1
ถ่านได้รับความท้าทายอย่างเป็นทางการแล้ว 4/10 คำตอบอยู่ในถ่าน ...
นาย Xcoder

@ Mr.Xcoder เอ้อมันเป็นภาษาที่ออกแบบมาเพื่อกอล์ฟ ascii โดยเฉพาะดังนั้นนั่นคือสิ่งที่คุณจะได้รับ ;)
Erik the Outgolfer

1
คำขอคำอธิบาย
CalculatorFeline

@ Mr.Xcoder และสามในนั้นก็มีความยาวเท่ากันเช่นกัน!
Neil


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