Penafian: Tidak, ini bukan tantangan lelucon untuk membalik string.
Tugas
Hanya ada satu operasi untuk mendukung: pengurangan ( -
).
Anda juga hanya memiliki dua atom untuk didukung: nol ( 0
) dan satu ( 1
).
Di sini, notasi awalan -AB
sama dengan notasi postfix AB-
, di mana A
dan B
adalah ekspresi.
Tugas Anda adalah (secara rekursif) mengubah ekspresi dalam notasi awalan menjadi yang setara dalam notasi postfix.
Definisi
Ekspresi dalam notasi awalan dihasilkan oleh tata bahasa berikut:
S > -SS
S > 0
S > 1
Ekspresi notasi postfix dihasilkan oleh tata bahasa berikut:
S > SS-
S > 0
S > 1
Contoh
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Aturan dan kebebasan
- Anda dapat mengubah nama operasi dan atom ke karakter mana pun, asalkan konsisten.
- Format input harus konsisten dengan format output (terlepas dari kenyataan bahwa input dalam notasi awalan dan output dalam notasi postfix).
Kasus cobaan
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Kredit testcases ke Dada .
Jawaban:
brainfuck , 32 byte
Cobalah online!
Saya digunakan
@
sebagai operasi, karena titik kode (64) nyaman.U
juga dimungkinkan dengan jumlah byte yang sama, menggunakan 3 * 85 + 1 = 256 = 0.Penjelasan
Rekaman itu digunakan sebagai tumpukan. Di setiap iterasi loop utama, penunjuk data mulai dua sel tepat di atas tumpukan.
sumber
Retina ,
373029 byteCobalah online! Menyimpan 7 byte dengan menyadari bahwa istilah selalu dimulai dengan angka, jadi saya tidak perlu lagi membatasi kecocokan dengan yang terakhir
-
(sebelumnya hanya satu-satunya yang dijamin diikuti oleh dua istilah). Disimpan 1 byte dengan tidak meletakkan-
pada baris mereka sendiri. Misalnya,-01
menjadi-0¶1
yang kemudian diganti dengan01-
. Sekarang, jika saya memiliki--010
yaitu--0¶1¶0
maka saya ingin mengubah batin-0¶1
untuk01-
sehingga saya bisa mengganti-01-¶0
dengan01-0-
, tetapi tidak benar-benar peduli yang mana dari kedua-
s saya remove, jadi saya menghapus satu di awal baris, seperti itu lebih mudah untuk diuji.sumber
-0-0-00
Seharusnya menjadi0000---
.Haskell ,
6259 byteCobalah online! Penggunaan:
fst.f $ "--01-0-01"
.0
dan1
dapat berupa karakter arbitrer yang lebih besar dari karakter tersebut-
.Sunting: -3 byte terima kasih kepada Zgarb!
Fungsi
f
secara rekursif mem-parsing satu ekspresi dan mengembalikan tuple ekspresi ini dalam notasi postfix dan string lainnya, mengikuti tata bahasa sederhana yang darinya dapat dibangun ekspresi awalan yang valid:Jika karakter pertama
a
dari string input lebih besar dari-
, kita berada pada ekspresi atom dan mengembalikan tupel string dengan karaktera
dan sisa string input.Jika kita menemukan
-
, dua ekspresi perlu diuraikan. Ini dapat dicapai dengan(a,x)<-f r
mendapatkan ekspresi pertamaa
dan kemudian mengurai string sisanyax
lagi(b,c)<-f x
untuk mendapatkan ekspresi keduab
dan string sisa terakhirc
.(a,(b,c))<-f<$>f r
tidak persis ini karena<$>
pada tupel memetakan fungsi dua elemen kedua tupel sementara menjadi tiga byte lebih pendek dari(a,x)<-f r,(b,c)<-f x
. Setelah mendapatkan kedua ekspresi dan sisanya string, ekspresi yang bersambung dan "-" ditambahkan:(a++b++"-",c)
.sumber
f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)
ketika saya mencari versi dengan kedua case yang digabungkan, yaitu byte yang lebih panjang.Haskell, 54 byte
Fungsi
v
mengambil string dan fungsi, mengatur ulang sub-ekspresi awal, kemudian menerapkan fungsi ke sisa string sampai semuanya telah diatur ulang. Susunan panggilan dan argumen fungsi bersama-sama melacak ekspresi apa yang sedang diuraikan. Fungsih
menjawab tantangan, dan hanyav
dipanggil dengan sendirinya sebagai argumen pertama dummy.sumber
v f l=l
jika Anda memindahkannya kedua.v id
.last
trik dengan satu byte.Perl 5 , 57 byte
Saya menggunakan
x
sebagai operator alih-alih-
(lihat tautan TryItOnline di bawah).Cobalah online!
Penjelasan:
/x((?0)|.)((?0)|.)/
cocok dengan ekspresi penuh secara rekursif: ax
di awal, lalu ekspresi(?0)
(itu panggilan rekursif) atau atom (.
), diikuti oleh ekspresi-atau-atom lain.Maka saya perlu menyimpan ekspresi kedua / atom (
my$n=$2;
) karena jika tidak, panggilan rekursif akan menimpanya.Fungsi ini kemudian secara rekursif dipanggil pada ekspresi pertama (
f($1)
), kemudian pada yang keduaf($n)
, danx
ditambahkan di akhir (.x
).sumber
Python 3,
1171121051009876626159 byteChangelog:
!=
ke>
(-1 byte, disalin dari saran @ovs)Gunakan seperti ini:
sumber
return
lambda x:p(x)[0]
mungkin bisa menggantikanf
fungsi Anda .else
, metinks.d="-"
benar - benar menyimpan byte?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
untuk 59 bytePyth, 20 byte
Ini menciptakan fungsi
y
yang mengharapkan string sebagai parameter.Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
Fungsi
y
akan mem-parsing dan mengonversi ekspresi awalan pertama ke ekspresi postfix. Jadi jika disebut sepertiy"10"
itu akan kembali saja1
.sumber
Retina ,
343129 byteCobalah online!
;
digunakan untuk menunjukkan node, yang awalnya disusun oleh nomor tunggal dan kemudian tumbuh menjadi apa pun yang telah diuraikan.-
diubah menjadi baris baru sehingga dengan.+
kita dapat mengambil apa pun yang tidak diparsing-
.sumber
Perl 6 , 45 byte
Cobalah online!
sumber