N (e (s (t))) một chuỗi


77

Để "hàm lồng" một chuỗi, bạn phải:

  • Coi ký tự đầu tiên là một hàm và các ký tự sau là đối số của hàm đó. Ví dụ: nếu chuỗi đầu vào là Hello, thì bước đầu tiên sẽ là:

    H(ello)
    
  • Sau đó, lặp lại bước tương tự này cho mỗi chuỗi con. Vì vậy, chúng tôi nhận được:

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

Nhiệm vụ của bạn là viết một chương trình hoặc hàm "hàm lồng" một chuỗi. Ví dụ: nếu chuỗi đầu vào là Hello world!, thì bạn nên xuất:

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

Đầu vào sẽ chỉ bao gồm ASCII có thể in được và bạn có thể lấy đầu vào và đầu ra ở bất kỳ định dạng hợp lý nào. Ví dụ: STDIN / STDOUT, đối số hàm và giá trị trả về, đọc và ghi vào tệp, v.v.

Để đơn giản, bạn cũng có thể cho rằng đầu vào sẽ không chứa dấu ngoặc đơn và sẽ không trống.

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)

Như thường lệ, tất cả các quy tắc và sơ hở mặc định của chúng tôi đều được áp dụng và câu trả lời ngắn nhất được ghi bằng byte sẽ thắng!


21
Ahem: Tin nhắn này có liên quan gì đến thử thách không? :-)
wizzwizz4

12
T I L 4 2 = 8
Sản phẩm ETH

Độ dài tối đa cho chuỗi đầu vào là bao nhiêu?
Áp dụng

1
@ kamoroso94 You may take the input and the output in any reasonable format.Một danh sách các nhân vật có vẻ hoàn toàn hợp lý với tôi.
DJMcMayhem

1
Vì vậy, đó là những gì Lisp mã trông giống như
Caird coinheringaahing

Câu trả lời:


63

Python, 41 39 34 byte

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

Tôi nghĩ nó

Khá tự giải thích.

Nó đặt dấu ngoặc đơn giữa mỗi ký tự khác sau đó thêm một dấu ngoặc nhỏ hơn dấu ngoặc đơn vào cuối.


13
Điều đó ~ - mẹo thật tuyệt, tôi sẽ cần phải nhớ điều đó.
Skyler

Làm thế nào để ~ -trick hoạt động?
ShadowFlame

1
@ShadowFlame -làm cho số âm và ~bit lật nó. Bạn có thể đọc thêm một chút về nó trên trang mẹo .
Thuật sĩ lúa mì

1
@Ngọn lửa bóng đêm. Các cơ chế của nó là như WheatWidard nói. Nó hoạt động trên các hệ thống sử dụng chế độ bổ sung twos để lưu trữ số âm (hầu hết các hệ thống hiện nay).
Nhà vật lý điên

1
@MadPhysicist Với ​​Python, nó luôn hoạt động, bởi vì ~ được định nghĩa là -x-1
Mega Man

45

Tệp MS-DOS .com, 30 byte

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

Chuỗi được truyền cho tệp thực thi bằng dòng lệnh. (Một ký tự khoảng trắng giữa tên tệp .COM và chuỗi).

Kết quả được ghi vào đầu ra tiêu chuẩn.

Việc tháo gỡ là ở đây:

  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

Lưu ý: Bạn có thể thoát tệp DOS .COM (không giống như các tệp có tiêu đề EXE) bằng cách sử dụng lệnh "RET".


Vì tôi không thể tìm thấy bất kỳ tài liệu thực tế hoặc thông tin thỏa đáng: tại sao call 0xfoff? Chương trình được tải vào bộ nhớ tại địa chỉ 0theo như tôi có thể nói (hoặc 0x100trên CP / M-DOS nhưng chúng có vẻ là hướng dẫn x86), tại sao recursiveFunctionđột nhiên lại nằm ở 0xffof? Nó xuất hiện để bắt đầu 9 byte sau khi bắt đầu chương trình và không có ảo hóa hoặc siêu dữ liệu trong tệp thực thi.
con mèo

6
DOS tải các tệp .COM để giải quyết 0x100tuy nhiên chương trình này thậm chí sẽ chạy trên bất kỳ địa chỉ nào: e8 f0 fflà một lệnh gọi tương đối : Nó nhảy đến địa chỉ của lệnh theo calllệnh trừ 0x10.
Martin Rosenau

32

JavaScript (ES6), 40 34 33 byte

Đã lưu 6 byte, nhờ vào ETHproductions

Một hàm đệ quy.

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

Hãy thử trực tuyến!


1
Thủ thuật hay với 1/s.
Sản xuất ETH

Thủ thuật siêu đẹp với ([c,...s])bạn nên viết một mẹo
edc65

@ edc65 Chỉ để rõ ràng, cái này được đề xuất bởi ETHproductions.
Arnauld

ồ,

1
@jmingov cảm ơn bạn, tôi biết. Vấn đề ở đây là sử dụng DA để cắt một chuỗi theo cách rất ngắn (rất ngắn so với .slice)
edc65

26

Brainfuck, 42 40 byte

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

Hãy thử trực tuyến!

Ung dung:

>+[-->+[<]>-]>+     # 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
]


Ah tốt đẹp, cảm ơn. Đây là lần gửi BF đầu tiên của tôi (thực sự là chương trình BF đầu tiên của tôi), vì vậy tôi chắc chắn có rất nhiều cải tiến khác có thể.
Alex Howansky

bạn có một cặp dấu ngoặc đến nhiều!?
Vloxxity

Điều này đặt một cặp dấu ngoặc rỗng sau ký tự cuối cùng của chuỗi. Tôi không biết có cách nào để tránh điều đó mà không thêm ",." trước vòng lặp và chuyển đổi thứ tự đầu ra bên trong vòng lặp, làm cho chương trình dài hơn hai byte.
dùng59468

Ah bugger, bạn đúng. Tôi đã không đọc đủ cẩn thận và biến bức thư cuối cùng thành một cuộc gọi như những người khác.
Alex Howansky


17

Brainfuck, 44 byte

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

Đọc một byte tại một thời điểm, đặt một paren mở trước mỗi cái trừ cái đầu tiên, đặt cùng số lượng parens gần nhau ở cuối.


+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]ngắn hơn một chút.
Tesseract

16

Haskell, 30 byte

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

Ví dụ sử dụng: f "Nest a string"-> "N(e(s(t( (a( (s(t(r(i(n(g))))))))))))".

Lấy char tiếp theo, theo sau là a (, theo sau là một cuộc gọi đệ quy với tất cả trừ char đầu tiên, theo sau là a ).


2
Nếu chúng ta diễn giải các câu trả lời là Haskell, chúng ta có thể giải quyết nó chỉ bằng f=Data.List.intersperse '$'! Điều đó cho chúng ta f "Nest a string"-> "N$e$s$t$ $a$ $s$t$r$i$n$g".
porglezomp

Chỉ muốn cho bạn biết rằng @fornit (anh ấy không đủ đại diện để bình luận) đề nghị sử dụng f[]=[]làm trường hợp cơ bản cho bạn f[x]=[x]. Tôi không quen thuộc với Haskell vì vậy tôi không biết liệu nó có hợp pháp hay không, tôi sẽ để bạn phán xét.
Dada

@Dada: điều đó sẽ không hiệu quả, bởi vì nó sẽ đặt thêm một ()chữ cái đằng sau chữ cái cuối cùng, ví dụ f "abc"-> "a(b(c()))".
nimi

Điều này cũng không xử lý đầu vào trống. Phiên bản chính xác ngắn nhất tôi có thể đưa ra là 44, với một kỹ thuật khác : f=(++).intersperse '('<*>drop 1.map(\_->')').
Jon Purdy

@JonPurdy: chúng tôi không phải xử lý đầu vào trống. intersperseyêu cầu import Data.Listthêm 17 byte.
nimi

16

Thạch , 9 8 byte

-1 byte nhờ @Dennis (sử dụng khuôn ,, thay cho độ dài Lvà lặp lại x)

j”(³”)ṁṖ

Dùng thử

Làm sao?

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, ³thực sự khiến Jelly in giá trị trả về hiện tại, vì vậy bạn không bao giờ có hai danh sách ký tự.
Dennis

13

Võng mạc , 22 17 byte

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

Hãy thử trực tuyến!

Cách khác:

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

Giải trình

Tôi luôn quên rằng có thể in các thứ trên đường đi thay vì chuyển mọi thứ thành kết quả cuối cùng và xuất ra trong một lần ...

\1>`.
($&

Ở đây \nói với Retina để in kết quả của giai đoạn này mà không cần theo dõi dòng. Các 1>giới hạn có nghĩa là trận đấu đầu tiên của regex nên bỏ qua. Đối với bản thân sân khấu, nó chỉ đơn giản thay thế từng ký tự ( .) ngoại trừ cái đầu tiên được (theo sau bởi ký tự đó. Nói cách khác, nó chèn (vào giữa mỗi cặp ký tự. Đối với đầu vào abc, điều này biến đổi nó thành (và in)

a(b(c

Tất cả chỉ còn lại là in dấu ngoặc đơn đóng:

T`(p`)_

Này được thực hiện với một phiên âm thay thế (với )và xóa tất cả các ký tự ASCII in khác từ chuỗi.


Nguy hiểm Nhanh quá ...
mbomb007

@ mbomb007 ... và xa tối ưu. ;)
Martin Ender

13

> <> , 19 18 byte

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

Hãy thử trực tuyến!

Giải trình

Dòng đầu tiên là một vòng lặp đầu vào in mọi thứ cho đến ký tự cuối cùng của đầu vào (bao gồm tất cả () và để lại đúng số lượng )trên ngăn xếp:

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.

Khi chúng ta nhấn EOF, con trỏ lệnh kết thúc ở dòng thứ hai và chúng ta sẽ thực hiện otrong một vòng lặp, in tất cả ), cho đến khi ngăn xếp trống và lỗi chương trình.


12

C #, 32 byte

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

Lambda này phải là một phương thức tĩnh, tôi có cần đếm thêm byte nào cho yêu cầu đó không? Thông thường tôi sẽ không sử dụng lambda cho đệ quy trong C #, nhưng sau đó tôi nghĩ nó sẽ ngắn hơn nếu không sử dụng đệ quy.

/*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
    )
;

định nghĩa sẽ chạy như được khai báo và tính
mèo

11

J, 13 byte

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

J thực thi từ phải sang trái để sử dụng trạng từ chèn /, một động từ có thể được sử dụng để giảm các chữ cái của chuỗi đầu vào.

Sử dụng

   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))))))))

Bạn có thể quan sát các đầu ra một phần giữa mỗi lần giảm.

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

Giải trình

(,'(',,&')')/  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 byte

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

Regex tìm và thay thế khoảng trắng giữa các ký tự bằng "(". Sau đó catrepthêm ")" n-1 lần vào cuối.


Thực tế có thể trừ 1 byte ở đây bằng cách loại bỏ F, như vậy , điều này là do mỗi mục đã có cài đặt mặc định, do đó, việc để một ký tự trống giữa các dấu phẩy sẽ khiến tùy chọn ign.case sử dụng mặc định của nó. Nhưng bạn có thể biết rằng ... Công việc được hoàn thành tốt!
Sumner18

8

PowerShell v2 +, 46 byte

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

Lấy chuỗi đầu vào, char-array của nó, -joinlà mảng cùng với các parens mở (, sau đó nối với số lượng parens đóng thích hợp ).


8

Acc !! , 129 byte

Không tệ cho một tarpit Turing khá dài ...

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
}

(Vâng, tất cả khoảng trắng đó là bắt buộc.)

Lưu ý: vì những hạn chế đầu vào của Acc !! , không thể đọc một chuỗi ký tự tùy ý mà không có dấu phân cách kết thúc. Do đó, chương trình này dự kiến ​​đầu vào (trên stdin) dưới dạng một chuỗi theo sau là một ký tự tab.

Acc !! ?

Đó là ngôn ngữ tôi tạo ra chỉ có vẻ không sử dụng được . Kiểu dữ liệu duy nhất là số nguyên, cấu trúc luồng điều khiển duy nhất là Count x while yvòng lặp và cách duy nhất để lưu trữ dữ liệu là một bộ tích lũy duy nhất _. Đầu vào và đầu ra được thực hiện một ký tự tại một thời điểm, sử dụng giá trị đặc biệt NWritecâu lệnh. Mặc dù có những hạn chế này, tôi khá chắc chắn rằng Acc !! là Turing-hoàn thành.

Giải trình

Chiến lược cơ bản trong Acc !! lập trình là sử dụng %phân chia mod và số nguyên /để phân chia khái niệm bộ tích lũy, cho phép nó lưu trữ nhiều giá trị cùng một lúc. Trong chương trình này, chúng tôi sử dụng ba phần như vậy: bảy bit ( _%128) thứ tự thấp nhất lưu trữ mã ASCII từ đầu vào; bit tiếp theo ( _/128%2) lưu trữ giá trị cờ; và các bit còn lại ( _/256) đếm số lượng parens gần mà chúng ta sẽ cần.

Đầu vào trong Acc !! xuất phát từ giá trị đặc biệt N, đọc một ký tự đơn và đánh giá mã ASCII của nó. Bất kỳ câu lệnh nào chỉ bao gồm một biểu thức đều gán kết quả của biểu thức đó cho bộ tích lũy. Vì vậy, chúng tôi bắt đầu bằng cách lưu trữ mã của ký tự đầu tiên trong bộ tích lũy.

_%128sẽ lưu trữ các nhân vật được đọc gần đây nhất. Vì vậy, vòng lặp đầu tiên chạy trong khi _%128-9là khác không - nghĩa là, cho đến khi ký tự hiện tại là một tab.

Trong vòng lặp, chúng tôi muốn in ( trừ khi chúng tôi ở lần lặp đầu tiên. Vì Acc !! không có câu lệnh if, chúng ta phải sử dụng các vòng lặp cho các điều kiện. Chúng tôi sử dụng bit 128 của bộ tích lũy _/128%2, làm giá trị cờ. Trên đường chuyền đầu tiên, điều duy nhất trong bộ tích lũy là giá trị ASCII <128, do đó cờ là 0 và vòng lặp bị bỏ qua. Trên mỗi lần vượt qua tiếp theo, chúng tôi sẽ đảm bảo cờ là 1.

Bên trong Count xvòng lặp (bất cứ khi nào cờ là 1), chúng ta viết một paren mở (ASCII 40) và thêm 128 vào bộ tích lũy, từ đó đặt cờ thành 0 và thoát khỏi vòng lặp. Điều này cũng xảy ra để tăng giá trị của _/256, mà chúng ta sẽ sử dụng như là kiểm đếm gần đúng của chúng để làm đầu ra.

Bất kể giá trị của cờ là gì, chúng tôi viết char đầu vào gần đây nhất, đơn giản là vậy _%128.

Bài tập tiếp theo ( _+128-_%128+N) thực hiện hai điều. Đầu tiên, bằng cách thêm 128, nó đặt cờ cho lần tiếp theo thông qua vòng lặp. Thứ hai, nó thoát ra khỏi _%128khe, đọc một ký tự khác và lưu nó ở đó. Sau đó, chúng tôi lặp.

Khi Count ivòng lặp thoát, chúng ta vừa đọc một ký tự tab và giá trị bộ tích lũy bị phá vỡ như sau:

  • _%128: 9(ký tự tab)
  • _/128%2: 1(cờ)
  • _/256: số ký tự được đọc, trừ 1

(Điểm trừ 1 là bởi vì chúng ta chỉ thêm 128 vào bộ tích lũy một lần trong lần đầu tiên đi qua vòng lặp chính.) Tất cả những gì chúng ta cần bây giờ là các parens gần. lần Count j while _/256-jlặp _/256, viết một paren gần (ASCII 41) mỗi lần. Voila!


8

Java 7,81 79 byte

Đã lưu 1byte. Cảm ơn kevin.

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

Cách tiếp cận đệ quy tốt đẹp. Ngắn hơn vòng lặp for tôi sắp đăng. +1 Hai điều bạn có thể chơi gôn: l!=a.length-> l<a.lengthb=b+'('+a[l],++l)+')'-> b+="("+a[l],++l)+")"( -2 byte )
Kevin Cruijssen

@KevinCruijssen b+="("+a[l],++l)+")"cung cấp cho bạn 144141148))) và BTW b+"("+a[l],++l)+")"là chính xác. và đây là sai lầm rất ngớ ngẩn của tôi ( !=).
Numberjack

Không, b+='('+a[l],++l)+')'cho 144141148, nhưng b+="("+a[l],++l)+")"không. Các dấu ngoặc đơn được bao quanh bởi các dấu ngoặc kép thay vì dấu ngoặc kép.
Kevin Cruijssen

Tôi đăng phiên bản của mình (82 byte trong Java 7) chỉ sử dụng Chuỗi đầu vào làm tham số. Verbose nhưng không tệ;) Nếu bạn tìm thấy một cái gì đó để thay đổi: codegolf.stackexchange.com/a/96745/59739
AxelH

7

APL, 19 byte

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

Giải trình:

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

Giải pháp thay thế, cũng 19 byte:

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

Giải trình:

{              
              ⍵,⊂⍬  ⍝ 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
Nơi nào bạn mua bàn phím cho một ngôn ngữ như vậy !!!
Ronan Dejhero

@RonanDejhero Có lẽ chỉ cần ánh xạ lại các phím bằng cách sử dụng cltr, shift, alt, capslock, numlock, v.v.
Ariana

7

MATL , 16 byte

t~40+v3L)7MQ3L)h

Hãy thử trực tuyến!

Giải trình

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 byte

Cảm ơn @TonMedel đã chơi hết 4 byte.

24 byte mã + -F.

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

Nhu cầu -F-Ecờ:

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

Lưu ý rằng nếu bạn thử điều này trên một phiên bản cũ của perl, bạn có thể cần thêm -acờ.


Một cách thú vị khác (lâu hơn một chút: 28 byte):
Cảm ơn TonMedel một lần nữa vì đã giúp tôi làm điều này đúng.

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

(Để sử dụng nó, hãy đặt mã bên trong một tệp và gọi nó với echo -n "Hello" | perl nest.pl)


Bạn không cần ""sau -F. Bạn cũng không cần -lnếu bạn yêu cầu chuỗi đầu vào được nhập mà không có dòng mới cuối cùng:echo -n Hello | program
TonMedel

@TonHosp Đúng, tôi đã quên (hoặc không biết, không chắc chắn) về hành vi đó -F, cảm ơn. (Tôi đã tự hỏi làm thế nào để có được đầu vào mà không có dòng mới cuối cùng, cảm ơn vì điều đó nữa)
Dada

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

Bạn có thể khiến ý tưởng khác của mình hoạt động với một cái gì đó tương tự s/.(?=.)/s%$'%($&)%/reg, nhưng tất nhiên nó không hỗ trợ các chuỗi có chứa siêu ký tự regex
TonMedel

@TonH rửa Cảm ơn rất nhiều vì tất cả những điều đó! (Về cái thứ hai, tôi đã thêm \Qđể hỗ trợ các siêu ký tự regex) :-)
Dada

6

Ruby, 27 byte

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

Giải trình

->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 byte

Bao gồm +1 cho -p

Cung cấp chuỗi trên STDIN mà không có dòng mới (hoặc thêm -ltùy chọn vào chương trình)

echo -n Hello | nest.pl

nest.pl:

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

6

GNU sed, 37 35 31 byte (30 +1 cho -rđối số)

Giải pháp sed linux linux

:;s/([^(])([^()].*)$/\1(\2)/;t
  1. Đặt tên cho hiến pháp :; sau đó gọi nó một cách đệ quy vớit
  2. Lập 2 nhóm regex:
    • Nhóm đầu tiên là char đầu tiên của hai ký tự liên tiếp không phải là ngoặc đơn
    • Nhóm thứ hai là ký tự thứ hai liên tiếp và phần còn lại của chuỗi cho đến hết dòng
  3. Thêm dấu ngoặc quanh nhóm thứ hai \1 ( \2 )

Chỉnh sửa : Cảm ơn @manatwork đã giúp xóa 4 ký tự!

Kiểm tra trực tuyến


2
Chỉ sử dụng 2 nhóm dường như là đủ. Chụp lần thứ 2 và thứ 3 cùng nhau.
manatwork

Ồ, và xin lỗi, nhưng các tùy chọn dòng lệnh cần thiết để thay đổi hành vi mặc định của trình thông dịch để mã của bạn hoạt động, phải được đưa vào số lượng kích thước. Việc hầu như không cần thiết -eđể chuyển mã cho trình thông dịch là miễn phí. (Ok, sedhạnh phúc mà không có nó quá.) Vì vậy, đối với sed -re '…'bạn, hãy đếm +1.
manatwork

1
Nhãn trống là một tính năng / lỗi của GNU sed, vì vậy có lẽ tiêu đề phải là GNU sed.
Riley

6

Sứa , 19 18 byte

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

Ký tự là ký tự điều khiển không thể in được với giá trị byte 0x1. Hãy thử trực tuyến!

Giải trình

Đây là một chương trình Jellyfish khá phức tạp, vì nhiều giá trị được sử dụng ở nhiều nơi.

  • I là đầu vào thô, đọc từ STDIN dưới dạng chuỗi.
  • '(là nhân vật theo nghĩa đen (.
  • Các {(sắc trái) mất '(Inhư đầu vào, và lợi nhuận '(. Giá trị trả lại không bao giờ thực sự được sử dụng.
  • `là chủ đề. Nó sửa đổi {để trả về ký tự (cho mỗi ký tự của I, dẫn đến một chuỗi (s có cùng độ dài như I.
  • >là đuôi; nó lấy chuỗi (s làm đầu vào và cắt bỏ ký tự đầu tiên.
  • +lấy làm đối số chuỗi (s và byte không thể in được và thêm giá trị byte (1) cho mỗi ký tự. Điều này cho một chuỗi có độ dài bằng nhau của )s. Sử dụng ký tự đảm bảo rằng giá trị trả về là một chuỗi chứ không phải là danh sách các số nguyên.
  • Ở góc dưới bên trái, /lấy byte không thể in được và trả về một hàm có hai đối số và tham gia đối số thứ hai với đối số thứ nhất một lần (vì giá trị byte là 1).
  • _nhận chức năng này, lấy các đối số của cấp dưới {(đã '(I) và gọi chức năng này với chúng. Điều này chèn ký tự (giữa mỗi cặp nhân vật trong I.
  • ,nối chuỗi này với chuỗi )s và Pin kết quả.

5

05AB1E , 22 21 19 18 byte

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

Hãy thử trực tuyến!

Giải trình:

¤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 byte

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

Phiên bản trước 64 byte

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

1
Bạn có thể lưu hai byte bằng cách sử dụng <?=thay vì echo và một byte khác nếu bạn đặt $ s thành kết quả của str_splitcuộc gọi thay vì $argv[1], sau đó sử dụng count($s)thay vìstrlen($s)
Alex Howansky

2
63 byte: <?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");- wordwrapsẽ đánh bại tổ hợp chia / nối, nhưng không may thất bại nếu đầu vào chứa khoảng trắng.
Tít

@Titus thay thế tốt đẹp Cảm ơn bạn
Jörg Hülsermann

4

Vim, 17 byte

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

Đi từ đầu đến đầu, bởi vì nếu không bạn đi qua ) gì bạn đã viết. Sử dụng hathay vì ithất bại khi nó bắt đầu.

Thông thường, bạn sẽ không thực hiện hai phần chèn riêng biệt như thế này; bạn sẽ làm gì đó C()<Esc>Pđể cứu đột quỵ. Nhưng định vị không hoạt động tốt thời gian này.


Bạn có thể sử dụng <End>phím trong chế độ chèn thay vì rời khỏi chế độ chèn và thực hiệnA
BlackCap

@BlackCap Đó không phải là một byte. Tôi cần đếm các nét thay vì byte. (Và Vimgolf là một trò chơi tốt hơn khi bạn cấm các phím con trỏ, mặc dù sự khác biệt ở đây là tầm thường.)
udioica

4

Brain-Flak 103 97 byte

Bao gồm +3 cho -c

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

Hãy thử trực tuyến!


Giải trình:

#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 (

Đánh tôi với nó +1
DJMcMayhem

Hừm. Tôi nghĩ rằng việc sử dụng lại 40 để tránh đẩy một số nguyên lớn một lần nữa sẽ giúp bạn tiết kiệm rất nhiều byte, nhưng điều tốt nhất tôi có thể nghĩ ra là {({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}dài hơn hai byte ...
DJMcMayhem

Cảm ơn đã cho tôi ý tưởng để sử dụng lại 40. Tôi đã giảm xuống còn 95 + 3. Tại sao lại là 3 byte cho -aBrain-Flak?
Riley

Ồ, làm tốt lắm! Các +3byte là tiêu chuẩn cho các cờ dòng lệnh đặc biệt . Điều đó thật đáng tiếc, nhưng một cái gì đó tôi có thể đưa ra. Tôi thực sự đã nghĩ cách để rút ngắn điều này, nhưng tôi không chắc chắn chính xác như thế nào.
DJMcMayhem

Nó không phải là bình thường 2 byte? Một cho -và một cho cờ? Bạn có thể có một cờ để thực hiện bình thường như Perl làm với -e. Bằng cách đó, nó sẽ chỉ có thêm 1 byte.
Riley

4

APL Dyalog , 14 byte

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

đây là một đỉnh của { }/

(lấy phần tử đầu tiên) sẽ được áp dụng sau { }/ (giảm lambda)

⍺,1⌽')(',⍵- đối số bên trái ( ) được nối với ( ,) phép xoay bởi một phần tử sang bên trái ( 1⌽) của chuỗi được ')('nối với ( ,) đối số bên phải ( )

giảm nếp gấp APL từ phải sang trái, theo yêu cầu ở đây



3

> <> , 37 byte

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

Hàng này đến hàng kia

  1. Đẩy mỗi char từ đầu vào với dấu ngoặc đơn mở sau mỗi char
  2. Loại bỏ EOF và dấu ngoặc đơn mở cuối cùng và đẩy chiều dài ngăn xếp
  3. Sử dụng so sánh với một nửa chiều dài ngăn xếp để đẩy dấu ngoặc đóng
  4. In nội dung của ngăn xếp

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.