(A [l (t [e (r) n] e) s] t) một chuỗi!


36

Luân phiên , là hành động lấy một chuỗi và lồng nó trong các dấu ngoặc xen kẽ. Đây là cách bạn thay thế một chuỗi.

  • Đối với một chuỗi có độ dài N , lấy các ký tự N ở giữa và bao quanh chúng trong ngoặc đơn. Vì vậy, nếu chuỗi của chúng tôi là Hello world!(12 ký tự), chúng tôi sẽ kết thúc bằng

    (Hello world!)
    
  • Sau đó, lấy các n-2ký tự trung tâm còn lại và bao quanh chúng trong dấu ngoặc vuông. Trong trường hợp này, trung tâm là 10 ký tự ello world, vì vậy lần lặp tiếp theo là:

    (H[ello world]!)
    
  • Miễn là có nhiều hơn hai ký tự ở giữa chuỗi, lặp lại hai bước cuối cùng, xen kẽ giữa ()[]. Đây là các bước cuối cùng:

    (Hello world!)
    (H[ello world]!)
    (H[e(llo worl)d]!)
    (H[e(l[l(o[ w]o)r]l)d]!)
    

    Vì chỉ còn lại hai ký tự ở giữa trong lần lặp cuối cùng, chúng tôi dừng lại. Chuỗi cuối cùng của chúng tôi là

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

    Lưu ý làm thế nào có hai ký tự trong ngoặc giữa. Điều này xảy ra khi đầu vào là một chiều dài chẵn. Nếu đầu vào là một độ dài lẻ (ví dụ: Hello, world!có thêm dấu phẩy), chúng ta sẽ chỉ có một ký tự ở giữa:

    (H[e(l[l(o[,( )w]o)r]l)d]!)
    

Đối với thử thách ngày nay, bạn phải viết một chương trình hoặc hàm lấy một chuỗi làm đầu vào và thay thế nó, xuất ra chuỗi mới. Bạn có thể lấy đầu vào và đầu ra ở bất kỳ định dạng hợp lý nào bạn muốn. Đầu vào sẽ luôn dài ít nhất một ký tự và sẽ chỉ chứa ASCII có thể in được. Bạn cũng có thể giả định rằng đầu vào sẽ không chứa bất kỳ dấu ngoặc đơn hoặc dấu ngoặc vuông. Đối với các ngôn ngữ truyền thống, điều này không quá quan trọng, nhưng nó có thể giúp một số ngôn ngữ bí truyền dễ dàng hơn.

Như thường lệ, đây là một cuộc thi , vì vậy hãy cố gắng đưa ra câu trả lời ngắn nhất có thể bằng ngôn ngữ bạn chọn. Chúc vui vẻ!

Kiểm tra IO

#Input                      #Output

"Alternesting is fun!"  --> (A[l(t[e(r[n(e[s(t[in]g) ]i)s] )f]u)n]!)
"PPCG"                  --> (P[PC]G)
"Code-golf"             --> (C[o(d[e(-)g]o)l]f)
"4 8 15 16 23 42"       --> (4[ (8[ (1[5( [1]6) ]2)3] )4]2)
"a"                     --> (a)
"ab"                    --> (ab)
"abc"                   --> (a[b]c)


Chúng ta phải luôn bắt đầu bằng dấu ngoặc đơn ( ()) hay chúng ta có thể bắt đầu bằng dấu ngoặc ( [])?
hoàn toàn là

@totallyhuman Nó luôn luôn phải bắt đầu bằng dấu ngoặc đơn()
DJMcMayhem

Đề xuất thử nghiệm : HelloWorld.
Erik the Outgolfer

Ngoài ra, là dấu cách cho phép không gian?
Erik the Outgolfer

Câu trả lời:



9

C, 143 137 135 byte

i,l,k;f(char*s){for(k=i=0,l=strlen(s);*s;printf("%c%c","([])"[i++%2+2*(i>l/2+!k)],*s++))i>l/2-1&&l&1^1&&putchar(*s++,k=++l);puts(")");}

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

Giải trình:

// Function (and variable) declaration.
i,l,k;f(char*s){

// Start the loop and initialize the variables. The loop terminates
// when the NUL-terminator of the string is reached.
for(k=i=0,l=strlen(s);*s;<this part saved for later>)

// Check if we have reached the middle of the string. Because of the
// short-circuiting of the conditions, we don't need to use an 'if'
// statement here; if a condition is false, no further conditions
// are evaluated.
i>l/2-1&&

// Equivalent to '!(l%2)', but one byte shorter. Checks if the length
// of the string is even.
l&1^1

// If we have reached the middle and the length of the string is even, 
// we'll need to skip one bracket, so we'll print the current character
// of the string and increment the pointer. Also we increment 'l' to
// avoid this getting done more than once, and give 'k' a non-zero
// value.
&&putchar(*s++,k=++l);

// The following is inside the 'increment' part of the 'for' loop.
// We print two characters. The first one is a bracket and the second
// one is the current character in the string.
printf("%c%c","([])"[i++%2+2*(i>l/2+!k)],*s++)

// The type of bracket is  chosen depending on the value of 'i'. A 
// character from the string "([])" is selected with the index 'i%2 + 2', 
// if we have reached the  middle of the string, and with index 'i%2', if
// we haven't.

// The exact part where this change happens depends on the parity of 
// the string length, so we use 'k' to signal if the length is even or 
// odd. If the length is odd, 'k==0', so '+!k' is the same as '+1'.  
// Otherwise 'k' is non-zero, so '+!k' is the same as '+0'.

// Output the final ')'.
puts(")");}

Nếu tôi nhớ C chính xác, các biến được khai báo trên toàn cầu sẽ được khởi tạo 0. Vì vậy, bạn không cần k=i=0,. Tôi có thể sai. Xem câu trả lời SO này
TAS

@Tas Bạn thực sự đúng, nhưng các hàm phải được sử dụng lại để được gửi hợp lệ, vì vậy các biến cần phải được khởi tạo bên trong hàm.
Steadybox

7

Võng mạc , 52 byte

+`(?<!\()[^()]+(?!\))
($&)
(\(.)\(
$1[
r`\)(.\))
]$1

Hãy thử trực tuyến! Giai đoạn đầu tiên chèn các cặp dấu ngoặc giữa mỗi cặp ký tự đầu vào, trong khi giai đoạn thứ hai và thứ ba thay thế các dấu ngoặc đơn thay thế cho dấu ngoặc.



6

JavaScript (ES6), 69 68 byte

f=([c,...s],i,l=s.pop())=>'[('[i^=1]+c+(s[0]?f(s,i)+l:l||'')+'])'[i]

Các trường hợp thử nghiệm


5

V , 25 26 25 byte

Giảm 1 2 byte nhờ @DJMcMayhem

òC()Pé
%llòÍî
òF)%r[r];

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

Mượn một số ý tưởng của @ udioca. Cuối cùng cũng sử dụng plugin vòm có trong V để trả lời, mặc dù nó có thể không phải là cách tốt nhất, ai biết được. Các plugin KHÔNG muốn được sử dụng.

Hexdump:

00000000: e3e1 0a6b f2e9 286c 6ce9 5b6c 6cf2 6af2  ...k..(ll.[ll.j.
00000010: e129 6868 e15d 6868 f2cd ce              .)hh.]hh...

Giải trình:

-> |abcdefg      (the input, where | is the cursor)
ò              ' recursively
 C()           ' (C)hange from the cursor to the end of the line to '()'
-> (|)    (where | is the cursor)
     P         ' (P)aste the changed bit (what was there) left of the cursor
-> (abcdef|g)
      é        ' nsert a newline
-> (abcdef
   |g)
%              ' Goto the previous matching parenthese
-> |(abcdef
   g)
 ll            ' Move two characters right
-> (a|bcdef
   g)
   ò           ' End recursive loop (it will break on ll when there are no characters left
-> (a(b(c
   d)
   e)
   f)
    Íî         ' Remove all newlines
-> (a(b(cd)e)f|)
ò              ' Recursively
 F)            ' Go backwards to the next )
-> (a(b(cd)e|)f)
   %r[         ' Go to the matching paren and (r)eplace it with [
-> (a|[b(cd)e)f)
               ' Go back to the previous cursor location
-> (a[b(cd)e|)f)
       r]      ' (r)eplace this paren with ]
-> (a[b(cd)e|]f)
         ;     ' repeat F)
-> (a[b(cd|)e]f)
               ' implicitly end recursion

Wow, làm tốt lắm! Tôi đã bị mắc kẹt ở 29 byte nhưng thiếu một loạt các trường hợp cạnh. Đây là một câu trả lời khá ngọt ngào. Bạn có thể lưu một byte bằng cách sử dụng ;thay vì dùng f) thử trực tuyến
DJMcMayhem

Nó thực sự bị hỏng ngay bây giờ vì không gian, tôi sẽ xóa và sửa chữa
nmjcman101

@DJMcMayhem Tôi có thể xem 29 byte của bạn không? Trừ khi bạn có kế hoạch chơi golf theo tôi và thi đấu, điều mà tôi sẽ không ngạc nhiên về điều đó :)
nmjcman101

Nó không hoạt động, vì vậy tôi không phiền cho bạn xem nó: tio.run/##K/v/// , Oh, và BTW: chat.stackexchange.com/transcript/message/38434285#38434285 :)
DJMcMayhem

:( thực hiện xen kẽ ()[]ngắn hơn một byte nhưng kém mát mẻ hơn
nmjcman101

5

Haskell , 96 91 81 79 77 byte

(cycle"()[]"!)
(l:r:a)!k|[x]<-k=[l,x,r]|x:y<-k=l:x:a!init y++[last y,r]|2>1=k

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


1
Bạn có thể thả cha mẹ xung quanh (x:y)(init y). k==""=""là ngắn hơn như k==""=k.
Laikoni

1
Lưu thêm một số byte bằng cách thay đổi cycle["()","[]"]thành "()[]": Hãy thử trực tuyến!
Laikoni

@Laikoni gợi ý tuyệt vời, cảm ơn
bartavelle

1
Bắt tốt mà giữ cyclethậm chí còn ngắn hơn. Bạn vẫn có thể loại bỏ dấu ngoặc đơn xung quanh (init y).
Laikoni

1
Bạn có thể di chuyển trường hợp k==""=kđến cuối và thay đổi nó thành 0<1=k.
Zgarb


2

Javascript (ES6) 110 105 byte

Cảm ơn @powelles đã nhắc nhở tôi về x%y<1.

Cảm ơn @Luke vì a-b?y:x

i=>'('+[...i].map((a,b,c,d=i.length/2-1,e=b%2<1)=>a+(d>b?e?'[':'(':d-b?(d%1==0?!e:e)?')':']'):'').join``


Điều đầu tiên trong việc hiểu con thú này là không hiểu biết về nó:

function alternest(input) { //input is i in the original
  let inputArray = Array.from(input); //the [...i] section
  let result = inputArray.map((item, index, baseArray) => { //result is an added helper variable
    let middle = input.length / 2 - 1, //the middle of the string
        alternate = index % 2 == 0; //should you alternate from '(' and '[' or ')' and ']'

    let symbol; //the alternating symbol

    if(middle > index) { //if its opening braces
      symbol = alternate ? '[' : '(';
    } else if(middle < index) {
      if(middle % 1 === 0) //if middle is a whole number
        alternate = !alternate; //reverse alternate
      symbol = alternate ? ')' : ']';
    } else { //if middle === index
      symbol = ''; //there's no symbol in the center for even alternests
    }
    return item + symbol; //convert the array item into the item and symbol
  }).join('');

  return '(' + result; //add the first symbol.
}

Hầu như tất cả các dòng là một phần của phiên bản golf, vì vậy bước qua:

Dòng 1: Câu lệnh hàm trở thành hàm mũi tên , đổi tên inputthành i. Trở thành i=>.

Dòng 2: Array.from là cách mới, thích hợp để chuyển đổi một chuỗi thành một mảng và những gì chúng ta sử dụng trên dòng này. Tuy nhiên, cùng với nó, toán tử trải rộng là một cách rẻ hơn so với .split('')cách cũ , để làm điều đó, đó là những gì được sử dụng trong phiên bản golf. Kết thúc như [...i].

Dòng 3: .map các vòng lặp thông qua một mảng, cung cấp cho bạn ba đối số: item( atrong phần đánh gôn) , index; chơi golf như b, và baseArrayhoặc c. Trong khi chúng tôi chỉ quan tâm itemindex, chúng tôi giữ baseArray(xem dòng 4 để biết lý do). Golf đến .map((a,b,c,...)=>....

Dòng 4: Biến middle, hoặc đối số dtrong phiên bản được đánh gôn được tạo để lưu một vài byte khi nó được lặp lại. Đối số cphải được giữ cho đối số dđược tạo. Được chuyển đổi thành (...,d=i.length/2-1,...).

Dòng 5 : Biến alternatehoặc đối số eđược sử dụng để kiểm tra ký tự đó là gì trên "(" hoặc "[" hoặc nếu nó đã qua giữa, ")" và "]". b%2<1bằng với b%2==0vì nó không thể là bất cứ thứ gì nhỏ hơn 1, nhưng 0 trong trường hợp này. Bằng nhau (...,e=b%2<1).

Dòng 6: Một biến helper để cho phép tôi chuyển đổi ternary operatorsđể ifbáo cáo. Không có gì trong codegolf thực tế.

Dòng 7-8 : Nếu chỉ mục nhỏ hơn ở giữa chuỗi, đặt biểu tượng thành xen kẽ "[" và "(". Tương đương với d>b?e?'[':'(':....

Dòng 9-12 : Khác (nếu chỉ số lớn hơn giữa), kiểm tra xem giữa có phải là một số nguyên hay không, nếu vậy hãy chuyển đổi xen kẽ. Sau đó đặt biểu tượng thành một xen kẽ ')' và ']'. Bị xáo trộn đến (d%1==0?!e:e)?')':']'.

Dòng 13-15 : Nếu ở giữa đặt biểu tượng thành một chuỗi trống. Điều này không áp dụng cho các lựa chọn thay thế lẻ, bởi vì giữa có một số thập phân. Trở thành : d==b?'':....

Dòng 16 : Nối mảng ký tự trở lại thành một chuỗi. Tương đương với .join``.

Dòng 17 : Trả về ký hiệu bắt đầu "(" và kết quả. Tương quan với '('+....


Đối với một số chiến thắng đơn giản, bạn có thể thay đổi %2==0để %2<1và sử dụng [...i]thay vìi.split
powelles

1
Cảm ơn @powelles Tôi đã thực hiện một lời giải thích nhiều hơn là một câu trả lời đầy đủ, vì vậy nó chưa được chỉnh sửa. Tôi đã có [..i] idea, nhưng tôi quên %2<1cảm ơn.
David Archibald

b%2<1có thể được thay thế bởi!b%2
Luke

Ngoài ra, d==b?x:ycó thể trở thành d-b?y:xd%1==0có thể trở thành !d%1.
Luke

Thật không may vì thứ tự các hoạt động !d%1chỉ hoạt động với dấu ngoặc đơn: !(d%1)và nó không tắt bất kỳ byte nào. Tôi quên rằng 0 là số giả duy nhất, vì một số lý do tôi nghĩ -1 là số giả. Chỉnh sửa cho tôi nếu tôi nhận được một cái gì đó sai về cái thứ hai.
David Archibald

2

Thạch , 23 21 byte

LHĊRị
ç⁾)]żUFUż@ç⁾([$

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

LHĊRị           - helper function. Takes inputs of the input string and list of brace types
L                 - length of the input string
 HĊ               - number of parenthesis/brackets facing a single direction
   R              - range
    ị             - indexed into right argument: list of brace types ')]' or '(['

ç⁾)]żUFUż@ç⁾([$ - main function 
ç⁾)]              - get list of left-facing parentheses/brackets
    żU            - zip to the end (U) of the input string
      FU          - move the beginning of the string back to the beginning
        ż@        - zip with (to the start of the string):
          ç⁾([$   -the list of right-facing parentheses/brackets to the beginning

-2 byte nhờ @EricTheOutgolfer


Bạn có thể xóa một dòng và di chuyển đến liên kết của trình trợ giúp cho -2, như thế này:LHĊRị¶ç⁾)]żUFUż@ç⁾([$
Erik the Outgolfer

1

SCALA, 140 138 ký tự, 140 138 byte

Tôi xin lỗi tôi không thể làm tốt hơn ... Tôi chắc chắn có nhiều cách để cải thiện nó. Vẫn:

val n=s.length-1
var l=""
var r=""
for(i<-0 to n/2){l+=(if(i%2<1)"("else"[")
if(i!=n-i)l+=""+s(i)
r=""+s(n-i)+(if(i%2<1)")"else"]")+r}
l+r

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

Cảm ơn vì thử thách này, điều đó khá khó khăn với tôi.

EDIT: -2 ​​byte nhờ Mar Dev.

PS: Tôi sẽ hỏi vài thứ. Tôi hiểu lý do tại sao MÃ NÀY tiếp tục sao chép char trung tâm của chuỗi của tôi nếu tôi có độ dài lẻ (tôi chỉ không kiểm tra và thêm nó hai lần, trong cả hai lrchuỗi). Nhưng tại sao tôi nhận được một cặp ngoặc đơn khi tôi cố gắng sửa chữa nó như RẰNG ? Tôi không hiểu gì cả.


1
Bạn có thể thay đổi i%2==0để i%2<1cứu hai byte.
Mario Ishac

1

Perl, 77 74 (73 + 1) byte

Biểu hiện thông thường là những điều vẻ vang. Chạy với -pcờ dòng lệnh.

$x=qr/[^]()[]/;$z=qr/(^|$x)\K($x+)($|$x)/;s/$z/[$2]$3/ while s/$z/($2)$3/

1

05AB1E , 31 byte

2ä`Rð«„)]Ig©×øRJ®Èƒ¦}s„([®×søJì

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

Giải trình

Với các ví dụ cho đầu vào: abcd/abcde

2ä`                              # split input to 2 separate parts on stack
                                 # RESULT: 'ab','cd' / 'abc', 'de'
   R                             # reverse the second part
    ð«                           # append a space
      „)]                        # push the string ")]"
         Ig©×                    # repeat it len(input) times
             ø                   # zip with the second part of the input string
              RJ                 # reverse and join to string
                                 # RESULT:  ' )c]d)' /  ' )d]e)'
                ®Èƒ¦}            # remove the first (1,2) chars for (odd,even) length input
                                 # RESULT: 'c]d)' / ')d]e)'
                     s           # swap the first part of the input string to top of stack
                      „([®×      # repeat the string "([" len(input) times
                           sø    # zip with first part of input string
                                 # RESULT: ['(a', '[b'] / ['(a', '[b', '(c']
                             Jì  # join to string and prepend to the second part

1

C ++ 14, 154 145 byte

[Đệ quy]

auto L(string i,bool b=1){int l=i.length();string o=b?"(":"[";auto c=b?")":"]";if(l<3)return o+i+c;return o+i[0]+L(i.substr(1,l-2),!b)+i[l-1]+c;}

C ++ 14, 177 byte

[Lặp lại]

auto l(string s){int z=s.length();string r(z*2+z%2,'-');int i=0;for(;i<z;i+=2)r[i]=i/2%2?'[':'(',r[i+1]=s[i/2];for(i=z;i<2*z;i+=2)r[i]=s[i/2],r[i+1]=(i+1)/2%2?')':']';return r;}

0

Pyth , 42 (!) Byte

M?!lHH+@,\[\(G++hHg!GPtH+?qlH1keH@,\]\)Gg1

Kiểm tra nó trực tuyến! Đầu vào phải được trích dẫn.

Giải thích

M                                             # Define a function g with arguments G and H
 ?!lHH                                        # If len(H) == 0, return H. Otherwise...
      +@,\[\(G                                # Concatenate [ or ( to...
               +hHg!GPtH                      # ...to H[0] concatenated to g(not(G), H[1:-1]), itself concatenated...
              +          ?qlH1keH             # ...to H[-1] if len(H) != 1, otherwise to "" (that's for odd length input strings)...
                        +        @,\]\)G      # ...and to that concatenate ] or ).
                                        g1    # Call g(True, Q). Q is implicit input

Vì vậy, về cơ bản, tôi dần dần loại bỏ phần đầu và phần cuối của H (là chuỗi đầu vào ở đầu) trong khi nối các dấu ngoặc / ngoặc. G chỉ là một boolean ghi nhớ nếu tôi phải sử dụng dấu ngoặc hoặc dấu ngoặc đơn.



0

PowerShell, 125 119 111 byte

{param($s)for($p='()[]';($f,$s,$g=$s-split'(?<=.)(.+)(?=.)')[0]){$l+=$p[$i++]+$f;$r=$g+$p[$i++]+$r;$i%=4}$l+$r}

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

Phiên bản trước*

{for($s="($args)";$s-ne($t=$s-replace'(\(.)([^][]+)(.\))','$1[$2]$3'-replace'(\[.)([^)(]+)(.\])','$1($2)$3')){$s=$t}$s}

* Cảm ơn @Digital Chấn thương.



0

AWK, 118 byte

{b=")";for(j=l=length(c=$0);j>0;){x=substr(c,j--,1);b=(j>l/2?(((d=!d)?"]":")")x):j==l/2?x:((d=!d)?"(":"[")x)b}print b}

Đã thử nghiệm với gawk, nhưng nó sẽ hoạt động với bất kỳ trình thông dịch awk tuân thủ nào

$ awk -f alternesting.awk <<< 'abc'
(a[b]c)

0

JavaScript, 101 byte

Không phải là một người chiến thắng, nhưng thật thú vị khi thử replacecách tiếp cận. Điều này chắc chắn có thể được cải thiện, nhưng nó nhanh chóng vượt qua ...

s=>"("+s.replace(/./g,(a,b)=>a+(l%2|b*2+2!=l?")][("[3*(c=l>(b+=l%2-1)*2+2)+(b-c*l)%2]:""),l=s.length)

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.