(A [l (t [e (r) n] e) s] t) sebuah string!

36

Bergantian , adalah tindakan mengambil string dan bersarang di kurung bergantian. Inilah cara Anda mengganti string.

  • Untuk string dengan panjang N , ambil karakter tengah N , dan mengelilingi mereka dalam tanda kurung. Jadi jika string kami adalah Hello world!(12 karakter), kami akan berakhir dengan

    (Hello world!)
    
  • Kemudian, ambil n-2karakter tengah yang tersisa , dan mengelilinginya dalam tanda kurung. Dalam hal ini, 10 karakter tengah adalah ello world, jadi iterasi berikutnya adalah:

    (H[ello world]!)
    
  • Selama masih ada lebih dari dua karakter di tengah-tengah string, ulangi dua langkah terakhir, bergantian antara ()dan []. Inilah langkah terakhir:

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

    Karena hanya ada dua karakter yang tersisa di tengah pada iterasi terakhir, kami berhenti. String terakhir kami adalah

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

    Perhatikan bagaimana ada dua karakter di tanda kurung tengah. Ini terjadi ketika input panjangnya genap. Jika input panjangnya aneh (misalnya, Hello, world!dengan koma ditambahkan), kami hanya akan memiliki satu karakter di tengah:

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

Untuk tantangan hari ini, Anda harus menulis sebuah program atau fungsi yang mengambil string sebagai input, dan memundangnya, menghasilkan string baru. Anda dapat mengambil input dan output dalam format wajar apa pun yang Anda suka. Input akan selalu setidaknya sepanjang satu karakter, dan hanya akan berisi ASCII yang dapat dicetak. Anda juga dapat mengasumsikan bahwa input tidak akan mengandung tanda kurung atau tanda kurung. Untuk bahasa tradisional, ini seharusnya tidak terlalu penting, tetapi mungkin membuatnya lebih mudah untuk beberapa bahasa esoterik.

Seperti biasa, ini adalah kompetisi , jadi cobalah membuat jawaban sesingkat mungkin dalam bahasa pilihan Anda. Selamat bersenang-senang!

Tes 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)
DJMcMayhem
sumber
Terkait
DJMcMayhem
Haruskah kita selalu mulai dengan tanda kurung ( ()) atau bisakah kita mulai dengan tanda kurung ( [])?
totallyhuman
@totallyhuman Itu harus selalu dimulai dengan tanda kurung()
DJMcMayhem
Testcase diusulkan: HelloWorld.
Erik the Outgolfer
Juga, apakah spasi tambahan diperbolehkan?
Erik the Outgolfer

Jawaban:

20

Python 3 , 70 69 65 byte

-1 byte terima kasih kepada @Uriel
-4 byte terima kasih kepada @xnor

f=lambda s,b=0:s and'(['[b]+s[0]+f(s[1:-1],~b)+s[1:][-1:]+')]'[b]

Cobalah online!

ovs
sumber
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(")");}

Cobalah online!

Penjelasan:

// 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(")");}
Steadybox
sumber
Jika saya ingat C dengan benar, variabel yang dideklarasikan secara global diinisialisasi ke 0. Jadi, Anda tidak perlu k=i=0,. Saya mungkin salah. Lihat jawaban SO ini
Tas
@Tas Anda memang benar, tetapi fungsi harus dapat digunakan kembali untuk menjadi kiriman yang valid, sehingga variabel perlu diinisialisasi di dalam fungsi.
Steadybox
7

Retina , 52 byte

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

Cobalah online! Tahap pertama memasukkan pasangan tanda kurung di antara masing-masing pasangan karakter input, sedangkan tahap kedua dan ketiga mengoreksi tanda kurung alternatif ke tanda kurung.

Neil
sumber
6

Sed, 78

Skor termasuk +1 untuk -ropsi yang diteruskan ke sed.

s/.*/(&)/
:
s/(\(.)([^][]+)(.\))/\1[\2]\3/
t
s/(\[.)([^)(]+)(.\])/\1(\2)\3/
t

Cobalah online .

Trauma Digital
sumber
6

JavaScript (ES6), 69 68 byte

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

Uji kasus

Arnauld
sumber
5

V , 25 26 25 byte

1 2 byte mati berkat @DJMcMayhem

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

Cobalah online!

Meminjam beberapa ide @ udioca. Juga akhirnya menggunakan plugin surround yang disertakan dalam V untuk jawaban, meskipun mungkin bukan cara terbaik, siapa tahu. Plugin TIDAK ingin digunakan.

Hexdump:

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

Penjelasan:

-> |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
nmjcman101
sumber
Wow, kerja bagus! Saya terjebak pada 29 byte tetapi hilang banyak kasus tepi. Ini jawaban yang manis. Anda dapat menyimpan satu byte dengan menggunakan ;alih-alih yang terakhir f) Cobalah online!
DJMcMayhem
Ini sebenarnya rusak sekarang karena spasi, saya akan menghapus dan memperbaikinya
nmjcman101
@DJMcMayhem Dapatkah saya melihat 29 byte Anda? Kecuali jika Anda berencana untuk bermain golf di bawah saya dan bersaing, yang saya tidak akan terkejut :)
nmjcman101
Tidak berfungsi, jadi saya tidak keberatan menunjukkannya kepada Anda: tio.run / ##K / v///... Oh, dan BTW: chat.stackexchange.com/transcript/message/38434285#38434285 :)
DJMcMayhem
:( melakukan bolak-balik ()dan []satu byte lebih pendek tapi jauh lebih tidak keren
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

Cobalah online!

bartavelle
sumber
1
Anda dapat menjatuhkan orang tua di sekitar (x:y)dan (init y). k==""=""lebih pendek sebagai k==""=k.
Laikoni
1
Simpan lebih banyak byte dengan mengubahnya cycle["()","[]"]menjadi "()[]": Coba online!
Laikoni
@Laikoni saran bagus, terima kasih
bartavelle
1
Tangkapan bagus yang menjaga cyclebahkan lebih pendek. Anda masih dapat menghapus tanda kurung di sekitar (init y).
Laikoni
1
Anda dapat memindahkan kasing k==""=kke ujung dan mengubahnya ke 0<1=k.
Zgarb
2

Ruby , 79 77 byte

-2 byte berkat @Nilai Tinta

->s{z=s.size
(z/2+z%2).times{|i|s.insert k=i*2,'(['[i%2]
s[~k]+=')]'[i%2]}
s}

Cobalah online!

Alex
sumber
s.insert k=i*2,'(['[i%2];s[~k]+=')]'[i%2]untuk menyimpan 2 byte. Cobalah online!
Nilai Tinta
2

Javascript (ES6) 110 105 byte

Terima kasih kepada @powelles untuk mengingatkan saya tentang x%y<1.

Terima kasih @ Lukas untuk 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``


Hal pertama dalam memahami binatang buas ini adalah ungolfing:

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.
}

Hampir setiap baris adalah bagian dari versi golf, jadi melangkahlah melalui:

Baris 1: Pernyataan fungsi menjadi fungsi panah , berganti nama inputmenjadi i. Menjadii=> .

Baris 2: Array.from adalah cara baru yang tepat untuk mengubah string menjadi sebuah array, dan apa yang kita gunakan pada baris ini. Namun seiring dengan itu, operator penyebaran adalah cara yang lebih murah daripada .split('')cara lama , untuk melakukannya, yang digunakan dalam versi golf. Berakhir sebagai[...i] .

Line 3: .map loop melalui array, memberikan Anda tiga argumen: item( adi golfed), index; golf sebagai b, dan baseArrayatau c. Sementara kami hanya peduli itemdan index, kami terus baseArray(lihat baris 4 untuk alasannya). Golf untuk .map((a,b,c,...)=>....

Baris 4: Variabel middle, atau argumen ddalam versi golf dibuat untuk menyimpan beberapa byte ketika diulang. Argumen charus disimpan untuk argumen yang dakan dibuat. Dikonversi menjadi (...,d=i.length/2-1,...).

Baris 5 : Variabel alternate, atau argumen edigunakan untuk memeriksa karakter apa yang ada di "(" atau "[" atau jika melewati tengah, ")" dan "]". b%2<1sama dengan b%2==0karena tidak boleh kurang dari 1, tetapi 0 dalam hal ini. Sama dengan(...,e=b%2<1) .

Baris 6: Variabel pembantu untuk memungkinkan saya mengonversi ternary operatorskeif pernyataan. Bukan apa-apa dalam codegolf yang sebenarnya.

Baris 7-8 : Jika indeks kurang dari tengah string, atur simbol ke pergantian "[" dan "(". Setara dengand>b?e?'[':'(':... .

Baris 9-12 : Lain-lain (jika indeks lebih besar dari tengah), periksa apakah tengah adalah bilangan bulat, jika demikian alihkan pergantian. Kemudian atur simbol ke pergantian ')' dan ']'. Dikacaukan untuk (d%1==0?!e:e)?')':']'.

Baris 13-15 : Jika di tengah atur simbol ke string kosong. Ini tidak berlaku untuk alternester ganjil, karena tengah memiliki desimal. Menjadi: d==b?'':....

Baris 16 : Bergabung dengan array karakter kembali menjadi string. Setara dengan .join``.

Baris 17 : Mengembalikan simbol awal "(" dan hasilnya. Berkorelasi dengan '('+....

David Archibald
sumber
Untuk beberapa kemenangan sederhana Anda bisa mengubah %2==0ke %2<1dan menggunakan [...i]bukannyai.split
powelles
1
Terima kasih @ powelles saya telah mengerjakan penjelasan lebih dari jawaban yang sepenuhnya golf, sehingga belum membuatnya menjadi edit. Saya sudah memilikinya [..i] idea, tetapi saya lupa tentang %2<1terima kasih.
David Archibald
b%2<1dapat digantikan oleh!b%2
Luke
Juga, d==b?x:ybisa menjadi d-b?y:xdan d%1==0bisa menjadi !d%1.
Luke
Sayangnya karena urutan operasi !d%1hanya berfungsi dengan tanda kurung:, !(d%1)dan tidak memotong byte. Saya lupa bahwa 0 adalah satu-satunya angka palsu, untuk beberapa alasan saya pikir -1 adalah yang salah. Perbaiki saya jika saya mendapatkan kesalahan tentang yang kedua.
David Archibald
2

Jelly , 23 21 byte

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

Cobalah online!

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 berkat @EricTheOutgolfer

fireflame241
sumber
Anda dapat menghapus garis, dan memindahkan tautan ke helper untuk -2, seperti ini:LHĊRị¶ç⁾)]żUFUż@ç⁾([$
Erik the Outgolfer
1

SCALA, 140 138 karakter, 140 138 byte

Maaf saya tidak bisa berbuat lebih baik ... Saya yakin ada banyak cara untuk memperbaikinya. Masih:

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

Cobalah online!

Terima kasih atas tantangan ini, itu cukup sulit bagi saya.

EDIT: -2 ​​byte terima kasih kepada Mar Dev.

PS: Tapi saya akan menanyakan sesuatu. Saya mengerti mengapa KODE INI terus menduplikasi karakter pusat string saya jika saya memiliki panjang yang aneh (saya hanya tidak memeriksa dan menambahkannya dua kali, dalam keduanya ldan rstring). Tetapi mengapa saya mendapatkan sepasang tanda kurung ketika saya mencoba memperbaikinya seperti ITU ? Saya tidak mengerti sama sekali.

V. Courtois
sumber
1
Anda dapat mengubah i%2==0to i%2<1untuk menyimpan dua byte.
Mario Ishac
1

Perl, 77 74 (73 +1) byte

Ekspresi reguler adalah hal yang mulia. Jalankan dengan -pbendera baris perintah.

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

05AB1E , 31 byte

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

Cobalah online!

Penjelasan

Dengan contoh untuk input: 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
Emigna
sumber
1

C ++ 14, 154 145 byte

[Rekursif]

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

[Berulang]

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;}
Robert Andrzantai
sumber
0

Pyth , 42 (!) Byte

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

Uji secara online! Masukan harus dikutip.

Penjelasan

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

Jadi pada dasarnya saya secara progresif menghapus kepala dan akhir H (menjadi string input di awal) sambil menyatukan tanda kurung / kurung. G hanyalah boolean yang mengingat jika saya harus menggunakan tanda kurung atau tanda kurung.

Jim
sumber
0

05AB1E , 49 42 byte

g;îD„([×s£©"s‚.Bøvy¬ðQi¦}}JR"DU.V®D∞sKRX.V

Cobalah online!

Erik the Outgolfer
sumber
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}

Cobalah online!

Versi sebelumnya*

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

* Terima kasih @Digital Trauma.

Andrei Odegov
sumber
0

QuadR , 82 byte

(81 byte +1 untuk bendera)

(\(.)([^[])(.+?)([^\]])(.\))
(\(.)(..?)(.\))
^[^\(].*
\1[\2(\3)\4]\5
\1[\2]\3
(&)

Cobalah online!

TwiNight
sumber
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}

Diuji dengan gawk, tetapi harus bekerja dengan penerjemah awk yang memenuhi syarat

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

JavaScript, 101 byte

Bukan pemenang, tetapi menarik untuk mencoba replacependekatan itu. Ini pasti bisa diperbaiki, tetapi cepat hilang ...

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