กำหนดความลึกของอาร์เรย์


31

ความท้าทายที่ง่ายสำหรับตอนเย็นวันจันทร์ของคุณ (ดีหรือเช้าวันอังคารในอีกครึ่งหนึ่งของโลก ... )

คุณได้รับการป้อนข้อมูลเป็นจำนวนเต็มจำนวนเต็มบวกที่ซ้อนกันซึ่งอาจทำให้ขาดดุล:

[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]

งานของคุณคือการกำหนดความลึกซึ่งเป็นความลึกการซ้อนที่ยิ่งใหญ่ที่สุดของจำนวนเต็มใด ๆ ในรายการ ในกรณีนี้ความลึกของ11คือ6ซึ่งใหญ่ที่สุด

คุณอาจสมมติว่าไม่มีอาร์เรย์ใดว่างเปล่า

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

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

คุณต้องไม่ใช้บิวด์อินที่เกี่ยวข้องกับรูปร่างของอาร์เรย์ (รวมถึงบิวด์อินที่แก้ปัญหานี้ซึ่งจะทำให้คุณได้มิติของอาร์เรย์ที่ซ้อนกัน) ข้อยกเว้นเพียงอย่างเดียวคือการได้รับความยาวของอาร์เรย์

ใช้กฎมาตรฐานของ

กรณีทดสอบ

[1]                                                               -> 1
[1, 2, 3]                                                         -> 1
[[1, 2, 3]]                                                       -> 2
[3, [3, [3], 3], 3]                                               -> 3
[[[[1], 2], [3, [4]]]]                                            -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1]                                  -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]]                                                   -> 7

2
หลังจากการสนทนาในการแชทฉันได้ตัดสินใจอนุญาตให้มีบิวด์อินแบบยาวเพราะบางภาษาต้องการให้พวกมันวนซ้ำแบบอาร์เรย์อย่างหมดจด
Martin Ender

2
เพียงเพื่อการศึกษาโดยทั่วไป: เป็น APL ของในตัวดั้งเดิมสำหรับตรงนี้
อดัม

@ MartinBüttnerฉันพบปัญหาเล็กน้อย ฉันเริ่มทำสิ่งนี้ใน java โดยไม่ตั้งใจเมื่อทดสอบอินพุตคอมมาทำให้การแบ่งอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งหลาย ๆ อัน ฉันสามารถใช้อักขระเลี่ยง\ ในอินพุตได้หรือไม่ แก้ไข:ไม่เป็นไรเพียงแค่พยายามอย่างนั้น ที่ไม่ได้ทำงานอย่างใดอย่างหนึ่ง ฉันจะใช้งาน CMD ไม่ได้
Ashwin Gupta

@AshwinGupta คุณไม่สามารถตัดอาร์กิวเมนต์บรรทัดคำสั่งในเครื่องหมายคำพูดได้หรือไม่ นอกจากนี้คุณยังสามารถอ่านอินพุตจาก STDIN หรือส่งฟังก์ชั่นที่ใช้วัตถุอาร์เรย์จริงเป็นพารามิเตอร์
Martin Ender

@ MartinBüttnerโอ้ฉันไม่รู้ว่าอัญประกาศฉันจะลองดู ขณะนี้เพิ่งใช้เครื่องสแกน (System.in) ฉันเชื่อว่าเป็นรูปแบบของ STDIN หรือไม่
Ashwin Gupta

คำตอบ:


20

K, 4 ไบต์

#,/\

ใน K ,/จะเข้าร่วมองค์ประกอบทั้งหมดของรายการ สำนวนสามัญ,//ซ้ำไปยังจุดคงที่แบนราบรายการซ้อนกันโดยพลการอย่างสมบูรณ์ ,/\จะทำซ้ำไปยังจุดที่กำหนดในลักษณะที่คล้ายกัน แต่รวบรวมรายการผลลัพธ์ระดับกลาง โดยการนับจำนวนผลกลางที่เราเยี่ยมชมก่อนถึงจุดคงที่ ( #) เราจะได้คำตอบที่เราต้องการนั่นคือความลึกในการซ้อนสูงสุด

"จำนวนการเข้าร่วมการสแกนจุดคงที่"

ในการดำเนินการ:

 (#,/\)'(,1
        1 2 3
        ,1 2 3
        (3;(3;,3;3);3)
        ,((,1;2);(3;,4)))
1 1 2 3 4

15

เรติน่า 10

  • บันทึก 1 ไบต์ขอบคุณ @ @ПӍѲꝆΛҐӍΛ
  • บันทึก 14 ไบต์พิเศษด้วย @ MartinBüttner
+ `w \ |} {

{

ที่นี่รูปแบบการป้อนข้อมูลเป็นบิตที่วางแผนไว้ - _อักขระถูกใช้สำหรับตัวคั่นรายการดังนั้นอินพุตจะมีลักษณะเช่นนี้{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}

  • ขั้นตอนที่ 1 - ลบซ้ำ ๆ}{และ\wตัวละครอื่น ๆ ทั้งหมด สิ่งนี้มีผลต่อการก) การทำรายการทั้งหมดในทุกระดับประกอบด้วยเพียงองค์ประกอบเดียวและข) การลบอักขระที่ไม่อยู่ในรายการทั้งหมด
  • ขั้นที่ 2 - {การนับจำนวนที่เหลืออยู่ สิ่งนี้ทำให้การทำรังในระดับที่ลึกที่สุด

ลองออนไลน์


หากยืดออกมากเกินไปคำตอบก่อนหน้าคือ:

เรติน่า 13

{}ถือว่ารายชื่อที่มีอยู่ในวงเล็บปีกกา

+ `[^} {] |} {

{

ลองมันออนไลน์


1
รหัสของคุณสามารถย่อให้เหลือ 13 ไบต์ (11 ถ้าคุณยืดรูปแบบการป้อนข้อมูลเล็กน้อย) แจ้งให้เราทราบหากคุณต้องการคำใบ้ :) (ฉันไม่ต้องการโพสต์ด้วยตัวเองเนื่องจากเป็นวิธีแก้ปัญหาเดียวกันจริง ๆ )
Martin Ender

มันเป็นสองสิ่ง a) คุณสามารถบันทึกไบต์หรือมากกว่านั้นโดยปรับแต่งรูปแบบอินพุตเล็กน้อย b) คุณสามารถบันทึกจำนวนมากได้โดยไม่คำนึงถึงว่า ... คุณสามารถหาโซลูชันที่สั้นกว่า (และง่ายกว่า) ได้หรือไม่ถ้าคุณพยายามที่จะไม่จัดการกับกรณีทดสอบจำนวนมากในการทดสอบครั้งเดียว?
Martin Ender

ฉันไม่ได้คิดอย่างนั้น นั่นคือจำนวนไบต์ที่บันทึกไว้แล้ว การเปลี่ยนแปลงรูปแบบการป้อนข้อมูลของฉันน่าจะแย่กว่านี้ เกี่ยวกับ b) จดจำว่าโหมดการทำงานแรกและที่ง่ายที่สุดของ Retina คืออะไร?
Martin Ender

1
อ๋อ a) ของฉันหมายถึงการลบช่องว่างออกจากอินพุต และคุณสามารถบันทึกอีกสองไบต์โดยใช้_แทน,แต่นั่นอาจจะเป็นการยืด
Martin Ender

@ MartinBüttnerความคิดที่ดี! เห็นด้วย - _ตัวคั่นอาจถูกประดิษฐ์เกินไป ดังนั้นฉันจึงออกจากทั้งสองเวอร์ชันในคำตอบ
Digital Trauma

12

Python 2, 33 ไบต์

f=lambda l:l>{}and-~max(map(f,l))

กำหนดความลึกแบบวนซ้ำโดยบอกความลึกของตัวเลขคือ 0 และความลึกของรายการนั้นมากกว่าความลึกสูงสุดขององค์ประกอบ รายการ Number vs ถูกตรวจสอบโดยเปรียบเทียบกับพจนานุกรมว่างเปล่า{}ซึ่งอยู่เหนือตัวเลข แต่อยู่ด้านล่างรายการของการเรียงลำดับในตัวของ Python 2 โดยพลการ


บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

6

Pyth - 11 10 7 ไบต์

บันทึก 1 ไบต์ด้วย @Dennis

บันทึกได้ 4 ไบต์ด้วย @Thomas Kwa

eU.usNQ

ลองมันออนไลน์ได้ที่นี่

เก็บผลรวมของอาร์เรย์ไว้จนกว่ามันจะหยุดการเปลี่ยนแปลงซึ่งหมายความว่ามันมีเพียงจำนวนหนึ่งเท่านั้นนี่จะรวมกันเพื่อบันทึกผลลัพธ์กลางทั้งหมดและรับความยาวโดยทำการ urange ด้วยความยาวเดียวกันกับรายการและรับองค์ประกอบสุดท้าย


m!!d&R1จะกลายเป็น
เดนนิส

@Dennis cool นั่นเป็นคนฉลาด
Maltysen

@ThomasKwa lไม่ได้รับอนุญาตใน OP
Maltysen

@ThomasKwa ที่ฉลาดจริงๆขอบคุณ!
Maltysen

บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

6

Haskell, 43 ไบต์

'['#x=x-1
']'#x=x+1
_#x=x
maximum.scanr(#)0

ตัวอย่างการใช้งาน: ->maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"5

Haskell ไม่มีรายการผสม ( IntegerผสมกับList of Integer) ดังนั้นฉันไม่สามารถใช้ประโยชน์จากฟังก์ชั่นตรวจจับรายการบางรายการได้และฉันต้องแยกสตริง

ฉันเริ่มต้นที่ด้านขวาด้วย0และเพิ่ม 1 สำหรับทุก ๆ]ลบ 1 สำหรับทุก ๆ[และเก็บค่าไว้เป็นอย่างอื่น scanrเก็บผลลัพธ์ระดับกลางทั้งหมดไว้เพื่อให้maximumสามารถทำงานได้


5

JavaScript (ES6), 35 ไบต์

f=a=>a[0]?Math.max(...a.map(f))+1:0

คำอธิบาย

ฟังก์ชั่นวนซ้ำที่ส่งกลับความลึกสูงสุดของอาร์เรย์หรือ0ถ้าผ่านตัวเลข

var solution =

f=a=>
  a[0]?                   // if a is an array
    Math.max(...a.map(f)) // return the maximum depth of each element in the array
    +1                    // add 1 to increase the depth
  :0                      // if a is a number, return 0

// Test cases
result.textContent =
`[1]                                                              -> 1
[1, 2, 3]                                                         -> 1
[[1, 2, 3]]                                                       -> 2
[3, [3, [3], 3], 3]                                               -> 3
[[[[1], 2], [3, [4]]]]                                            -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1]                                  -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]]                                                   -> 7`
.split`\n`.map(t=>(c=t.split`->`.map(p=>p.trim()),c[0]+" == "+c[1]+": "+(solution(eval(c[0]))==c[1]?"Passed":"Failed"))).join`\n`
<input type="text" id="input" value="[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]" />
<button onclick="result.textContent=solution(eval(input.value))">Go</button>
<pre id="result"></pre>


บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

4

MATL , 11 14 15ไบต์

'}{'!=dYsX>

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

ลองออนไลน์!

          % implicitly take input as a string (row array of chars)
'}{'!     % 2x1 (column) char array with the two curly brace symbols
=         % 2-row array. First / second row contains 1 where '}' / '{' is found
d         % second row minus first row
Ys        % cumulative sum of the array
X>        % maximum of the array
          % implicitly display result

บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

4

อ็อกเทฟ 29 ไบต์

@(a)max(cumsum(92-(a(a>90))))

แผนที่[1 และ]-1 แล้วจะใช้เวลาสูงสุดของผลรวมสะสม

อินพุตเป็นสตริงของฟอร์ม

S6 = '[1, [[3]], [5, 6], [[[[8]]]], 1]';

เรียกใช้ตัวอย่างในideone


คุณควรใช้{, }? อ็อกเทฟที่เทียบเท่ากับอาร์เรย์ใน OP คือเซลล์อาร์เรย์ฉันคิดว่า
Luis Mendo

@ LuisMendo ไม่เพราะนั่นคือ 2 ไบต์พิเศษ :) นอกจากนี้เนื่องจากฉันไม่เคยสร้างอาร์เรย์จริงๆเพียงแค่แยกสตริงอินพุตฉันไม่คิดว่ามันจะสำคัญ แต่คุณเตือนฉันให้เพิ่มอินพุตที่คาดไว้ในคำตอบของฉัน
บีกเกอร์

ความจริง! รหัส ASCII อีกต่อไป
Luis Mendo

@LuisMendo จริงแล้วอีก 1 ไบต์ การเปรียบเทียบที่สองนั้นจะต้องมากกว่า '9' เท่านั้น แต่คุณจะได้รับความคิด: D
บีกเกอร์

4

Julia, 55 26 ไบต์

f(a)=0a!=0&&maximum(f,a)+1

นี่เป็นฟังก์ชั่นวนซ้ำที่ยอมรับอาร์เรย์หนึ่งมิติที่มีเนื้อหาประเภทAnyและส่งกลับจำนวนเต็ม เมื่อผ่านอาร์เรย์เพื่อฟังก์ชั่นคำนำหน้าทั้งหมดที่มีวงเล็บคือAnyf(Any[1,Any[2,3]])

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

บันทึก 29 ไบต์ขอบคุณ Dennis!


2
สนามกอล์ฟ Dat <filler>
El'endia Starman

3

Ruby, 53 ไบต์

i=0;p gets.chars.map{|c|i+=('] ['.index(c)||1)-1}.max

อินพุตจาก STDIN, เอาต์พุตไปยัง STDOUT

i=0;                 initialize counter variable
p                    output to STDOUT...
gets                 get line of input
.chars               enumerator of each character in the input
.map{|c|             map each character to...
i+=                  increment i (and return the new value) by...
('] ['.index(c)||1)  returns 0 for ], 2 for [, 1 for anything else
-1                   now it's -1 for ], 1 for [, 0 for anything else
                     therefore: increment i on increase in nesting, decrement i
                       on decrease, do nothing otherwise
}.max                find the highest nesting level that we've seen

บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

3

เยลลี่, 10 7 ไบต์

¬;/SпL

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

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

¬;/SпL  Main link. Input: A (list)

¬        Negate all integers in A. This replaces them with zeroes.
    п   Cumulative while loop.
   S       Condition: Compute the sum of all lists in A.
                      If the sum is an integer, it will be zero (hence falsy).
 ;/        Body:      Concatenate all lists in A.
      L  Count the number of iterations.

ปรับปรุง

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

สิ่งนี้ได้รับการแก้ไขในเวอร์ชั่นล่าสุดดังนั้นรหัสต่อไปนี้ ( 6 ไบต์ ) จะสามารถใช้งานได้ในขณะนี้

¬SSпL

สิ่งนี้จะสรุปจำนวนแถวของอาร์เรย์แทนการต่อข้อมูลเข้าด้วยกัน


สันนิษฐานว่าŒḊใหม่กว่าความท้าทายหรือไม่
caird coinheringaahing

คุณต้องไม่ใช้บิวด์อินที่เกี่ยวข้องกับรูปร่างของอาร์เรย์ (รวมถึงบิวด์อินที่แก้ปัญหานี้ซึ่งจะทำให้คุณได้มิติของอาร์เรย์ที่ซ้อนกัน)
เดนนิส


3

Mathematica, 27 20 ไบต์

Max[#0/@#]+1&[0#]-1&

ฟังก์ชั่นวนซ้ำง่าย ๆ


เป็นไปได้ที่จะโมฆะการIfประหยัด 7 ไบต์ (แจ้งให้เราทราบหากคุณต้องการคำใบ้)
Martin Ender

@ MartinBüttnerฉันยอมแพ้ ... Replaceโซลูชั่นที่มีพื้นฐานอย่างน้อยตราบนี้ ...
LegionMammal978

1
Mapping Max[#0/@#]+1&[0#]-1&กว่าจำนวนเต็มคือไม่มี-op: ยังสามารถไปภายในโทรภายในเช่น-1 ...&[0#-1]&
Martin Ender

3

PHP, 61 ไบต์

function d($a){return is_array($a)?1+max(array_map(d,$a)):0;}

ฟังก์ชันเรียกซ้ำที่ใช้ตัวเองเป็นฟังก์ชันการทำแผนที่เพื่อแทนที่แต่ละองค์ประกอบด้วยความลึก


ฉันเพิ่งสังเกตเห็น: สิ่งเดียวกันใน JSมีเพียง 35 ไบต์ ยังคงสวยใน php
ติตัส

เยี่ยมคุณเอาชนะฉัน แต่ฉันอัปเดตของฉันและเอาชนะคุณ :)
Aross

3

PHP, 84 72 64 63 60 ไบต์

หมายเหตุ: ต้องการ PHP 7 สำหรับตัวดำเนินการเปรียบเทียบแบบรวม นอกจากนี้ยังใช้การเข้ารหัส IBM-850

for(;$c=$argv[1][$i++];)$c>A&&$t=max($t,$z+=~ú<=>$c);echo$t;

ทำงานแบบนี้:

php -r 'for(;$c=$argv[1][$i++];)$c>A&&$t=max($t,$z+=~ú<=>$c);echo$t;' "[1, [[3]], [5, 6], [[[[8]]]], 1]"
  • บันทึก 12 ไบต์โดยนับการจัดฟันของการแทนค่าสตริงแทน
  • บันทึก 8 ไบต์โดยทำให้การเปรียบเทียบสตริงง่ายขึ้นและใช้เลขลำดับของถ่านในกรณีของ[และ]
  • บันทึก byte โดยไม่ส่ง$iไปยัง int การชดเชยสตริงจะถูกส่งไปยัง int โดยปริยาย
  • บันทึก 3 ไบต์โดยใช้ตัวดำเนินการเปรียบเทียบแบบรวมแทนหมายเลขลำดับ

ความคิดที่ดีกอล์ฟที่ยอดเยี่ยม! ตรวจสอบเหมือง
ติตัส


2

Python 3, 42 39 ไบต์

-3 ไบต์ขอบคุณ Sp3000

นี่คือพอร์ตของโซลูชัน Python 2ของxnor :

f=lambda l:"A"<str(l)and-~max(map(f,l))

น่าเสียดายที่[] > {}ส่งคืนunorderable typesข้อผิดพลาดดังนั้นจึงไม่สามารถใช้เคล็ดลับที่ชาญฉลาดของ xnor ได้ ในสถานที่นั้น-0123456789มีค่า ASCII ต่ำกว่าAซึ่งต่ำกว่า[]ดังนั้นการเปรียบเทียบสตริงจึงใช้งานได้


2

CJam (15 ไบต์)

q~{__e_-M*}h],(

การสาธิตออนไลน์

การผ่า

q~      e# Read line and parse to array
{       e# Loop...
  _     e#   Leave a copy of the array on the stack to count it later
  _e_-  e#   Remove a flattened version of the array; this removes non-array elements from
        e#   the top-level array.
  M*    e#   Remove one level from each array directly in the top-level array
}h      e# ...until we get to an empty array
],(     e# Collect everything together, count and decrement to account for the extra []

สำหรับความยาวเท่ากัน แต่ค่อนข้างมากในพื้นที่แฮ็คที่น่าเกลียด

q'[,-{:~_}h],2-

s/ugly/beautiful/
Dennis

@Dennis ฉันหมายถึงเฉพาะการใช้'[,-เพื่อดึงสตริงลงไป[]ซึ่งขึ้นอยู่กับเนื้อหาที่ถูก จำกัด วิธีการที่แบนจะทำงานโดยไม่คำนึงถึงเนื้อหาของอาเรย์
Peter Taylor

อันที่สองสวยกว่า คนแรกมีวงเล็บปีกกาไม่ตรงกันสองประเภท
Cyoce

2

ไม่เกิน 40 ตัวอักษร

(39 ตัวอักษรรหัส + 1 ตัวเลือกบรรทัดคำสั่ง)

s/[^][]+//g
:;s/]\[//;t
s/]//g
s/\[/1/g

อินพุต: สตริง, เอาต์พุต: หมายเลขนารี

วิ่งตัวอย่าง:

bash-4.3$ sed -r 's/[^][]+//g;:;s/]\[//;t;s/]//g;s/\[/1/g' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
111111

ไม่เกิน 33 ตัว

(ตัวเลือกรหัสคำสั่ง 32 ตัวอักษร + 1 ตัวอักษร)

หากช่องว่างต่อท้ายได้รับอนุญาตในการส่งออก

s/[^][]+//g
:;s/]\[//;t
y/[]/1 /

อินพุต: สตริง, เอาต์พุต: หมายเลขนารี

วิ่งตัวอย่าง:

bash-4.3$ sed -r 's/[^][]+//g;:;s/]\[//;t;y/[]/1 /' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
111111      

2

Hexagony , 61 ไบต์

แก้ไข : ขอบคุณ @Martin Ender ♦สำหรับการบันทึกฉัน 1 ไบต์จากเคล็ดลับ -1 ที่ยอดเยี่ยม!

|/'Z{>"-\..(.."/'&<'..{>-&,=+<$.{\$._{..><.Z=/...({=Z&"&@!-"

ลองออนไลน์เพื่อตรวจสอบกรณีทดสอบ!

ภาพด้านล่างนี้ไม่ได้ถูกดัดแปลง แต่การไหลนั้นเหมือนกัน โปรดทราบด้วยว่าสิ่งนี้จะส่งคืน-1หากอินพุตไม่ใช่อาร์เรย์ (เช่นไม่มี[])

ฉันไม่มีตัวเลือกมากมายใน Hexagon ... ฉันคิดว่ามันสามารถเล่นกอล์ฟได้มากขึ้นอย่างแน่นอน

คำอธิบาย

ในช่วงสั้น ๆ จะเพิ่ม-1เมื่อพบ[และเพิ่มเมื่อพบ1 ]ในที่สุดมันก็พิมพ์ค่าสูงสุดที่ได้รับ

ลองวิ่งไปตามกรณีทดสอบ 5 เพื่อดูพฤติกรรมของมันเมื่อมันวิ่งไปตามสายอักขระ[1, [[3]], [5, 6], [[[[8]]]], 1]:

มันเริ่มต้นที่จุดเริ่มต้นและรับอินพุตที่มุม W:

วงเล็บ

เนื่องจากยังมีอินพุตอยู่ (ไม่ใช่อักขระ null \0หรือ EOL) จึงตัดไปด้านบนและเริ่มต้นเส้นทางสีแดงเข้ม

นี่คือสิ่งที่เกิดขึ้นเมื่อจากที่นั่นจนถึงน่ารัก><:

,อ่าน[ในบัฟเฟอร์{และZตั้งค่า Z คงที่เป็น 90 'เลื่อนไปที่ Diff และ-คำนวณความแตกต่าง สำหรับ[และ]ความแตกต่างจะเป็น1และ3ตามลำดับ สำหรับตัวเลขและช่องว่างและเครื่องหมายจุลภาคมันจะเป็นค่าลบ

M1 M2

จากนั้นเราจะดำเนินการ(สองครั้ง (ครั้งเดียวในตอนท้ายของเส้นทางสีแดงเข้มคนหนึ่งที่เริ่มต้นหลังจากที่การตัดเส้นทางสีเขียว) ที่จะได้รับ-1และ1รับผิดชอบสำหรับการและ[ ]ที่นี่เราเปลี่ยนการตั้งชื่อให้กับDiff Valueเพิ่มค่านี้เป็นความลึก (ฉันใช้Z&เพื่อให้แน่ใจว่ามันคัดลอกเพื่อนบ้านที่ถูกต้อง) จากนั้นเราจะคำนวณและได้รับหมายเลขบนขอบหน่วยความจำlastMin - DepthminLR

จากนั้นเราจะนำไปใช้&(ที่จุดสิ้นสุดของเส้นทางสีเขียว) กับminLR: หากตัวเลขคือ <= 0 จะเป็นการคัดลอกค่าที่เหลือ (เช่นlastMin - Depth <= 0 => lastMin <= Depth) มิฉะนั้นจะใช้ค่าที่ถูกต้อง

เราตัดไปยังเส้นทางสีฟ้าแนวนอนและที่เราเห็นอีกครั้งซึ่งสำเนาZ& minLRจากนั้นเรา"&และทำสำเนาของการคำนวณขั้นต่ำ วงเล็บจะถือว่ามีความสมดุลดังนั้น min จะต้องเป็น <= 0 หลังจากห่อแล้วเส้นทางสีฟ้าก็จะไปทางซ้ายและถูกยิง(ทำให้การคัดลอก1น้อยกว่านาทีจริง การนำ-เราได้สร้างอีกหนึ่ง 1 ออกสำเนาเป็นเพื่อนบ้านของบัฟเฟอร์:

M3

หมายเหตุ: copyถูกเปลี่ยนชื่อเป็น1-off

เมื่อเส้นทางสีน้ำเงินกระทบ\และมีความสุข"และ<จับมันกลับไปที่วงหลัก

เมื่อฮิตวง1, ,หรือหรือตัวเลขอื่น ๆ เช่นการป้อนข้อมูล:

คนอื่น ๆM4

ดิฟจะกลายเป็นลบและมันจะสะท้อนกลับไปที่ลูปหลักสำหรับอินพุตถัดไป

เมื่อทุกอย่างผ่านลูปหลักเราจะไปถึง EOL ซึ่งจะทำให้บัฟเฟอร์-1และในที่สุดก็ไปที่ขอบด้านล่าง:

M5

'ย้าย MP ไปที่1-off copyและ)เพิ่มขึ้นและด้วยการ~ปฏิเสธจะได้รับค่าความลึกสูงสุดที่ถูกต้องซึ่งพิมพ์ด้วย!

@และเรื่องนี้จบลงด้วย

ฉันคิดว่าฉันต้องมีสิ่งที่ซับซ้อนเกินกว่าเล็กน้อย หากฉันต้อง "ย้อนกลับ" และ "พิมพ์" โดยไม่เพิ่มและปฏิเสธเท่านั้นฉันจะได้รับการบันทึก 2 ไบต์โดยไม่ต้องใช้ Hexagon แบบเต็ม

ขอบคุณที่ดีในการTimwiสำหรับลึกลับ IDEและHexagony Colorer !


คุณสามารถบันทึกไบต์ด้วยการใช้-1จาก,โดยการเปลี่ยนแถวสุดท้ายเป็น: @!-".(แม้ว่าฉันยอมรับว่ามันอาจเป็นไปได้ที่จะโกนทิ้งมากขึ้นหรือปรับให้เหมาะกับความยาวด้าน 4 ด้วยการปรับโครงสร้างบางส่วน)
Martin Ender

ยังไม่ได้คิดที่จะใช้ -1! จะแก้ไขเมื่อฉันได้คอมพิวเตอร์มา หากอุณหภูมิอยู่บนเพื่อนบ้านซ้ายผมจะได้บันทึกไว้ค่อนข้างน้อยจากการใช้Z Z&และควรมีวิธีที่ดีกว่าในการเริ่มต้นโปรแกรมโดยนัยถ้า
Sunny Pun

2

brainfuck, 48 ไบต์

,[<++[>-<------]>++[+[<]>>[-]]+<,]-[<[>+<-]>>]<.

จัดรูปแบบ:

,
[
  <++[>-<------]>++
  [
    not close paren
    +
    [
      not open paren
      <
    ]
    >>[-]
  ]
  +<,
]
-[<[>+<-]>>]
<.

จะเข้าในรูปแบบ(1, ((3)), (5, 6), ((((8)))), 1)และผลค่าไบต์

ลองออนไลน์

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


โซลูชัน 69 ไบต์ก่อนหน้าโดยใช้วิธีการอื่น:

,
[
  >>++[<<->>------]<-<++
  [
    not close paren
    >++<+
    [
      not open paren
      >-<[-]
    ]
  ]
  <
  [
    [>+>]
    <[<-<]
    >
  ]
  >>[<+> >+<-]
  ,
]
<.

ในรุ่นนี้ความลึกและความลึกสูงสุดจะถูกเก็บไว้ในเซลล์อย่างชัดเจน


1

Pyth, 15 13 ไบต์

-2 ไบต์โดย @Maltysen

eSm-F/Ld`Y._z

นับความแตกต่างระหว่างการนับสะสมของ[และ], และใช้เวลาสูงสุด Yคืออาร์เรย์ที่ว่างเปล่าและการเป็นตัวแทนสตริง ( `) []เป็นสิ่งอำนวยความสะดวก

ลองมันนี่


บิวด์อินความยาวได้รับอนุญาตในตอนนี้ถ้ามันช่วยได้
Martin Ender

1

CJam, 19 22 23ไบต์

0l{_91=\93=-+_}%:e>

แนวคิดที่คล้ายกับคำตอบ MATL ของฉัน

ขอบคุณ Peter Taylor ที่ลบ 3 ไบต์

ลองที่นี่

0                            push a 0
l                            read line as string
{            }%              map this block on the string
  _91=\93=-                  1 if it's an opening bracket, -1 if closing
           +_                cumulative sum
               :e>           fold maximum function

1

Perl 5, 34 ไบต์

32, บวกสองสำหรับ -p

{s&]\[|[^][]&&g&&redo}$_=@a=/]/g

ขโมยมาจากดิจิตอลบาดเจ็บ 's คำตอบ Retina ... ซึ่งเป็น 26% สั้นกว่านี้:-)

หรือเท่าเทียมกัน:

{s&]\[|[^][]&&g&&redo}$_=y///c/2

@Cyoce ทำไม ]ไม่จำเป็นต้องหลบหนียกเว้นในวงเล็บ
msh210

@Cyoce s&...&...&gเป็นผู้ดำเนินการทดแทน ดูperldoc.perl.org/perlop.html
msh210

1

Ruby, 51 ตัวอักษร

(เริ่มต้นเป็นข้อเสนอแนะการปรับปรุงสำหรับคำตอบ RubyของDoorknobแต่จบลงแตกต่างกันดังนั้นฉันโพสต์มันเป็นคำตอบที่แยกต่างหาก Upvotes สำหรับแนวคิดการนับความลึก ( จากมากไปน้อย) ควรไปที่คำตอบดั้งเดิม)?\\<=>$&'] ['.index(c)

m=i=0
gets.gsub(/\[|\]/){m=[m,i+=?\\<=>$&].max}
p m

อินพุต: สตริง, เอาต์พุต: หมายเลข

วิ่งตัวอย่าง:

bash-4.3$ ruby -e 'm=i=0;gets.gsub(/\[|\]/){m=[m,i+=?\\<=>$&].max};p m' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
6

1

Perl 6, 53 ไบต์

ปิด:

{my ($m,$d);/[\[{$d++;$m=max $m,$d}|\]{$d--}|.]*/;$m}

ต้องการอาร์กิวเมนต์เช่น:

{my ($m,$d);/[\[{$d++;$m=max $m,$d}|\]{$d--}|.]*/;$m}("[[[3]][2]]")
3

คำอธิบาย:

{ my ($m,$d);                 # start closure, declare variables    

  /                           # start regex match

   [                          # start (non-capturing) group

     \[ {$d++;$m=max $m,$d} | # match [ and track depth; OR

     \] {$d--}              | # match ] and track depth; OR

     .                        # match one character

   ]*                         # repeat group

  /;                          # end regex

  $m                          # return max depth
}

1

Minkolang 0.15 , 31 29 24 ไบต์

ปรับปรุงอัลกอริทึมของฉันโดยรับแรงบันดาลใจจากคำตอบ CJam ของ Luis Mendoและบันทึกไว้ 5 ไบต์!

od5&j$ZN.d"["=$r"]"=~++d

ลองที่นี่!

คำอธิบาย

โดยพื้นฐานแล้วสิ่งที่รหัสนี้จะเก็บไว้รวมกับ +1 สำหรับแต่ละ[และ -1 สำหรับแต่ละ]การติดตามของค่าสูงสุดถึงการส่งออกสูงสุดในตอนท้าย การวนรอบนั้นจัดการโดยธรรมชาติของกล่องรหัสของ Minkolang

od           Take character from input and duplicate it (0 if input is empty)
  5&         Pop top of stack and skip the following five spaces if 0
    j$Z      Push the maximum value of the stack
       N.    Output as number and stop.

  d                  Duplicate top of stack for character tests
   "["=              +1 if the character is [
       $r            Swap top two items of stack
         "]"=~       -1 if the character is ]
              ++     Add twice
                d    Duplicate top of stack for the running total

1

Ruby, 41 ตัวอักษร

f=->a,d=1{a.map{|e|f[e,d+1]rescue d}.max}

พารามิเตอร์: array, return: number

วิ่งตัวอย่าง:

2.1.5 :001 > f=->a,d=1{a.map{|e|f[e,d+1]rescue d}.max}
 => #<Proc:0x0000000214d258@(irb):1 (lambda)> 

2.1.5 :002 > f[[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]]
 => 6 

1

Oracle SQL 11.2, 133 ไบต์

SELECT MAX(d)FROM(SELECT SUM(DECODE(SUBSTR(:1,LEVEL,1),'[',1,']',-1,0))OVER(ORDER BY LEVEL)d FROM DUAL CONNECT BY LEVEL<=LENGTH(:1));

ยกเลิกแข็งแรงเล่นกอล์ฟ

SELECT MAX(d)
FROM   (
         SELECT SUM(DECODE(SUBSTR(:1,LEVEL,1),'[',1,']',-1,0))OVER(ORDER BY LEVEL) d 
         FROM   DUAL 
         CONNECT BY LEVEL<=LENGTH(:1)
       );

กระบวนการ CONNECT BY สร้างหนึ่งแถวต่ออักขระในสตริงอินพุต

SUBSTR แยกตัวอักษรที่สอดคล้องกับหมายเลขแถว

DECODE แปลแต่ละ '[' เป็น 1, แต่ละ ']' เป็น -1 และอักขระอื่น ๆ ทั้งหมดเป็น 0

ผลรวมการวิเคราะห์ผลรวม 1, 1 และ 0 จากแถวก่อนหน้ารวมทั้งแถวปัจจุบัน

จำนวน MAX เป็นความลึก


1

Java 8, 95

ToIntFunction<String>นี่คือการแสดงออกแลมบ์ดาหา อินพุตถูกใช้เป็น a Stringในรูปแบบตัวอย่างของ OP

s->{int d=e=-1;for(String t:s.split("[")){d=++e>d?e:d;e-=t.split("]",-1).length()-1;}return d;}

ค่อนข้างตรงไปตรงมา แยกสตริงโดยใช้[เป็นตัวคั่น สำหรับแต่ละของพวกเขาเพิ่มตัวนับeและเปรียบเทียบกับตัวนับdทำให้ใหญ่dขึ้น จากนั้นแยกสตริงซ้ำปัจจุบันใช้เป็นตัวคั่นเวลานี้และลบจำนวนแยกพิเศษจาก]e

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