Menambah atau Menyusun? Bergantung

DJMcMayhem 04/29/2017. 6 answers, 427 views
code-golf string balanced-string classification brain-flak

Otak-flak bertukar umur satu tahun esok! Untuk menghormati hari jadi, kami mempunyai pesta ulang tahun gaya PPCG, di mana beberapa pengguna menyiarkan pertanyaan yang berkaitan dengan otak! Bantu kami meraikan! :)


Brain-flak adalah bahasa esoterik yang saya tulis di mana semua arahan adalah kurungan dan semua kurungan mesti dipadankan sepenuhnya. Untuk meminjam definisi saya sendiri :

  • Untuk tujuan cabaran ini, "pendakap" adalah mana-mana aksara ini: ()[]{}<> .

  • Sepasang kurungan dianggap "dipadankan" jika kurungan pembukaan dan penutup berada dalam susunan yang betul dan tidak mempunyai aksara di dalamnya, seperti

    ()
    []{} 

    Atau jika setiap subelement di dalamnya juga dipadankan.

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

    Subelements juga boleh disarang beberapa lapisan mendalam.

    [(){<><>[()]}<>()]<[{((()))}]> 
  • Rentetan dianggap "Dipadankan sepenuhnya" jika dan hanya jika:

    1. Setiap watak tunggal ialah pendakap,

    2. Setiap pasangan kurungan mempunyai pendakap pembukaan dan penutup yang betul dan dalam urutan yang betul

Dalam sambutan ulang tahun pertama otak-flak, cabaran hari ini adalah tentang mengambil set kurungan yang tidak seimbang, dan menentukan jenis operasi yang diperlukan untuk menjadikan ia otak-flak yang sah.

  • Contohnya, (( bukan kodak otak-flak yang sah, tetapi jika kita memasukkannya )) , ia menjadi (()) , yang sepenuhnya seimbang, dan oleh itu, otak-flak yang sah. Itu menjadikan input ini dapat appendable .

  • Begitu juga, >} tidak sah, tetapi kami boleh menyiapkan {< untuk membuat {<>} , yang sah. Yang membuat input ini boleh prependable .

  • Sesetengah input sedikit lebih rumit. Sebagai contoh, )][({ tidak boleh dibuat semata-mata dengan semata-mata dengan menambahkan atau mempamerkan tetapi dapat dibuat sah dengan mempersiapkan [( dan menambahkan })] .

  • Akhir sekali, beberapa input tidak boleh dibuat kod-kod flak otak yang sah oleh mana-mana gabungan menambah atau mendahulukan. Sebagai contoh, (> tidak boleh dibuat sah. (Prepending < create < <(> , dan appending ) mencipta (>) , yang mana tidak sah) Oleh itu, input ini tidak boleh dibendung atau dipersiapkan.

Untuk cabaran hari ini, anda mesti menulis program atau fungsi yang mengambil rentetan kurungan dan menentukan sama ada rentetan itu

appendable
prependable
both
neither 

Anda boleh memilih nilai yang anda gunakan untuk mewakili setiap kes. Sebagai contoh, output 1, 2, 3, 4 , atau 'a', 'p', 'b', 'n' , atau 1, 'foo', 3.1415, -17 , atau apa sahaja yang baik. Selagi setiap keluaran adalah distinct dan consistent , itu baik-baik saja. Walau bagaimanapun, anda must menentukan dengan jelas mana output yang sepadan dengan mana kes itu.

Anda boleh mengembalikan nilai ini dalam mana format yang paling mudah (contohnya, kembali dari fungsi, mencetak ke STDOUT, mengubah hujah, menulis ke fail, dll.).

Anda boleh mengandaikan bahawa input tidak akan berlaku secara otak-flak atau kosong.

Contoh

Input berikut semuanya boleh prependable :

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

Ini semua boleh appendable :

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

Ini semua adalah both :

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

Dan ini semua neither :

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

Seperti biasa, ini adalah , jadi kelemahan standard dikenakan, dan jawapan yang paling pendek dalam bait menang!


Cabaran ini amat sukar untuk keguguran otak, jadi mata coklat maksimum sehingga setiap dan semua jawapan yang ditulis dalam otak-flak. :)

5 Comments
1 Erik the Outgolfer 04/29/2017
maximum brownie points Saya fikir bahawa menawarkan poin brownie maksimum dan cookies sebaliknya akan menggalakkan Brain-Flaking cabaran ini lebih daripada hanya mata coklat, kerana saya tidak fikir ia adalah remeh sekali dalam any bahasa, apalagi Brain-Flak. : P
Jonathan Allan 04/29/2017
FYI: Semua kedua-dua ujian berakhir dengan kurungan terbuka, semua ujian tidak berakhir dengan kurungan rapat.
1 orlp 04/29/2017
Saya berpendapat bahawa 'kedua' adalah istilah yang salah. Rentetan seperti ][ not diguna pakai, kerana apa-apa yang anda boleh masukkan dapat menjadikannya sah. Begitu juga, ia tidak boleh dipersembahkan. Ia ... 'dimasukkan'! Anda boleh memasukkannya ke dalam rentetan untuk membuat Brainflak yang sah.
Funky Computer Man 04/30/2017
Adakah rentetan seimbang atau tidak?
DJMcMayhem 04/30/2017
@wheatwizard Strings seimbang tidak akan diberikan sebagai input. You can assume that the input will never be valid brain-flak or empty.

6 Answers


Jonathan Allan 04/29/2017.

Jelly , 33 32 37 35 34 bytes

bug yang ditemui, menetapkan mengerikan + 5 bait, memperbaiki yang lebih baik - 2 bait, menggunakan silap mata Adnan yang saya lihat di sini untuk -1 lagi.

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

Pulangan nilai:

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

(Input tidak sah pulangan keputusan palsu, walaupun Brain-flack yang sah, mengembalikan [] .)

Try it online! - satu suite ujian (cetakan perwakilan terkotekan, jadi 20 untuk [2,0] , dan mengabaikan baris yang mengandungi apa-apa - ).


Cows quack 04/29/2017.

Retina , 41 40 41 bytes

1 byte saved thanks to @MartinEnder

+`\(\)|\[]|{}|<>[]})>]+
1
\W+
0
...+
01 

Cuba dalam talian!

  • Boleh dicadangkan adalah 1
  • Tercatat adalah 0
  • Kedua-duanya adalah 10
  • Tiada adalah 01

Pengeditan

  • Telah mendapat 1 byte untuk membaiki bug yang diperhatikan oleh @Neil
5 comments
Martin Ender♦ 04/29/2017
[]})>] menjimatkan bait.
Cows quack 04/29/2017
@MartinEnder Ah, itu kerana set watak tidak boleh kosong, terima kasih!
Neil 04/29/2017
Ini tidak berfungsi untuk semua input yang tidak boleh ditambah, sebagai contoh (][) . Saya fikir ia boleh diperbaiki dengan kos satu bait dengan menukar 101 ke ...+ .
Cows quack 04/29/2017
@Neil Terima kasih kerana memerhatikan bug, saya tertanya-tanya jika terdapat kes seperti ini dengan Both - Both juga
Neil 04/29/2017
Tidak, saya fikir 10 adalah satu-satunya kombinasi yang sah untuk Both - Both .

Neil 04/29/2017.

Batch, 337 bait

@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 kedua, [] untuk tidak.


Ørjan Johansen 04/29/2017.

Haskell , 115 108 bait

EDIT:

  • -7 bait: Gunakan lebih banyak pengawal.
 (""#)
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 

Cuba dalam talian!

Gunakan seperti (""#) "))" . Keputusan diberikan sebagai:

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

Bagaimana ia berfungsi

  • Pengekodan output dipilih sedemikian rupa sehingga keperluan untuk membuat persediaan ditandakan dengan menjatuhkan elemen kedua hasil untuk selebihnya, jika ada, sementara ketidaksetaraan lengkap ditandakan dengan menjatuhkan mereka semua.
  • s#d memecahkan rentetan yang tinggal d , diberi sangkar / susunan daripada kurungan penutupan yang diharapkan.
    • Pemeriksaan baris s#"" jika semua kurungan tutup telah ditemui oleh penghujung rentetan, jika tidak diperlukan.
    • Cawangan pertama s#(c:d) memeriksa jika watak seterusnya c adalah pendakap pembukaan, dan jika demikian meninggalkan pendakap penutup yang sepadan pada timbunan untuk rekursi.
    • Jika tidak, jika timbalan mengandungi tanda kurung penutupan, cawangan kedua akan memeriksa jika yang teratas sepadan dengan aksara seterusnya, dan jika tidak, mengembalikan senarai kosong dan bukannya mengulangi.
    • Akhir sekali, dalam cawangan terakhir timbunan kosong, dan kami mempunyai pendakap penutup yang tidak dapat ditandingi yang mungkin diperbetulkan dengan mendahului sebelum mencair semula.

ETHproductions 04/29/2017.

Japt , 44 bait

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

Output 1 untuk disediakan, 3 untuk boleh diguna, 13 untuk kedua-duanya, dan 31 untuk tidak.

Uji dalam talian! atau Sahkan semua kes ujian sekaligus.

Bagaimana ia berfungsi

=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 

Jörg Hülsermann 06/04/2017.

PHP, 137 bait

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

1 => boleh diguna,

2 => boleh dibeli,

12 => kedua-duanya,

0 => tidak

Pujian

2 comments
Cyoce 06/04/2017
"Selagi setiap output adalah berbeza dan consistent, itu baik-baik saja". Ini tidak kelihatan mempunyai nilai yang konsisten untuk tidak.
Jörg Hülsermann 06/04/2017
@Cyoce Kini Tetap

Related questions

Hot questions

Language

Popular Tags