ค้นหา "ขนาดที่ไม่ได้ห่อ" ของรายการ


12

มากำหนดฟังก์ชั่น "ขนาดที่ไม่ได้ห่อ" uของรายการซ้อนl(มีเพียงรายการ) โดยกฎต่อไปนี้:

  • ถ้าlว่างแล้วก็u(l)คือ 1
  • หากlไม่ว่างเปล่าu(l)เท่ากับผลรวมของขนาดที่ยังไม่ได้เปิดของทุกองค์ประกอบในlบวกอีกหนึ่ง

งานของคุณคือการเขียนโปรแกรม (หรือฟังก์ชั่น) ที่ใช้รายการเป็นอินพุตและเอาต์พุต (หรือส่งคืน) ขนาดที่ไม่ได้ตัดทิ้งของรายการ

กรณีทดสอบ:

[]                                           ->  1
[[[]],[]]                                    ->  4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]]                                     ->  4

นี่คือดังนั้นโปรแกรมที่สั้นที่สุด (เป็นไบต์) จะชนะ


2
สามารถนำเข้าเป็นสตริงเช่นมีเครื่องหมายคำพูดล้อมรอบ? เราสามารถใช้()แทนได้[]หรือไม่
Luis Mendo

เราสามารถใส่รูปแบบนี้[[[]][]]แทนสิ่งนี้[[[]],[]]ในตัวอย่างที่สองของคุณได้ไหม?
Mukul Kumar

ขนาดของ["This is some text [with square brackets in] ...[& maybe more than one pair]"]คืออะไร?
Jonathan Allan


2
@DrMcMoylex ฉันไม่เห็นด้วย ในขณะที่การนับจำนวน]ดูเหมือนจะเป็นทางออกที่สั้นที่สุดในหลายภาษา แต่ก็มีคำตอบมากมายที่จริง ๆ แล้วแก้ปัญหานี้ผ่านการจัดการรายการ การเกิดขึ้นของอักขระอินพุต
Martin Ender

คำตอบ:


23

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

]

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

ตามค่าเริ่มต้น Retina จะนับจำนวนการแข่งขันของ regex ที่กำหนดในอินพุต ขนาดยังไม่ได้เปิดเป็นเพียงเท่ากับจำนวนของคู่ในการป้อนข้อมูลและดังนั้นจึงยังหมายเลขของ[]]


1
เครื่องมือที่เหมาะสมสำหรับงาน!
Cyoce

@MartinEnder คุณเคยเพิ่มฟังก์ชั่นใหม่ในภาษาของคุณเพื่อประหยัดไบต์ในคำถาม codegolf หรือไม่?
lois6b

5
@ lois6b ไม่ย้อนหลัง แต่ฉันปรับปรุงภาษาเป็นครั้งคราวเพื่อให้มีประสิทธิภาพมากขึ้นสำหรับการใช้ในอนาคต ที่กล่าวว่าคำตอบนี้จะได้ทำงานในรุ่นแรกของ Retina ตั้งแต่เมื่อมันเป็นเพียงวิธีการเรียกใช้ regex เดียว (/ ทดแทน) กับการป้อนข้อมูลโดยไม่ต้องใช้ค่าใช้จ่ายเกี่ยวกับวากยสัมพันธ์
Martin Ender

11

Mathematica ขนาด 9 ไบต์

LeafCount

ปรากฎว่ามีในตัวสำหรับการที่ ...

โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากรายการมีองค์ประกอบที่ไม่ใช่รายการจริงๆ สิ่งที่เป็นLeafCountจริงนับจำนวน subexpressions อะตอม สำหรับอินพุต{{}, {{}}}นิพจน์อ่านจริง:

List[List[], List[List[]]]

นี่ subexpressions อะตอมเป็นจริงหัว List


1
Mathematica มีทุกสิ่งในตัวสำหรับ ...
kirbyfan64sos


7

Brainfuck, 71 61 59 ไบต์

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

รับอินพุตจาก STDIN ในรูปแบบที่กำหนดในคำถามและส่งออกอักขระที่มีรหัส ASCIIเป็นขนาด "รายการที่ไม่ได้เปิด"

ฉันยังเป็นมือสมัครเล่นที่ Brainfuck ดังนั้นจึงมีความเป็นไปได้หลายอย่างที่ยังสามารถทำได้

ลองออนไลน์!

Ungolfed:

read input to tape
>>+[>,]<
current tape: (0 0 1 a b *c)
where abc represents input and * is IP

now we loop over each character (from the end)
this loops assumes we are starting on the (current) last char
and it zeroes the entire string by the time it finishes
[

  subtract 91 from this character
  technically we only subtract 85 here and correct the answer
  with the 6 minus signs below
  >-[<->---]
  current tape: (0 0 1 a b cminus91 *0)

  invert the result and put that in the next cell
  +<------[->[-]<]>
  current tape: (0 0 1 a b 0 *c==91)

  move that result back to the original cell
  [-<+>]<
  current tape: (0 0 1 a b *c==91)

  if the result is true we found a brace
  increment the very first cell if so
  [-<[<]<+>>[>]]<
  current tape: (count 0 1 a *b)

]
current tape: (count *0)

<.

5

JavaScript (ES6), 29 27 ไบต์

f=([x,...a])=>x?f(x)+f(a):1

ฉันรักมันเมื่อการเรียกซ้ำกลายเป็นสิ่งนี้อย่างหมดจด นี่เป็นการค้นหาอินพุทครั้งแรกโดยการเพิ่ม 1 เมื่อถึงจุดสิ้นสุดของอาร์เรย์

หากอาร์เรย์ว่างเปล่าเท็จใน JS อาจเป็น 24 ไบต์:

f=a=>a?f(a.pop())+f(a):1

แต่อนิจจาไม่ใช่ ความพยายามอื่น ๆ :

f=a=>a.reduce((n,x)=>n+f(x),1) // Works, but 3 bytes longer
f=a=>a.map(x=>n+=f(x),n=1)&&n  // Works, but 2 bytes longer
f=a=>(x=a.pop())?f(x)+f(a):1   // Works, but 1 byte longer
f=a=>a[0]?f(a.pop())+f(a):1    // Works, but same byte count
f=a=>a+a?f(a.pop())+f(a):1     // Doesn't work on any array containing 1 sub-array
f=a=>a-1?f(a.pop())+f(a):1     // Same

จะf=a=>a[0]?f(a.pop())+f(a):1ทำงานอย่างไร (นับจำนวนไบต์เดียวกัน)
Neil

@ Neil ใช่นั่นเป็นหนึ่งในวิธีการแก้ปัญหาที่ฉันได้ลองมาแล้ว ฉันไม่คิดว่าเป็นไปได้ที่จะสั้นกว่านี้ ...
ผลิตภัณฑ์ ETH

(โดยวิธีการที่ฉันจะได้ไปสำหรับฟุ่มเฟือยf=a=>a.reduce((n,a)=>n+f(a),1)ตอนนี้f=(n,a)=>n+a.reduce(f,1)เป็นเพียง 24 ไบต์ แต่น่าเศร้าที่พารามิเตอร์อยู่ในลำดับที่ผิด)
Neil

@ Neil ฉันได้ทำจริงก่อนยกเว้นการทำให้สั้นลง 1 byte:f=a=>a.map(a=>n+=f(a),n=1)&&n
ETHproductions

อาขอโทษฉันไม่ได้คิดที่จะเรียกดูประวัติการแก้ไข
Neil

4

Perl, 9 8 7 + 1 = 8 ไบต์

ต้องใช้-pธง

$_=y;[;

ขอบคุณ @Dada สำหรับการบันทึกสองไบต์ (ฉันชอบเซมิโคลอนนี้ใช้ประโยชน์ btw)


1
-pเพื่อบันทึก 1 ไบต์;)
Dada

คุณสามารถใช้y;[;เพื่อบันทึกอีกหนึ่งไบต์
Dada


3

05AB1E , 4 ไบต์

I'[¢

I    Get input as a string
 '[¢ Count the opening square brackets and implicitly print them

ลองออนไลน์!

ฉันคิดว่ามันสามารถตีกอล์ฟได้มากกว่านี้ แต่ 'ฉัน' นั้นจำเป็นต้องใช้มิฉะนั้นข้อมูลจะถูกพิจารณาว่าเป็นอาร์เรย์จริงแทนที่จะเป็นสตริง


2
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"ในอินพุตลบIข้อกำหนดนั้นแม้ว่าฉันจะไม่รู้ว่าได้รับอนุญาตหรือไม่
Magic Octopus Urn

1
@carusocomputing: ขณะนี้ยังไม่ได้รับอนุญาต แต่อาจมีการเปลี่ยนแปลง (ฉันเห็นหลุยส์ถามคำถามเดียวกันกับ OP)
Emigna

ข้างหน้า 14 ชั่วโมงก่อนฉัน
Oliver Ni

3

เขาวงกต 8 ไบต์

&-
#,(/!

ลองออนไลน์!

คำอธิบาย

นี่จะนับวงเล็บเปิดด้วยเวทมนตร์บิตบิต ถ้าเราพิจารณาผลของการรหัสอักขระของบิตและของ[, ,และ]ด้วยการ2ที่เราได้รับ:

[ , ]
2 0 0

ดังนั้นหากเราสรุปผลการดำเนินการนี้สำหรับตัวละครแต่ละตัวเราจะได้ค่าที่เราต้องการเป็นสองเท่า

สำหรับโค้ดนั้นบล็อก 2x2 ที่จุดเริ่มต้นคือลูปขนาดเล็ก ในการทำซ้ำครั้งแรก&-ไม่ได้ทำอะไรเลยยกเว้นว่าพวกเขาวางศูนย์ที่ชัดเจนด้านบนของคนที่อยู่โดยนัยที่ด้านล่างของสแต็ค นี่จะเป็นผลรวมสะสม (และจริง ๆ แล้วจะเป็นค่าลบเพื่อบันทึกไบต์ในภายหลัง) จากนั้นลูปจะเป็นดังนี้:

,   Read character. At EOF this gives -1 which causes the instruction pointer to
    leave the loop. Otherwise, the loop continues.
#   Push the stack depth, 2.
&   Bitwise AND.
-   Subtract from running total.

เมื่อเราออกจากลูปบิตเชิงเส้นต่อไปนี้จะถูกดำเนินการ:

(   Decrement to turn the -1 into a -2.
/   Divide negative running total by -2 to get desired result.
!   Print.

จากนั้น IP ก็โจมตีคนตายและหันหลังกลับ เมื่อพยายามที่จะดำเนินการ/อีกครั้งโปรแกรมจะหยุดทำงานเนื่องจากการพยายามหารด้วยศูนย์


3

Python 3 2, 36 23 ไบต์

lambda x:`x`.count("[")

ฉันสังเกตเห็นว่าu(l)เท่ากับจำนวน[ในการเป็นตัวแทนสตริงlดังนั้นโปรแกรมนี้พยายามทำเช่นนั้น มันอาจจะถูกตีกอล์ฟต่อไปโดยการหาวิธีอื่นในการทำเช่นนี้แม้ว่า ...


6
23 ไบต์:lambda x:`x`.count("[")
acrolith


2

C #, 46 41 ไบต์

int u(string l){return l.Count(c=>c=='[');}

l คือสตริงของรายการที่ซ้อนกัน ทดสอบได้ที่นี่


ใช้ช่องว่าง 4 (ก่อนรหัส) สำหรับการจัดรูปแบบลงในบล็อกรหัส
user41805

@KritixiLithos อ๊ะฉันลืมที่จะทำอย่างถูกต้อง ขอขอบคุณที่ชี้ออก :)
Ave

และนี่ต้องเป็นโปรแกรมหรือฟังก์ชั่นนี่ไม่ใช่
user41805

@KritixiLithos อุ๊ปส์ขอบคุณสำหรับการชี้ให้เห็นแค่แก้ไขมัน
Ave

2
คุณสามารถปล่อยวงเล็บปีกกาและreturnโดยใช้ฟังก์ชั่นการแสดงออกของร่างกาย นอกจากนี้charโดยปริยายปลดเปลื้องเพื่อintให้คุณสามารถใช้91แทน'[': นอกจากนี้คุณอาจลดลงลายเซ็นของฟังก์ชั่นและใช้วิธีการแลมบ์ดา:int u(string l)=>l.Count(c=>c==91); l=>l.Count(c=>c==91);
นม


2

Ruby, 13 (+1) ไบต์

p $_.count ?[

เรียกว่าด้วยการ-nโต้แย้ง:

ruby -ne 'p $_.count ?['

แก้ไข: เปลี่ยนเพื่อพิมพ์คำตอบจริง


ดูเหมือนจะไม่พิมพ์อะไรเลย (ยกเว้นกรณีนี้เป็นคำตอบ REPL ซึ่งในกรณีนี้ควรระบุภาษาเป็น Ruby REPL)
Martin Ender

@Martin Ender ♦ข้อกำหนดอนุญาตให้คืนค่าแทนการพิมพ์ได้
Lee W

นั่นหมายถึงการส่งฟังก์ชั่น เช่น->s{s.count ?[}จะเป็นการส่งที่ถูกต้อง
Martin Ender

นั่นเป็นกฎทั่วไปหรือไม่?
Lee W



2

Brain-Flak , 63 , 61 bytes

{({}[(((()()()){}){}()){({}[()])}{}]){{}(<>{}())(<>)}{}}<>

ลองออนไลน์! โค้ด 58 ไบต์และ +3 สำหรับ-aแฟล็กที่เปิดใช้งานอินพุต ASCII

เวอร์ชัน / คำอธิบายที่สามารถอ่านได้:

#While non-empty:
{

    #subtract
    ({}[

    #91
    (((()()()){}){}()){({}[()])}{}

    ])

    #if non-zero
    {

        # Remove the difference
        {}

        #Increment the counter on the other stack
        (<>{}())

        #Push a zero onto the main stack
        (<>)
    }

    #pop the left-over zero
    {}

#endwhile
}

#Move back to the stack with the counter, implicitly display
<>



1

PHP, 35 ไบต์

<?=preg_match_all('/\[/',$argv[1]);

preg_match_all ค้นหาอินสแตนซ์ที่ตรงกันทั้งหมดของนิพจน์ทั่วไปและส่งคืนตัวเลขซึ่งเป็นสาเหตุที่ต้องการแท็ก echo สั้น ๆ

เช่นเดียวกับคำตอบส่วนใหญ่มันจะนับจำนวนของ[อินพุทและเอาท์พุทจำนวนนั้น


1
หากคุณใช้]แทนคุณ[จะไม่ต้องหลบหนี
Martin Ender

2
count_chars()[91];ทำสิ่งเดียวกัน แต่สั้นกว่ามาก
user59178

1

แร็กเก็ต 82 ไบต์

(define n 0)(let p((l l))(if(null? l)(set! n(+ 1 n))(begin(p(car l))(p(cdr l)))))n

Ungolfed:

(define (f l)
  (define n 0)
  (let loop ((l l))
    (if (null? l)
        (set! n (add1 n))
        (begin (loop (first l))
               (loop (rest l)))))
  n)

การทดสอบ:

(f '[]) 
(f '[[[]] []]) 
(f '[[[]] [[[[]] []]] [[[]] [[[[]] [[] [[]]]]]]]) 
(f '[[[[]]]])  

เอาท์พุท:

1
4
19
4

1

V , 10 ไบต์

ÓÛ
ÒC0@"

ลองออนไลน์!

มีอักขระที่ไม่สามารถพิมพ์ได้บางส่วนนี่เป็นรุ่นที่อ่านได้:

ÓÛ
Ò<C-a>C0<esc>@"

<C-a>หมายถึง "ctrl-a" (ASCII 0x01) และ<esc>แสดงถึงคีย์ยกเว้น (ASCII 0x1b)

ÓÛ              " Remove all '['s
                "
Ò<C-a>          " Replace what's left with '<C-a>' (the increment command)
      C         " Delete this line
       0<esc>   " And replace it with a '0'
             @" " Run what we just deleted as V code (A bunch of increment commands

สนุกมากขึ้นรุ่นที่ตีกอล์ฟน้อยลง:

o0kòf]m`jòd

ลองออนไลน์!

o0<esc>                     " Put a '0' on the line below us
       k                    " Move back up a line
        ò               ò   " Recursively:
         f]                 "   Move to a right-bracket
           m`               "   Add this location to our jumplist
             j              "   Move down a line
              <C-a>         "   Increment this number
                   <C-o>    "   Move to the previous location
                         d  " Delete the bracket line
                            " Implicitly display

1

สกาลา 15 ไบต์

s=>s.count(92<)

Ungolfed:

s=>s.count(c=>92<c)

countนับว่าหลายองค์ประกอบตอบสนองความมูลฐานในกรณีนี้92<ซึ่งเป็นวิธีการของ<92


1

O , 15 ไบต์

i~{1\{nJ+}d}J;J

ลองที่นี่!

ในอินพุตคอมมาใด ๆ ต้องถูกลบหรือแทนที่ด้วยช่องว่าง

คำอธิบาย

i~{1\{nJ+}d}J;J
i                Read a line of input.
 ~               Evaluate it.
  {        }J;   Define a function and save it into the `J` variable.
                 Currently, the input array is at the top of the stack.
   1\            Push 1 and swap it with the input array.
     {   }d      For each element in the array...
                 Because the array was popped by `d`, 1 is at the TOS.
      nJ+        Recurse and add the result to 1.
              J  Initiate the function call.
                 The result is printed implicitly.

หากเราได้รับอนุญาตให้ทำงานกับสตริง: 10 ไบต์

ie\']-e@-p

1

> <> , 21 20 18 ไบต์

0i:0(90.;n?|3%0=+!

แก้ไข: คะแนน 1 สำหรับงบ goto!

แก้ไข 2: เห็นได้ชัด> <> แตกต่างจาก Befunge ซึ่งจะช่วยให้ชดเชย IP ที่ไม่เป็นศูนย์หลังจากห่อ (ในคำอื่น ๆ โดยใช้คำแนะนำ trampoline ฉันสามารถห่อ (1, 0) แทน (0, 0) น่าสนใจ

TryItOnline!


1

Brainfuck, 28 ไบต์

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

ลองออนไลน์

นี่จะนับจำนวนอักขระอินพุตที่หารด้วย 3 ได้เช่นจำนวน]อักขระ

วิธีการนับ[อักขระ34 ไบต์วิธีอื่นโดยตรงและขึ้นอยู่กับเซลล์ 8 บิต:

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

1

C, 48 46 ไบต์

บันทึกสองไบต์ด้วย kirbyfan64sos

i;f(char*v){for(i=0;*v;i+=*v++==91);return i;}

i;f(char*v){for(i=0;*v;*v++^91?0:i++);return i;}

รหัสทดสอบ

main()
{
    printf("%d\n", f("[]"));
    printf("%d\n", f("[[[]] []]"));
    printf("%d\n", f("[[[]] [[[[]] []]] [[[]] [[[[]] [[] [[]]]]]]]"));
}

กรณีทดสอบ

a.exe
1
4
19

เปลี่ยน*v++^91?0:i++เป็นi+=*v==91บันทึก 3 ไบต์
kirbyfan64sos

@ kirbyfan64sos ขอบคุณ! ฉันยังต้องเพิ่ม v แต่ฉันสามารถใช้i+=*v++==91เพื่อบันทึกสองไบต์
cleblanc

1

tiffanyisp repl, 39 ไบต์

(d u(q((L)(i L(s(u(h L))(s 0(u(t L))))1

กำหนดฟังก์ชั่นuที่สามารถเรียกได้ว่าชอบ(u (q ((())()) ))(สำหรับกรณีทดสอบที่สอง) การทำเช่นนี้ใน repl จะบันทึก 4 ไบต์เนื่องจากวงเล็บปิดอัตโนมัติ

คำอธิบาย

(d u                                      )  Define u as
    (q                                   )    the following, unevaluated
      (                                 )     list (which acts as a function in tinylisp):
       (L)                                   Given arglist of one element, L, return:
          (i L                         )     If L (is nonempty):
              (s(u(h L))             )        Call u on head of L and subtract
                        (s 0        )          0 minus
                            (u(t L))           call u on tail of L
                                      1      Else, 1

การx-(0-y)สร้างเป็นสิ่งจำเป็นเนื่องจาก tinylisp ไม่ได้มีฟังก์ชั่นเพิ่มเติมในตัวการลบเท่านั้น



1

Haskell, 20 19 17 ไบต์

f s=sum[1|']'<-s]

ลองออนไลน์!

รับรายการเป็นสตริงและทำให้1ในรายการสำหรับแต่ละ]แล้วจำนวนมากขึ้นทุก1วินาที


รุ่นพอยต์: (19 ไบต์)

length.filter(>'[')

ถือว่า, [ ]เป็นตัวอักษรเฉพาะในสตริง กรองรายการเพื่อให้ได้ตัวอักษรทั้งหมดที่มากกว่า[ซึ่งทั้งหมด]และส่งคืนความยาว

การใช้งาน:

Prelude> length.filter(=='[')$"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
19

0

Bash + coreutils, 29 ไบต์

f()(echo $1|tr -d -c [|wc -c)

คุณสามารถลบส่วนใหญ่ของสิ่งนี้และเพียงทำtr -d -c [|wc -cซึ่งโดยปกติจะอ่านรายการจากอินพุตมาตรฐาน
kirbyfan64sos

0

DASH , 14 ไบต์

(ss[len;!> ="]

นับเพียงแค่]'s การใช้งาน:

(ss[len;!> ="]"])"[[]]"

โบนัสโซลูชั่น 15 ไบต์

a\@+1sum ->#a#0

อันนี้นับซ้ำจากรายการจริง การใช้งาน:

(f\@+1sum ->#f#0)[[]]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.