N (e (s (t))) สตริง


77

ในการ "function ซ้อน" สตริงคุณต้อง:

  • ปฏิบัติต่ออักขระตัวแรกเป็นฟังก์ชันและอักขระต่อไปนี้เป็นอาร์กิวเมนต์ของฟังก์ชันนั้น ตัวอย่างเช่นถ้าสตริงอินพุตเป็นHelloดังนั้นขั้นตอนแรกจะเป็น:

    H(ello)
    
  • จากนั้นทำซ้ำขั้นตอนเดียวกันนี้สำหรับทุกสตริงย่อย ดังนั้นเราจึงได้รับ:

    H(ello)
    H(e(llo))
    H(e(l(lo)))
    H(e(l(l(o))))
    

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ "ฟังก์ชั่นรัง" สตริง ตัวอย่างเช่นถ้าสตริงอินพุตเป็นHello world!ดังนั้นคุณควรส่งออก:

H(e(l(l(o( (w(o(r(l(d(!)))))))))))

อินพุตจะมีASCII ที่พิมพ์ได้เท่านั้นและคุณสามารถรับอินพุตและเอาต์พุตในรูปแบบที่เหมาะสม ตัวอย่างเช่น STDIN / STDOUT อาร์กิวเมนต์ของฟังก์ชันและค่าส่งคืนการอ่านและการเขียนไปยังไฟล์ ฯลฯ

เพื่อความเรียบง่ายคุณอาจสมมติว่าอินพุตจะไม่มีวงเล็บและจะไม่ว่างเปล่า

Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))

Input:
foobar
Output:
f(o(o(b(a(r)))))

Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))

Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))

Input:
a
Output:
a

Input:
42
Output:
4(2)

ตามปกติแล้วกฎเริ่มต้นและช่องโหว่ทั้งหมดของเราจะมีผลบังคับใช้และคำตอบที่สั้นที่สุดจะชนะเป็นไบต์!


21
Ahem: ข้อความนี้เกี่ยวข้องกับความท้าทายหรือไม่? :-)
wizzwizz4

12
T I L 4 2 = 8
ETHproductions

ความยาวสูงสุดสำหรับสตริงป้อนข้อมูลคืออะไร? กรณีของวิธีการแบบเรียกซ้ำ
Ferrybig

1
@ kamoroso94 You may take the input and the output in any reasonable format.รายการของตัวละครดูเหมือนสมเหตุสมผลอย่างสมบูรณ์แบบสำหรับฉัน
DJMcMayhem

1
นั่นคือรหัส Lisp ที่ดูเหมือน
caird coinheringaahing

คำตอบ:


63

Python 41 39 34 ไบต์

lambda e:"(".join(e)+")"*~-len(e)

ไอดีโอมัน

สวยด้วยตนเองอธิบาย

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


13
- เคล็ดลับนั้นเจ๋งฉันจะต้องจำไว้
Skyler

~ -trick ทำงานอย่างไร
ShadowFlame

1
@ShadowFlame -ทำให้จำนวนลบและ~บิตพลิก คุณสามารถอ่านอีกเล็กน้อยเกี่ยวกับเรื่องนี้ในหน้าเคล็ดลับ
ข้าวสาลีตัวช่วยสร้าง

1
@ShadowFlame กลไกของมันเป็นอย่างที่ WheatWidard กล่าว มันทำงานบนระบบที่ใช้โหมด twos-complement เพื่อเก็บตัวเลขติดลบ (ซึ่งเป็นระบบส่วนใหญ่ในปัจจุบัน)
นักฟิสิกส์บ้า

1
@MadPhysicist ด้วย Python มันทำงานได้เสมอเพราะ ~ ถูกกำหนดเป็น -x-1
Mega Man

45

ไฟล์ MS-DOS .com ขนาด 30 ไบต์

0000   fc be 82 00 b4 02 ac 88 c2 cd 21 ac 3c 0d 74 0d
0010   b2 28 50 cd 21 5a e8 f0 ff b2 29 cd 21 c3

สตริงถูกส่งผ่านไปยังไฟล์สั่งการโดยใช้บรรทัดคำสั่ง (อักขระเว้นวรรคหนึ่งตัวระหว่างชื่อไฟล์. COM กับสตริง)

ผลลัพธ์ถูกเขียนลงในเอาต์พุตมาตรฐาน

ถอดแยกชิ้นส่วนอยู่ที่นี่:

  fc          cld              ; Make sure DF is not set (lodsb!)
  be 82 00    mov    si,0x82   ; First character of command line args
  b4 02       mov    ah,0x2    ; AH=2 means output for INT 21h
  ac          lodsb            ; Load first character
  88 c2       mov    dl,al     ; Move AL to DL (DL is written to output)
recursiveFunction:
  cd 21       int    0x21      ; Output
  ac          lodsb            ; Get the next character
  3c 0d       cmp    al,0xd    ; If it is "CR" (end of command line) ...
  74 0d       je     doReturn  ; ... return from the recursive function
  b2 28       mov    dl,0x28   ; Output "(" next...
  50          push   ax        ; ... but save character read first
  cd 21       int    0x21      ; (Actual output)
  5a          pop    dx        ; Restore character (but in DL, not in AL)
  e8 f0 ff    call   recursiveFunction  ; Recursively enter the function
doReturn:
  b2 29       mov    dl,0x29   ; Output ")"
  cd 21       int    0x21
  c3          ret              ; Actually return

หมายเหตุ: คุณสามารถออกจากไฟล์ DOS .COM (ไม่เหมือนกับไฟล์ที่มีส่วนหัว EXE) โดยใช้คำสั่ง "RET"


ตั้งแต่ฉันไม่สามารถหาเอกสารที่เกิดขึ้นจริง ๆ หรือข้อมูลที่น่าพอใจ: ทำไมcall 0xfoff? โปรแกรมที่ถูกโหลดลงในหน่วยความจำที่อยู่0ไกลที่สุดเท่าที่ผมสามารถบอกได้ (หรือ0x100ใน CP / M-DOS แต่เหล่านี้ดูเหมือนจะเป็นคำแนะนำ x86) ทำไมrecursiveFunctionจู่ ๆ ก็ตั้งอยู่ที่0xffof? ดูเหมือนว่าจะเริ่มต้น 9 ไบต์หลังจากเริ่มต้นโปรแกรมและไม่มีการจำลองเสมือนหรือข้อมูลเมตาในการปฏิบัติการ
แมว

6
DOS โหลดไฟล์. COM ไปยังที่อยู่0x100อย่างไรก็ตามโปรแกรมนี้จะทำงานบนที่อยู่ใดก็ได้: e8 f0 ffเป็นคำสั่งการโทรที่สัมพันธ์กัน: มันจะข้ามไปยังที่อยู่ของคำสั่งหลังจากcallคำสั่งลบ 0x10
Martin Rosenau

32

JavaScript (ES6), 40 34 33 ไบต์

บันทึกแล้ว 6 ไบต์ขอบคุณ ETHproductions

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

f=([c,...s])=>s+s?c+`(${f(s)})`:c

ลองออนไลน์!


1
1/sเคล็ดลับที่ดีกับ
ETHproductions

เคล็ดลับที่ดีสุดกับ([c,...s])คุณควรเขียนคำแนะนำ
edc65

@ edc65 เพียงเพื่อความกระจ่างแล้วสิ่งนี้ได้รับการแนะนำโดย ETHproductions
Arnauld

o มีคนต้องเขียนคำแนะนำต่อไป
edc65

1
@jmingov ขอบคุณฉันรู้ จุดนี่คือการใช้ DA เพื่อแบ่งสตริงในวิธีที่สั้นมาก (สั้นกว่า. slice)
edc65

26

Brainfuck, 42 40 ไบต์

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

ลองออนไลน์!

Ungolfed:

>+[-->+[<]>-]>+     # count to 40 (ASCII for open paren)
>>                  # move to the input holder
,.                  # input the first byte and output it
,                   # input the next byte
[                   # while it's not zero
  <+                # move to the input counter and increment it
  <.                # move to the open paren and output it
  >>.               # move to the input holder and output it
  ,                 # input the next byte
]
<<+                 # move to the open paren and increment it to a close
>                   # move to the input counter
[                   # while it's not zero
  -                 # decrement it
  <.                # move to the close paren and output it
  >                 # move to the input counter
]

1
โดยปกติจะมีวิธีที่สั้นกว่าเพื่อให้ได้ค่าคงที่มากกว่าการคูณด้วย 2 ปัจจัยที่ชัดเจน
Martin Ender

อ่าดีขอบคุณ นี่คือการส่ง BF ครั้งแรกของฉัน (โปรแกรม BF แรกของฉันเลยจริงๆ) ดังนั้นฉันจึงมั่นใจว่าจะมีการปรับปรุงอื่น ๆ อีกมากมายเช่นกัน
อเล็กซ์ Howansky

คุณมีวงเล็บหนึ่งคู่ให้มาก!
Vloxxity

สิ่งนี้ทำให้วงเล็บว่างเปล่าหลังจากตัวอักษรตัวสุดท้ายของสตริง ฉันไม่ทราบว่ามีวิธีการหลีกเลี่ยงโดยไม่เพิ่ม "," หรือไม่ หน้าลูปและสลับลำดับเอาต์พุตภายในลูปซึ่งทำให้โปรแกรมยาวขึ้นสองไบต์
user59468

Ah bugger คุณพูดถูก ฉันอ่านหนังสือไม่มากพอและทำให้ตัวอักษรตัวสุดท้ายเป็นฟังก์ชันการโทรเหมือนตัวอื่น
อเล็กซ์ Howansky


17

Brainfuck, 44 ไบต์

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

อ่านทีละครั้งวาง open-paren ไว้หน้าแต่ละอันยกเว้นอันแรกวาง parens ใกล้เคียงจำนวนเท่ากันในตอนท้าย


+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]สั้นกว่าเล็กน้อย
Tesseract

16

Haskell 30 ไบต์

f[x]=[x]
f(a:b)=a:'(':f b++")"

ตัวอย่างการใช้งาน: ->f "Nest a string""N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"

ใช้ถ่านต่อไปตามด้วย(ตามด้วยโทร recursive กับทุก )แต่ถ่านแรกตามมาด้วย


2
หากเราตีความคำตอบว่าเป็น Haskell เราสามารถแก้ได้ด้วยเพียงแค่f=Data.List.intersperse '$'! ที่ช่วยให้เรา->f "Nest a string" "N$e$s$t$ $a$ $s$t$r$i$n$g"
porglezomp

แค่อยากจะบอกให้คุณรู้ว่า@fornit (เขามีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น) แนะนำให้ใช้f[]=[]เป็นกรณีฐาน instaed f[x]=[x]ของคุณ ฉันไม่คุ้นเคยกับ Haskell ดังนั้นฉันไม่รู้ว่ามันถูกต้องหรือไม่ฉันจะให้คุณตัดสิน
Dada

@Dada: ที่จะไม่ทำงานเพราะมันจะใส่เพิ่มเติม()ที่อยู่เบื้องหลังตัวอักษรตัวสุดท้ายเช่น->f "abc" "a(b(c()))"
nimi

สิ่งนี้ยังไม่จัดการกับอินพุตว่าง รุ่นที่ถูกต้องที่สั้นที่สุดที่ฉันสามารถขึ้นมาเป็น 44 f=(++).intersperse '('<*>drop 1.map(\_->')')ด้วยเทคนิคที่แตกต่างกัน:
Jon Purdy

@ JonPurdy: เราไม่ต้องจัดการกับอินพุตว่าง intersperseต้องการimport Data.Listอีก 17 ไบต์
nimi

16

เยลลี่ , 9 8 ไบต์

-1 ไบต์ขอบคุณ @Dennis (ใช้รา, แทนที่L, และทำซ้ำ, x)

j”(³”)ṁṖ

TryItOnline

อย่างไร?

j”(³”)ṁṖ - Main link: s     e.g. "code-golf"           printed output:
j        - join s with
 ”(      - literal '('           "c(o(d(e(-(g(o(l(f"
    ”)   - literal ')'
      ṁ  - mould like
   ³     - first input, s        ")))))))))"
         - causes print with no newline of z:          c(o(d(e(-(g(o(l(f
       Ṗ - pop (z[:-1])          "))))))))"            c(o(d(e(-(g(o(l(f
         - implicit print                              c(o(d(e(-(g(o(l(f))))))))

3
Btw ³ทำให้จริงแล้ว Jelly จะพิมพ์ค่าส่งคืนปัจจุบันดังนั้นคุณจึงไม่มีรายการอยู่สองรายการ
เดนนิส

13

Retina , 22 17 ไบต์

\1>`.
($&
T`(p`)_

ลองออนไลน์!

อีกวิธีหนึ่งคือ:

S_`
\`¶
(
T`(p`)_

คำอธิบาย

ฉันมักจะลืมว่ามันเป็นไปได้ที่จะพิมพ์สิ่งต่าง ๆ ไปพร้อมกันแทนที่จะเปลี่ยนทุกอย่างให้เป็นผลลัพธ์สุดท้ายและแสดงผลในครั้งเดียว ...

\1>`.
($&

ที่นี่\บอกให้ Retina พิมพ์ผลลัพธ์ของระยะนี้โดยไม่ต้องป้อนบรรทัดต่อท้าย 1>ขีด จำกัด ซึ่งหมายความว่าการแข่งขันครั้งแรกของ regex ควรจะละเว้น สำหรับสเตจนั้นมันจะแทนที่อักขระแต่ละตัว ( .) ยกเว้นอักขระแรก(ตามด้วยอักขระนั้น กล่าวอีกนัยหนึ่งมันแทรก(อยู่ระหว่างตัวละครแต่ละคู่ สำหรับอินพุตabcสิ่งนี้จะแปลงเป็น (และพิมพ์)

a(b(c

สิ่งที่เหลืออยู่คือการพิมพ์วงเล็บปิด:

T`(p`)_

สิ่งนี้ทำกับการทับศัพท์ซึ่งแทนที่(ด้วย)และลบอักขระ ASCII ที่พิมพ์ได้อื่นทั้งหมดออกจากสตริง


Dangit เร็วมาก ...
mbomb007

@ mbomb007 ... และห่างไกลจากสิ่งที่ดีที่สุด ;)
Martin Ender

13

> <> , 19 18 ไบต์

io8i:&0(.')('o&!
o

ลองออนไลน์!

คำอธิบาย

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

io                 Read and print the first character.
  8                Push an 8 (the x-coordinate of the . in the program).
   i               Read a character. Pushes -1 at EOF.
    :&             Put a copy in the register.
      0(           Check if negative. Gives 1 at EOF, 0 otherwise.
        .          Jump to (8, EOF?). As long as we're not at EOF, this is
                   a no-op (apart from popping the two coordinates). At EOF
                   it takes us to the second line.
         ')('      Push both characters.
             o     Output the '('.
              &    Push the input character from the register.
               !   Skip the 'i' at the beginning of the line, so that the next
                   iteration starts with 'o', printing the last character.

เมื่อเรากด EOF ตัวชี้คำสั่งจะจบลงที่บรรทัดที่สองและเราจะทำการoวนซ้ำพิมพ์ทั้งหมด)จนกว่าสแต็กจะว่างเปล่าและข้อผิดพลาดของโปรแกรมจะหมดไป


12

C #, 32 ไบต์

F=s=>*s+++(0<*s?$"({F(s)})":"");

แลมบ์ดานี้ต้องเป็นวิธีคงที่ฉันจะต้องนับไบต์พิเศษใด ๆ สำหรับความต้องการนั้นหรือไม่? ปกติฉันจะไม่ใช้แลมบ์ดาในการเรียกซ้ำใน C # แต่ฉันคิดว่ามันจะสั้นกว่าที่จะไม่ใช้การเรียกซ้ำ

/*unsafe delegate string Function(char* s);*/ // Lambda signature
/*static unsafe Function*/ F = s =>
    *s++                               // Take first char and increment pointer to next one
    + (0 < *s                          // Check if any chars left
        ? $"({F(s)})"                  // If so concat surrounding parens around recursion
        : ""                           // Otherwise done
    )
;

คำจำกัดความควรจะทำงานตามที่ประกาศและนับไว้
cat

11

J, 13 ไบต์

(,'(',,&')')/

J ดำเนินการจากขวาไปซ้ายเพื่อใช้คำวิเศษณ์แทรกคำ/กริยาสามารถใช้เพื่อลดตัวอักษรของสตริงป้อนเข้า

การใช้

   f =: (,'(',,&')')/
   f 'Nest a string'
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
   f 'foobar'
f(o(o(b(a(r)))))
   f '1234567890'
1(2(3(4(5(6(7(8(9(0)))))))))
   f 'code-golf'
c(o(d(e(-(g(o(l(f))))))))

คุณสามารถสังเกตเห็นผลลัพธ์บางส่วนระหว่างการลดแต่ละครั้ง

   |. f\. 'Hello'
o            
l(o)         
l(l(o))      
e(l(l(o)))   
H(e(l(l(o))))

คำอธิบาย

(,'(',,&')')/  Input: string S
(          )/  Insert this verb between each char and execute (right-to-left)
      ,&')'      Append a ')' to the right char
  '(',           Prepend a '(' to that
 ,               Append to the left char

9

R, 61 ไบต์

cat(gsub("(?<=.)(?=.)","(",x,F,T),rep(")",nchar(x)-1),sep="")

Regex ค้นหาและแทนที่ช่องว่างระหว่างอักขระด้วย "(" จากนั้นcatและrepเพิ่ม ")" n-1 ครั้งในตอนท้าย


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

8

PowerShell v2 +, 46 ไบต์

param([char[]]$a)($a-join'(')+')'*($a.count-1)

นำสายป้อน, char-array มัน-joins อาร์เรย์ร่วมกับ parens เปิด(แล้วเชื่อมกับจำนวนที่เหมาะสมของ )parens


8

Acc !! , 129 ไบต์

ไม่เลวสำหรับ tarpit ทัวริงที่ค่อนข้างละเอียด ...

N
Count i while _%128-9 {
Count x while _/128%2 {
Write 40
_+128
}
Write _%128
_+128-_%128+N
}
Count j while _/256-j {
Write 41
}

(ใช่ช่องว่างทั้งหมดนั้นเป็นข้อบังคับ)

หมายเหตุ:เนื่องจากข้อ จำกัด การป้อนข้อมูลของAcc !! มันเป็นไปไม่ได้ที่จะอ่านสตริงของตัวละครโดยไม่ต้องมีตัวคั่นที่สิ้นสุด ดังนั้นโปรแกรมนี้คาดว่าอินพุต (บน stdin) เป็นสตริงตามด้วยอักขระแท็บ

Acc !! ?

เป็นภาษาที่ฉันสร้างขึ้นซึ่งดูเหมือนจะใช้ไม่ได้เท่านั้น เพียงชนิดข้อมูลเป็นจำนวนเต็มเท่านั้นสร้างการควบคุมการไหลเป็นห่วงและวิธีเดียวที่จะเก็บข้อมูลเป็นสะสมเดียวCount x while y _อินพุทและเอาท์พุททำได้ครั้งละหนึ่งตัวอักษรโดยใช้ค่าพิเศษNและWriteคำสั่ง แม้จะมีข้อ จำกัด เหล่านี้ฉันค่อนข้างแน่ใจว่าAcc !! ทัวริงเสร็จสมบูรณ์

คำอธิบาย

กลยุทธ์พื้นฐานในAcc !! การเขียนโปรแกรมคือการใช้ mod %และการหารจำนวนเต็มในการแบ่ง/พาร์ติชั่นของคอนเซปต์ช่วยให้สามารถเก็บค่าได้หลายค่าในครั้งเดียว ในโปรแกรมนี้เราใช้สามส่วนดังกล่าวลำดับที่เจ็ดบิตต่ำสุด ( _%128) เก็บรหัส ASCII จากอินพุต; บิตถัดไป ( _/128%2) เก็บค่าแฟล็ก และบิตที่เหลืออยู่ ( _/256) นับจำนวนโคลสอัพที่เราต้องการ

อินพุตในACC !! มาจากค่าพิเศษNซึ่งอ่านตัวเดียวและประเมินเป็นรหัส ASCII คำสั่งใด ๆ ที่ประกอบด้วยการแสดงออกเพียงอย่างเดียวจะกำหนดผลลัพธ์ของการแสดงออกนั้นให้กับผู้สะสม ดังนั้นเราเริ่มจากการเก็บรหัสตัวละครตัวแรกไว้ในตัวสะสม

_%128จะจัดเก็บอักขระที่อ่านล่าสุด ดังนั้นลูปแรกจะทำงานในขณะที่_%128-9ไม่ใช่ศูนย์ - นั่นคือจนกระทั่งอักขระปัจจุบันเป็นแท็บ

ภายในวงเราต้องการพิมพ์( เว้นแต่ว่าเราจะทำซ้ำครั้งแรก ตั้งแต่ACC !! ถ้าไม่มีคำสั่งเราต้องใช้ลูปสำหรับเงื่อนไข เราใช้ตัวสะสม 128 บิต_/128%2เป็นค่าสถานะ ในรอบแรกสิ่งเดียวในแอคคูมูเลเตอร์คือค่า ASCII <128 ดังนั้นการตั้งค่าสถานะจึงเป็น 0 และข้ามการวนซ้ำ ในทุก ๆ รอบที่ผ่านมาเราจะทำให้แน่ใจว่าการตั้งค่าสถานะเป็น 1

ภายในCount xลูป (เมื่อใดก็ตามที่ตั้งค่าสถานะเป็น 1) เราเขียน paren แบบเปิด (ASCII 40) และเพิ่ม 128 ลงในแอคคิวมูเลเตอร์เพื่อตั้งค่าสถานะเป็น 0 และออกจากลูป สิ่งนี้ยังเกิดขึ้นกับการเพิ่มค่าของ_/256ซึ่งเราจะใช้เป็นจำนวนของ parens ใกล้เคียงของเราที่จะส่งออก

_%128โดยไม่คำนึงถึงความคุ้มค่าของธงที่เราเขียนถ่านป้อนข้อมูลล่าสุดซึ่งเป็นเพียง

การมอบหมายครั้งต่อไป ( _+128-_%128+N) ทำสองสิ่ง ขั้นแรกโดยการเพิ่ม 128 จะตั้งค่าสถานะสำหรับครั้งต่อไปผ่านการวนซ้ำ ประการที่สองมันเป็นศูนย์ออกจาก_%128สล็อตอ่านตัวละครอื่นและเก็บไว้ที่นั่น จากนั้นเราวนซ้ำ

เมื่อCount iวงออกมาเราเพิ่งอ่านอักขระแท็บและค่าแอคคูเลเตอร์จะแยกออกเป็นดังนี้

  • _%128: 9(อักขระแท็บ)
  • _/128%2: 1(ธง)
  • _/256: จำนวนตัวอักษรที่อ่านลบ 1

(ลบ 1 เป็นเพราะเราเพิ่ม 128 เพียงตัวสะสมหนึ่งครั้งในระหว่างการส่งผ่านครั้งแรกผ่านลูปหลัก) สิ่งที่เราต้องการในตอนนี้คือการปิดภาพ Count j while _/256-jลูป_/256หลายครั้งเขียนคำสั่งปิด (ASCII 41) ในแต่ละครั้ง Voila!


8

Java 781 79 ไบต์

1ไบต์ที่บันทึกไว้ขอขอบคุณเควิน

String f(char[]a,String b,int l){return l<a.length?f(a,b+'('+a[l],++l)+')':b;}

วิธีการเวียนเกิดที่ดี สั้นกว่า for-loop ที่ฉันจะโพสต์ +1 สองสิ่งที่คุณสามารถเล่นกอล์ฟได้: l!=a.length-> l<a.lengthและb=b+'('+a[l],++l)+')'-> b+="("+a[l],++l)+")"( -2 ไบต์ )
Kevin Cruijssen

@KevinCruijssen b+="("+a[l],++l)+")"ให้คุณ 144141148)))) และ BTW b+"("+a[l],++l)+")"ถูกต้อง และนี่เป็นความผิดพลาดของฉัน ( !=)
Numberknot

ไม่b+='('+a[l],++l)+')'ให้144141148แต่b+="("+a[l],++l)+")"ทำไม่ได้ วงเล็บถูกล้อมรอบด้วย String-quotes แทน char-quotes
Kevin Cruijssen

ฉันโพสต์รุ่นของฉัน (82 ไบต์ใน Java 7) โดยใช้พารามิเตอร์ป้อนเข้าเป็นพารามิเตอร์เท่านั้น อย่างละเอียด แต่ไม่แย่ขนาดนั้น;) หากคุณพบสิ่งที่จะเปลี่ยนแปลง: codegolf.stackexchange.com/a/96745/59739
AxelH

7

APL, 19 ไบต์

{∊('(',¨⍵),')'⍴⍨⍴⍵}

คำอธิบาย:

{
  ('(',¨⍵)          ⍝ join a ( to each character in ⍵          
          ,')'⍴⍨⍴⍵  ⍝ for each character in ⍵, add an ) to the end
 ∊                  ⍝ flatten the list 
                   }

ทางเลือกอื่น ๆ เช่น 19 ไบต์:

{⊃{∊'('⍺⍵')'}/⍵,⊂⍬}

คำอธิบาย:

{              
              ⍵,⊂⍬  ⍝ add an empty list behind ⍵ (as a base case)
  {         }/      ⍝ reduce with this function:
    '('⍺⍵')'        ⍝   put braces around input
   ∊                ⍝   flatten the list
 ⊃                  ⍝ take first item from resulting list
                   }

6
คุณซื้อแป้นพิมพ์สำหรับภาษาเช่นนี้อยู่ที่ไหน !!!
Ronan Dejhero

@RonanDejhero บางทีเพียงแค่สร้างคีย์ใหม่โดยใช้ cltr, shift, alt, capslock, numlock และอื่น ๆ อีกมากมาย
Ariana

7

MATL , 16 ไบต์

t~40+v3L)7MQ3L)h

ลองออนไลน์!

คำอธิบาย

t     % Implicit input. Duplicate
      % STACK: 'foobar', 'foobar'
~     % Negate. Transforms into an array of zeros
      % STACK: 'foobar', [0 0 0 0 0 0]
40+   % Add 40, element-wise. Gives array containing 40 repeated
      % STACK: 'foobar', [40 40 40 40 40 40]
v     % Concatenate vertically. Gives a two-row char array, with 40 cast into '('
      % STACK: ['foobar'; '((((((']
3L)   % Remove last element. Converts to row vector
      % STACK: 'f(o(o(b(a(r'
7M    % Push array containing 40 again
      % STACK: 'f(o(o(b(a(r', [40 40 40 40 40 40]
Q     % Add 1, element-wise 
      % STACK: 'f(o(o(b(a(r', [41 41 41 41 41 41]
h     % Concatenate horizontally, with 41 cast into ')'
      % STACK: 'f(o(o(b(a(r)))))'
      % Implicit display

7

Perl, 25 ไบต์

ขอบคุณ@Ton Hospelสำหรับการตีกอล์ฟขนาด 4 ไบต์

24 ไบต์ของรหัสเมือง -F+

$"="(";say"@F".")"x$#F

ความต้องการ-Fและ-Eธง:

echo -n "I love lisp" | perl -F -E '$"="(";say"@F".")"x$#F'

โปรดทราบว่าหากคุณลองใช้ Perl เวอร์ชันเก่าคุณอาจต้องเพิ่มการ-aตั้งค่าสถานะ


อีกวิธีที่น่าสนใจ (อีกหน่อย: 28 ไบต์):
ขอบคุณ Ton Hospel อีกครั้งที่ช่วยให้ฉันได้สิ่งนี้ถูกต้อง

#!/usr/bin/perl -p
s/.(?=.)/s%\Q$'%($&)%/reg

(หากต้องการใช้งานให้วางรหัสไว้ในไฟล์และเรียกใช้ด้วยecho -n "Hello" | perl nest.pl)


คุณไม่จำเป็นต้องหลังจากที่"" -Fนอกจากนี้คุณยังไม่จำเป็นต้องใช้-lถ้าคุณต้องการป้อนสตริงป้อนข้อมูลโดยไม่ต้องขึ้นบรรทัดใหม่ขั้นสุดท้าย:echo -n Hello | program
Ton Hospel

@TonHospel ใช่แล้วฉันลืม (หรือไม่ทราบไม่แน่ใจ) เกี่ยวกับพฤติกรรมที่ไม่-Fดีขอบคุณ (ฉันสงสัยว่าจะรับอินพุตได้อย่างไรโดยไม่ต้องขึ้นบรรทัดใหม่สุดท้ายขอบคุณเช่นกัน)
Dada

perl -F -E '$"="(";say"@F".")"x$#F'
Ton Hospel

คุณสามารถทำให้ความคิดอื่นของคุณทำงานร่วมกับสิ่งที่ชอบs/.(?=.)/s%$'%($&)%/regได้ แต่แน่นอนว่ามันไม่สนับสนุนสตริงที่มีอักขระเมตาของ regex
Ton Hospel

@ TonHospel ขอบคุณมากสำหรับทุกสิ่ง! (เกี่ยวกับคนที่สองฉันเพิ่ม\Qเพื่อรองรับการ metacharacters regex) :-)
Dada

6

Ruby, 27 ไบต์

->s{s.chars*?(+?)*~-s.size}

คำอธิบาย

->s{                       # Declare anonymous lambda taking argument s
    s.chars                # Get the array of chars representing s
           *?(             # Join the elements back into a string using "("s as separators
              +?)*~-s.size # Append (s.size - 1) ")"s to the end

6

Perl, 24 23 ไบต์

รวม +1 สำหรับ -p

ให้สตริงที่ STDIN โดยไม่ต้องขึ้นบรรทัดใหม่ (หรือเพิ่ม-lตัวเลือกให้กับโปรแกรม)

echo -n Hello | nest.pl

nest.pl:

#!/usr/bin/perl -p
$\=")"x s/.(?=.)/$&(/g

6

GNU sed, 37 35 31 bytes ( -rอาร์กิวเมนต์30 +1 )

โซลูชัน linux sed ที่บริสุทธิ์

:;s/([^(])([^()].*)$/\1(\2)/;t
  1. การตั้งชื่อ subsitution :; จากนั้นเรียกมันซ้ำด้วยt
  2. สร้าง 2 กลุ่ม regex:
    • กลุ่มแรกเป็นอักขระตัวแรกของอักขระต่อเนื่องสองตัวที่ไม่ใช่วงเล็บ
    • กลุ่มที่สองคืออักขระตัวที่สองติดต่อกันและส่วนที่เหลือของสตริงจนกระทั่งสิ้นสุดบรรทัด
  3. เพิ่มวงเล็บล้อมรอบกลุ่มที่สอง \1 ( \2 )

แก้ไข : ขอบคุณ @manatwork ที่ช่วยในการลบ 4 ตัวอักษร!

ผู้ทดสอบออนไลน์


2
ใช้เพียง 2 กลุ่มเท่านั้นที่เพียงพอ จับภาพที่ 2 และ 3 เข้าด้วยกัน
จัดการ

โอ้และขออภัย แต่ตัวเลือกบรรทัดคำสั่งที่จำเป็นในการเปลี่ยนพฤติกรรมเริ่มต้นของล่ามเพื่อให้รหัสของคุณทำงานต้องรวมอยู่ในการนับขนาด จำเป็นต้อง-eส่งรหัสไปยังล่ามนั้นฟรี (ตกลงsedมีความสุขหากไม่มีเช่นกัน) ดังนั้นสำหรับsed -re '…'คุณนับ +1
จัดการ

1
ป้ายกำกับที่ว่างเปล่าคือคุณลักษณะ / ข้อบกพร่องของ GNU ดังนั้นชื่ออาจจะเป็น GNU sed
Riley

6

แมงกะพรุนขนาด19 18 ไบต์

P
,+>`
_  {I
/'␁'(

ตัวละครตัวนี้เป็นตัวละครที่ควบคุม unprintable 0x1มีมูลค่าไบต์ ลองออนไลน์!

คำอธิบาย

นี่เป็นโปรแกรมแมงกะพรุนที่ค่อนข้างซับซ้อนเนื่องจากมีการใช้หลายค่าในหลาย ๆ ที่

  • I เป็นข้อมูลดิบอ่านจาก STDIN เป็นสตริง
  • '((เป็นตัวละครที่แท้จริง
  • {(ตัวตนซ้าย) ใช้เวลา'(และเป็นปัจจัยการผลิตและผลตอบแทนI '(ไม่ส่งคืนค่าที่ใช้จริง
  • `เป็นด้าย มันปรับเปลี่ยน{เพื่อกลับตัวละคร(ตัวละครของแต่ละIผลในสตริงของ(S Iกับยาวเช่นเดียวกับ
  • >เป็นหาง มันใช้สตริงของ(s เป็นอินพุตและตัดอักขระตัวแรกออก
  • +รับอาร์กิวเมนต์เป็นสตริงของ(s และไบต์ที่ไม่สามารถพิมพ์ได้และเพิ่มค่าไบต์ (1) ให้กับอักขระแต่ละตัว นี้จะช่วยให้สตริงเท่ากับความยาวของ)s การใช้อักขระรับประกันว่าค่าส่งคืนเป็นสตริงและไม่ใช่รายการจำนวนเต็ม
  • ที่มุมซ้ายล่าง/ใช้ไบต์ที่ไม่สามารถพิมพ์ได้และส่งคืนฟังก์ชันที่รับสองอาร์กิวเมนต์และรวมอาร์กิวเมนต์ที่สองกับหนึ่งในครั้งแรก (ตั้งแต่ค่าไบต์คือ 1)
  • _รับฟังก์ชั่นนี้คว้าข้อโต้แย้งของคนล่าง{(ซึ่งเป็น'(และI) และเรียกใช้ funtion กับพวกเขา แทรกตัวอักษรระหว่างคู่ของตัวละครในทุก(I
  • ,เชื่อมสตริงนี้กับ string ของ)s และPพิมพ์ผลลัพธ์

5

05AB1E , 22 21 19 18 ไบต์

¤Ug<©FN¹è'(}X®')×J

ลองออนไลน์!

คำอธิบาย:

¤Ug<©FN¹è'(}X®')×J #implicit input, call it A                                 
¤U                 #push the last letter of A, save it to X
  g<©              #push the length of A, subtract 1, call it B and save it to register_c
     F     }       #repeat B times
      N¹è          #push the Nth char of A
         '(        #push '('
            X      #push X
             ®')×  #push ')' repeated B times
                 J #join together
                   #implicit print

5

PHP, 63 ไบต์

<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")‌​");

รุ่นก่อนหน้า 64 ไบต์

<?=join("(",$s=str_split($argv[1])).str_pad("",count($s)-1,")");

1
คุณสามารถบันทึกสองไบต์โดยใช้<?=แทนecho และอีกหนึ่งถ้าคุณตั้งค่า $ s เป็นผลของการstr_splitโทรแทน$argv[1]แล้วใช้count($s)แทนstrlen($s)
Alex Howansky

2
63 ไบต์: <?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");- wordwrapจะชนะชุดค่าผสมแยก / รวม แต่น่าเสียดายที่ล้มเหลวหากอินพุตมีช่องว่าง
ติตัส

@Titus ทางเลือกที่ดีขอบคุณคุณ
JörgHülsermann

4

เป็นกลุ่ม, 17 ไบต์

$qqha(<Esc>A)<Esc>%h@qq@q

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

โดยปกติแล้วคุณจะไม่ทำเม็ดมีดสองแบบแยกกันเช่นนี้ คุณต้องการทำบางสิ่งC()<Esc>Pเพื่อประหยัด แต่ตำแหน่งนี้ใช้งานไม่ได้ในครั้งนี้


คุณสามารถใช้<End>ปุ่มในโหมดแทรกแทนการออกจากโหมดแทรกและทำA
BlackCap

@BlackCap นั่นไม่ใช่ไบต์ ฉันต้องการนับสโตรกแทนที่จะเป็นไบต์ (และ Vimgolf เป็นเกมที่ดีกว่าเมื่อคุณแบนเคอร์เซอร์เคอร์เซอร์แม้ว่าความแตกต่างที่นี่จะไม่สำคัญ)
udioica

4

Brain-Flak 103 97 Bytes

รวม +3 สำหรับ -c

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

ลองออนไลน์!


คำอธิบาย:

#reverse the stack and put a 40 between every number
{({}<><(((((()()){}()){}){}){})>)<>}<>
{                                  }   #repeat this until the stack is empty
 ({}                            )      #pop the top and push it after
    <>                                 #switching stacks and
      <(((((()()){}()){}){}){})>       #pushing a 40 (evaluated as 0) 
                                 <>    #switch back to the first stack
                                    <> #switch to the stack that everything is on now    

#put as many )s on the other stack as needed
({}                                      ) #pop the top letter and put it  back
                                           #after doing the following
                                           #This leaves ( on the top
   <                                    >  #evalute this part as 0
    ([][()])                               #push the height of the stack minus one
            {                        }    #repeat until the "height" is 0
             ({}[()()]              )     #pop the "height" and push is minus two
                      <            >      #evaluate to 0
                       (        )         #push:
                        ({})              #the top of the stack (putting it back on)
                            ()            #plus one onto
                              <>          #the other stack
                                 <>       #switch back to the other stack

                                      {}  #pop what was the height of the stack

#move the string of letters and (s back, reversing the order again
{        }     # repeat until all elements are moved
 (    )        # push:
  {}           # the top of the stack after
    <>         # switching stacks
       <>      # switch back to the other stack
          <>   # switch to the stack with the final string
            {} #pop the extra (

เอาชนะฉันให้ได้ +1
DJMcMayhem

อืมมม ฉันคิดว่าการใช้ 40 ซ้ำเพื่อหลีกเลี่ยงการผลักจำนวนเต็มขนาดใหญ่อีกครั้งจะช่วยให้คุณประหยัดจำนวนมาก แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}คือสองไบต์นานกว่า ...
DJMcMayhem

ขอบคุณที่ให้แนวคิดแก่ฉันในการนำ 40 มาใช้ใหม่ฉันได้รับมันถึง 95 + 3 ทำไมถึงมีขนาด 3 ไบต์สำหรับ-aBrain-Flak
Riley

โอ้ทำงานได้ดี! +3ไบต์เป็นมาตรฐานสำหรับธงบรรทัดคำสั่งพิเศษ ซึ่งโชคร้าย แต่มีบางอย่างที่ฉันสามารถทนได้ จริง ๆ แล้วฉันได้คิดหาวิธีที่จะทำให้สั้นลง แต่ฉันยังไม่แน่ใจ
DJMcMayhem

ปกติแล้วมันไม่ได้เป็น 2 ไบต์ หนึ่งสำหรับ-หนึ่งสำหรับธง? คุณอาจมีธงสำหรับการดำเนินการปกติเช่น Perl -eจะมี ด้วยวิธีนี้มันจะเป็น 1 ไบต์พิเศษ
Riley

4

Dyalog APL ขนาด 14 ไบต์

⊃{⍺,1⌽')(',⍵}/

นี่คือส่วนบนของและ{ }/

(รับองค์ประกอบแรก) จะถูกนำไปใช้หลังจาก{ }/(ลดแลมบ์ดา)

⍺,1⌽')(',⍵- อาร์กิวเมนต์ด้านซ้าย ( ) ต่อกันกับ ( ,) การหมุนโดยองค์ประกอบหนึ่งไปทางซ้าย ( 1⌽) ของสตริงที่')('ต่อกับ ( ,) อาร์กิวเมนต์ที่ถูกต้อง ( )

การลดลงของ APL จะลดลงจากขวาไปซ้ายตามต้องการที่นี่



3

> <> , 37 ไบต์

i:0(?\'('
$,2l~/~
/?(2:<-1$')'
>~ror:

ทีละแถว

  1. ผลักอักขระแต่ละตัวจากอินพุตโดยใช้วงเล็บเปิดหลังจากแต่ละอักขระ
  2. ลบ EOF และวงเล็บเปิดล่าสุดและผลักความยาวสแต็ก
  3. ใช้การเปรียบเทียบกับครึ่งความยาวสแต็กเพื่อดันวงเล็บปิด
  4. พิมพ์เนื้อหาของสแต็ก

ลองออนไลน์!

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