Tambahkan atau ditambahkan? Tergantung

23

Brain-flak berusia satu tahun besok! Untuk menghormati hari ulang tahunnya, kami mengadakan pesta ulang tahun gaya PPCG, di mana beberapa pengguna mengirim pertanyaan yang berhubungan dengan otak! Bantu kami merayakan! :)


Brain-flak adalah bahasa esoteris yang saya tulis di mana semua perintah adalah tanda kurung dan semua tanda kurung harus sepenuhnya cocok. Untuk meminjam definisi saya sendiri :

  • Untuk tujuan tantangan ini, "braket" adalah salah satu karakter: ()[]{}<>.

  • Sepasang tanda kurung dianggap "cocok" jika tanda kurung buka dan tutup berada dalam urutan yang benar dan tidak memiliki karakter di dalamnya, seperti

    ()
    []{}
    

    Atau jika setiap subelemen di dalamnya juga cocok.

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

    Subelemen juga dapat disarungkan beberapa lapisan.

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • Sebuah string dianggap "Sepenuhnya cocok" jika dan hanya jika:

    1. Setiap karakter adalah braket,

    2. Setiap pasangan braket memiliki braket pembuka dan penutup yang benar dan dalam urutan yang benar

Dalam perayaan ulang tahun pertama brain-flak, tantangan hari ini adalah tentang mengambil satu set kurung yang tidak seimbang, dan menentukan jenis operasi apa yang diperlukan untuk menjadikannya brain-flak yang valid.

  • Sebagai contoh, ((ini bukan kode brain-flak yang valid, tetapi jika kita menambahkannya )), ia menjadi (()), yang sepenuhnya seimbang, dan karenanya valid-brain flak. Itu membuat input ini dapat ditambahkan .

  • Demikian pula, >}ini tidak valid, tetapi kita bisa {<membuatnya {<>}, yang valid. Itu membuat input ini dapat diandalkan .

  • Beberapa input sedikit lebih rumit. Misalnya, )][({tidak dapat dibuat valid murni dengan menambahkan atau menambahkan. Tapi itu bisa dibuat valid dengan menambahkan [(dan menambahkan })]. Oleh karena itu, input ini bersifat prependable dan appendable .

  • Terakhir, beberapa input tidak pernah dapat dibuat kode brain-flak yang valid dengan kombinasi penambahan atau penambahan. Misalnya, (>tidak pernah dapat dibuat valid. (Menciptakan <menciptakan <(>, dan menambahkan )membuat (>), tidak ada yang valid) Oleh karena itu, input ini tidak dapat ditambahkan atau tidak dapat ditambahkan.

Untuk tantangan hari ini, Anda harus menulis sebuah program atau fungsi yang mengambil string tanda kurung dan menentukan apakah string tersebut

appendable
prependable
both
neither

Anda dapat memilih nilai apa yang Anda gunakan untuk mewakili untuk setiap kasus. Sebagai contoh, keluaran 1, 2, 3, 4, atau 'a', 'p', 'b', 'n', atau 1, 'foo', 3.1415, -17, atau apa pun baik-baik saja. Selama setiap output berbeda dan konsisten , itu bagus. Namun Anda harus secara jelas menentukan output mana yang sesuai dengan kasus mana.

Anda dapat mengembalikan nilai ini dalam format apa pun yang paling nyaman (misalnya, kembali dari suatu fungsi, mencetak ke STDOUT, mengubah argumen, menulis ke file, dll.).

Anda dapat mengasumsikan bahwa input tidak akan pernah valid atau kosong.

Contohnya

Input berikut semuanya dapat dipertanggungjawabkan :

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

Ini semua bisa ditambahkan :

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

Ini semua adalah keduanya :

))((
>()[(()){
>{

Dan ini bukan keduanya :

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

Seperti biasa, ini adalah , jadi celah standar berlaku, dan jawaban terpendek dalam byte menang!


Tantangan ini terutama sulit di otak-serpihan, sehingga brownies maksimum menunjuk ke setiap dan setiap jawaban yang ditulis dalam otak-serpihan. :)

DJMcMayhem
sumber
1
maximum brownie pointsSaya pikir bahwa menawarkan poin brownies dan cookie maksimum sebagai gantinya akan mendorong Brain-Flaking tantangan ini lebih dari sekedar poin brownies, karena saya tidak berpikir itu sepele sama sekali dalam bahasa apa pun , apalagi Brain-Flak. : P
Erik the Outgolfer
FYI: Semua tes berakhir dengan tanda kurung terbuka, semua tes tidak berakhir dengan tanda kurung tutup.
Jonathan Allan
2
Saya berpendapat bahwa 'keduanya' adalah istilah yang salah. Sebuah string seperti ][ini tidak appendable, karena tidak ada Anda dapat menambahkan dapat membuatnya berlaku. Demikian pula, itu tidak dapat dipertanggungjawabkan. Ini ... 'dapat dimasukkan'! Anda dapat memasukkannya ke dalam string untuk membuat seluruh Brainflak valid.
orlp
Apakah keduanya sudah seimbang atau tidak?
Wheat Wizard
@wheatwizard String seimbang tidak akan diberikan sebagai input. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Jawaban:

6

Jelly , 33 32 37 35 34 byte

bug ditemukan, memperbaiki +5 byte, memperbaiki lebih baik - 2 byte, menggunakan trik dari Adnan yang saya lihat di sini untuk -1 lebih.

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ

Nilai pengembalian:

prepends [2]
 appends [0]
    both [2,0]
 neither 1

(Input tidak valid mengembalikan hasil palsu, meskipun Brain-flack valid, kembali [].)

Cobalah online! - test suite (mencetak representasi bubur, jadi20untuk[2,0], dan mengabaikan garis yang mengandung-).

Jonathan Allan
sumber
5

Retina , 41 40 41 byte

1 byte disimpan berkat @MartinEnder

+`\(\)|\[]|{}|<>

[]})>]+
1
\W+
0
...+
01

Cobalah online!

  • Dapat diandalkan adalah 1
  • Dapat ditambahkan adalah 0
  • Keduanya adalah 10
  • Tidak ada 01

Suntingan

  • Memperoleh 1 byte untuk memperbaiki bug yang diperhatikan oleh @Neil
Kritixi Lithos
sumber
[]})>]menghemat satu byte.
Martin Ender
@ MartinEnder Ah, itu karena set karakter tidak boleh kosong, terima kasih!
Kritixi Lithos
Ini tidak bekerja untuk semua input yang tidak dapat ditambahkan, misalnya (][). Saya pikir itu bisa diperbaiki dengan biaya satu byte dengan mengubah 101ke ...+.
Neil
@Neil Terima kasih telah memperhatikan bug, saya ingin tahu apakah ada kasus Bothseperti itu juga
Kritixi Lithos
Tidak, saya pikir 10hanya kombinasi yang valid untuk Both.
Neil
3

Batch, 337 byte

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s%

Output ]untuk prepend, [untuk append, ][untuk keduanya, []untuk keduanya.

Neil
sumber
3

Haskell , 115 108 byte

EDIT:

  • -7 byte: Gunakan lebih banyak penjaga.
(""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d

Cobalah online!

Gunakan like (""#) "))". Hasil diberikan sebagai:

[False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither

Bagaimana itu bekerja

  • Pengkodean keluaran dipilih sedemikian rupa sehingga kebutuhan untuk bertanda diberi isyarat dengan menjatuhkan elemen kedua dari hasil untuk sisanya, jika ada, sementara ketidakcocokan lengkap ditandai dengan menjatuhkan mereka semua.
  • s#dmem-parsing string yang tersisa d, diberi string / tumpukan standa kurung penutup yang diharapkan.
    • The s#""cek baris jika semua tanda kurung penutup telah ditemukan pada akhir string, jika tidak menambahkan diperlukan.
    • Cabang pertama s#(c:d)memeriksa apakah karakter berikutnya cadalah braket pembuka, dan jika demikian meninggalkan braket penutup yang sesuai pada tumpukan untuk rekursi.
    • Jika tidak, jika tumpukan berisi tanda kurung tutup, cabang kedua memeriksa apakah yang teratas cocok dengan karakter berikutnya, dan jika tidak, mengembalikan daftar kosong alih-alih berulang.
    • Terakhir, di cabang terakhir tumpukan kosong, dan kami memiliki braket penutup yang tak tertandingi yang dapat diperbaiki dengan menambahkan, sebelum berulang.
Ørjan Johansen
sumber
2

Japt , 44 byte

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug

Output 1untuk prependable, 3untuk appendable, 13untuk keduanya, dan 31untuk keduanya.

Uji secara online! atau Verifikasi semua kasus uji sekaligus.

Bagaimana itu bekerja

 =Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression
Produksi ETH
sumber
2

PHP, 137 Bytes

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0;

1 => dapat ditambahkan,

2 => dapat dipertanggungjawabkan,

12 => keduanya,

0 => keduanya

Testcases

Jörg Hülsermann
sumber
"Selama setiap output berbeda dan konsisten, itu bagus". Tampaknya ini tidak memiliki nilai yang konsisten untuk keduanya.
Cyoce
@Cyoce Sekarang Diperbaiki
Jörg Hülsermann