วาดกล่อง ASCII บางกล่อง


19

รับจำนวนเต็มสองรายการที่ไม่เป็นลบและส่งออกกล่อง ASCII ตามที่กำหนดไว้ด้านล่าง

  • มุมและทางแยกเป็น pluses: +(ASCII-code 43)
  • เส้นแนวตั้งคือแท่ง|(ASCII-code 124)
  • เส้นแนวนอนเป็น minuses -(รหัส ASCII 45)

รายการอินพุตแรกระบุจำนวน minuses ระหว่างแต่ละเครื่องหมายบวกในทิศทางแนวนอน

รายการอินพุตที่สองระบุจำนวนของแท่งระหว่างแต่ละเครื่องหมายบวกในทิศทางแนวตั้ง

ง่ายต่อการอธิบายด้วยตัวอย่างบางส่วน:

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

+-+--+
| |  |
+-+--+
| |  |
| |  |
+-+--+


------------------
1 0 3 0 2 0
2 1 0 0

+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

ชี้แจง:

  • ป้อนคำสั่งและรูปแบบเป็นตัวเลือก
  • ควรพิมพ์ / แสดงกล่องเท่านั้น แต่ยอมรับการเว้นวรรคหรือการขึ้นบรรทัดใหม่
  • คุณสามารถเลือกที่จะเพิ่ม 1 ถึงค่าอินพุตทั้งหมดหากสะดวกยิ่งขึ้น ตัวอย่างที่สองจะเป็น: 2 3; 2 3.

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


คำตอบ:


5

MATL , 25 22 21 ไบต์

'|-+ '2:"1tiYsQ(]E!+)

ใช้อินพุตที่1เพิ่มเข้ามา (อนุญาตโดยการท้าทาย)

ลองออนไลน์!

คำอธิบาย

รหัสเริ่มต้นสร้างอาร์เรย์ที่มี1สำหรับดัชนีคอลัมน์ของอักขระที่ไม่ใช่ช่องว่างในผลลัพธ์สุดท้ายและ0อื่น ๆ ดังนั้นหากอินพุตแรกคือ[2 1 4 1 3 1](จะอยู่[1 0 3 0 2 0]ในรูปแบบ 0) อาเรย์นี้จะเป็น

1 0 1 1 0 0 0 1 1 0 0 1 1

สังเกตความยาวของจำนวนศูนย์ที่สัมพันธ์กับอินพุต อาร์เรย์นี้สร้างขึ้นโดยเฉพาะดังนี้:

  1. Initiallize 1อาร์เรย์ที่เดียว
  2. 1คำนวณผลรวมสะสมของการป้อนข้อมูลและเพิ่ม [3 4 8 9 12 13]ในตัวอย่างนี้จะช่วยให้
  3. ขยายอาร์เรย์จากขั้นตอนที่ 1 โดยการกำหนด1รายการที่มี (1-based) ดัชนีที่กำหนดโดยขั้นตอนที่ 2 0รายการระดับกลางมีการตั้งค่าโดยอัตโนมัติ

อาร์เรย์ที่คล้ายกันถูกสร้างขึ้นสำหรับแถว อินพุตที่สอง[3 2 1 1](หรือ[2 1 0 0 ]) ให้

1 0 0 1 0 1 1 1

ตอนนี้อาร์เรย์ที่สองถูกคูณด้วย2transposed และเพิ่มด้วยการออกอากาศไปที่แรก สิ่งนี้จะช่วยให้อาร์เรย์ 2D

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

การจัดทำดัชนีลงในสตริง'|-+ 'จะให้ผลลัพธ์สุดท้ายเป็นอาร์เรย์ถ่าน 2D เนื่องจากการจัดทำดัชนีเป็นแบบแยกส่วนและใช้ 1 ดัชนี0จะสอดคล้องกับองค์ประกอบสุดท้าย (ช่องว่าง)

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string

6

Python 2, 117 ไบต์

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

ลองใช้กับ ideone

ไม่ได้คาดหวังมากไปจากนี้ ง่ายมากเพียงใช้การรวมหลามและการคูณสตริงเพื่อดึงทุกอย่างเข้าด้วยกัน


6

JavaScript (ES6), 83 ไบต์

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

เอาต์พุตประกอบด้วยบรรทัดใหม่ต่อท้ายสองบรรทัด


ว้าว. คำตอบที่คล้ายกันจึงโพสต์เกือบในเวลาเดียวกัน ;)
Arnauld

(คุณเอาชนะฉันได้ 2 นาทีและ 2 ไบต์)
Arnauld

@Arnauld คุณเสียเวลาในการสาธิตของคุณ ;-)
Neil

ใช่ฉันเดาเช่นนั้น ^ ^ ที่น่าสนใจเวอร์ชันของฉันจะเป็น 81 ไบต์ด้วยการขึ้นบรรทัดใหม่สองเส้น
Arnauld


1

Pyth, 45 ไบต์

AQj.i*hlH]Js.i*hlG\+m*d\-G-mjb*d]XJ"+-""| "Hk

โปรแกรมที่รับอินพุตของสองรายการที่คั่นด้วยเครื่องหมายคอมมาบน STDIN และพิมพ์ผลลัพธ์

อาจยังมีบางกอล์ฟที่ต้องทำที่นี่

ลองออนไลน์

คำอธิบายมาในภายหลัง


1

Haskell, 55 ไบต์

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

กำหนดฟังก์ชั่นgที่รับทั้งสองรายการอินพุตและส่งคืนรายการที่มีบรรทัดของเอาต์พุต


0

PowerShell v2 +, 89 ไบต์

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

แดงไม่คิดว่าฉันจะจับจาวาสคริปต์ได้

ใช้อินพุต$aและ$bเป็นอาร์เรย์ที่ชัดเจน ตั้งค่าตัวแปร$xให้เป็นแถวบนสุดของกล่องตามการวนซ้ำ$aและการต่อสตริง มันถูกห่อหุ้มด้วย parens ดังนั้นมันจึงถูกวางลงบนไปป์ไลน์ จากนั้นเราจะห่วงผ่าน$bแต่ละย้ำวางสองสายในท่อ - สตริงสไตล์เดียวกัน แต่มีช่องว่างและ|แทนยัติภังค์และและ+ $xสตริงเหล่านั้นถูกรวบรวมทั้งหมดจากไปป์ไลน์โดยปริยายWrite-Outputเมื่อโปรแกรมเสร็จสมบูรณ์โดยมีการขึ้นบรรทัดใหม่ระหว่างพวกเขา

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+


0

เยลลี่ , 30 26 ไบต์

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

ทดสอบที่TryItOnline

อย่างไร?

อินพุตที่นำมาเป็นรายการของสองรายการ[vertical, horizontal]และใช้ตัวเลือกที่เพิ่มขึ้น
- ดังนั้นตัวอย่างที่ 3 ใช้เวลา[[3,2,1,1], [2,1,4,1,3,1]]
แต่ละรายการเหล่านี้จะถูกแปลงเป็นอาร์เรย์บูลีนเพื่อระบุ rowType หรือ rowCharacterType ตามลำดับเช่น[[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
กล่องถูกสร้างขึ้นโดยการทำให้แถวจาก อักขระที่ระบุโดยชุดค่าผสม rowType และ rowCharacterType - นั่นคือ rowType จะระบุอย่างใดอย่างหนึ่ง"+-"หรือ"| "และ rowCharacterType จะระบุหนึ่งในสองอักขระเหล่านั้น

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.