Diberikan string karakter di +=-
mana setidaknya ada satu=
, masukkan bilangan bulat positif antara semua simbol dan pada awal dan akhir sehingga persamaan matematika terpenuhi.
Misalnya diberi input
+-=-=
Anda perlu memasukkan bilangan bulat positif A hingga F seperti ini
A+B-C=D-E=F
sedemikian rupa sehingga semua persamaan puas, yaitu A + B - C
dan D - E
dan F
semua angka yang sama.
Ada banyak cara yang mungkin untuk melakukan ini karena, selama persamaan berhasil, setiap himpunan bilangan bulat positif dapat digunakan. Setiap baris di sini adalah kemungkinan input untuk input yang valid +-=-=
:
2+3-4=6-5=1
1+1-1=2-1=1
4+2-4=4-2=2
100+1-10=182-91=91
89+231-77=1024-781=243
Perhatikan bahwa nilai ekspresi tidak perlu menjadi bilangan bulat positif seperti angka yang dimasukkan. Misalnya, input yang diberikan -=-
output 1-10=8-17
(evals to -9) dan 10-1=17-8
(evals to 9) sama-sama valid. Tentu saja untuk beberapa input seperti =
tidak mungkin memiliki ekspresi negatif karena hanya angka positif seperti yang 5=5
dapat dimasukkan.
Perhatikan juga bahwa nol bukan bilangan bulat positif.
Kode terpendek dalam byte menang.
Anda dapat menampilkan nomor sebagai daftar alih-alih memasukkannya langsung ke dalam string. Jika Anda menghasilkan string, mungkin ada spasi yang memisahkan simbol dan angka. Jadi, untuk input +-=-=
, keluaran
2, 3, 4, 6, 5, 1
atau
2 + 3 - 4 = 6 - 5 = 1
setara dengan keluaran
2+3-4=6-5=1
Uji Kasus
Input | One Possible Output
= | 1=1
== | 2=2=2
+= | 1+3=4
=+ | 2=1+1
-= | 30-10=20
=- | 1=2-1
=-= | 3=7-4=3
=+= | 2=1+1=2
=== | 100=100=100=100
+=- | 3+2=7-2
-=+ | 7-2=3+2
+=+ | 3+3=3+3
-=- | 1-10=8-17
--= | 60-1-1=58
++= | 60+1+1=62
-+= | 60-9+1=52
+-= | 60+9-1=68
+-=-= | 2+3-4=6-5=1
--=-- | 2-1-1=2-1-1
==-== | 47=47=50-3=47=47
=++=+-=-+=--= | 3=1+1+1=3+1-1=1-1+3=5-1-1=3
+--++-=-+-+- | 35+10-16-29+20+107-1000=5-4+3-2+1-876
====== | 8=8=8=8=8=8=8
sumber
Jawaban:
Retina , 58 byte
Cobalah online!
Solusi alternatif pada jumlah byte yang sama:
Cobalah online!
Penjelasan
Ide dasarnya adalah untuk mengubah semua
+
s dan-
menjadi sederhana+1
dan-1
operasi dan kemudian menambahkan jumlah yang cukup besar yang membuat semua persamaan bekerja. Untuk membuat persamaan cocok, kita bisa dengan mudah menambahkan angka yang sama ke masing-masing, dan kemudian menguranginya dengan satu untuk masing-masing+1
dan menambahnya dengan satu untuk masing-masing-1
setelah itu. Karena kita akan bekerja dengan angka unary, satu-satunya tangkapan adalah bahwa angka pertama harus cukup besar sehingga kita bisa menguranginya sebanyak 1 kali.Kami mulai dengan memasukkan
1
setelah setiap-
atau+
.The
\B
memastikan bahwa pertandingan ini baik di awal input, atau antara=
dan+
atau-
, yaitu semua posisi di mana kita ingin memasukkan jumlah terkemuka ekspresi. Bagian((\+1)|(-1))*
kemudian hanya menghitung jumlah+1
s dan-1
s dalam kelompok2
dan3
masing - masing. Sekarang mari kita hancurkan string substitusi:Jatuh berulang-ulang
1_
dari string, menerapkan pembatalan yang diperlukan dari+1
s.Akhirnya, ganti semua string
1
s dengan panjangnya untuk mengkonversi dari unary ke desimal.sumber
Python 2 , 76 byte
Cobalah online!
sumber
eqtn_len + plus_signs + minus_signs - 2 * plus_signs = eqtn_len + minus_signs - plus_signs
. Kemudian karena semua angka lain dalam chunk adalah nomor, total untuk chunk berhasileqtn_len + minus_signs - plus_signs - minus_signs + plus_signs = eqtn_len
. Panjang persamaan harus positif, jadi semuanya berjalan lancar.Python 2,
199179178172162158156 156152byteTerlalu lama, tapi solusinya mudah dibuat.
Cobalah online
Ini akan mencoba setiap kemungkinan sampai menemukan solusi. Program ini sangat lambat. Ini juga melakukan penggantian string setiap iterasi. Suntingan "172" membuatnya lebih lambat secara drastis , karena alih-alih dimulai dengan rentang kecil, itu dimulai pada maks. Misalnya input
-=
atau=+
harus mencoba 2 ** 32 upaya sebelum mencapai solusi.Untuk mempercepat program, gunakan versi dengan 178 byte dari riwayat edit.
sumber
range
di python2 membuat seluruh rentang sebagai daftar segera? IIRC Anda bisa mempercepatnya dengan menggunakanxrange
sebagai gantinya, karena saya pikir itu adalah versi lazy-loading (Python3 menggunakan lazy sebagai defaultrange
)print range(1,65537)
dan selesai dalam 0,034 s.l=...
, tetapi menempatkannya di dalamproduct(range(...),repeat=len(s)+1)
. Jika Anda membutuhkan tanda kurung, ia hanya menyimpan satu byte (\ n)len(s)+1
, saya bisa menggunakannya-~len(s)
, yang tidak akan memerlukan parens.JavaScript (ES6),
9282 byteGolf 8 byte dengan trik dari @xnor
Kuncinya di sini adalah untuk memasukkan
1
setelah setiap+
atau-
, lalu tambahkan setiap ekspresi dengan jumlah yang membuat ekspresi sama dengan panjang input. Dengan cara ini kami dapat menjamin bahwa jumlahnya selalu positif; karena selalu ada setidaknya 1=
dalam string, jumlah+
s tidak pernah bisa mencapai panjang string, jadi sisanya selalu setidaknya1
. Anda dapat memverifikasi ini dengan mengetikkan angka+
s sembarang pada cuplikan di atas.sumber
Python 2 ,
120119 byte-1 byte, terima kasih kepada mbomb007
Cobalah online! atau Verifikasi semua kasus uji
Pertama saya masukkan
1
di setiap posisi, untuk memeriksa nilai tertinggi, lalu menambahkannya sebagai offset pada setiap persamaan. Ini berfungsi karena Anda tidak dapat menambahkan angka negatif, sehingga hasil minimum diberikan oleh jumlah+
dalam persamaan yang hanya dimiliki+
.sumber
GNU Prolog, 156 byte
Penjelasan
Kami punya banyak persamaan untuk dipecahkan, jadi mengapa tidak menggunakan pemecah persamaan yang sebenarnya?
x
pada dasarnya adalah evaluator persamaan untuk persamaan bentuk+-+
; selain persamaan itu sendiri, ia memiliki dua argumen tambahan (daftar perbedaanL,R
yang berisi nilai-nilai persamaan, dan nilaiV
yang dievaluasi oleh persamaan). Seperti biasa dalam Prolog, ini dapat digunakan dengan cara apa saja (misalnya Anda dapat menentukanV
dan mendapatkanL,R
, menentukanL,R
dan mendapatkanV
, menentukan keduanya dan memverifikasi bahwa nilainya benar, atau tidak menentukan dalam hal mana kendala yang sesuai akan ditempatkan pada keduanyaV
danL,R
). "Elemen saat ini"L,R
dinamaiE
, dan kami juga menyertakan pernyataan bahwaE
lebih besar dari 0 (karena pertanyaannya memerlukan penggunaan angka positif). Fungsi ini sedikit lebih verbose daripada yang saya inginkan, misalnya saya harus menulis[E|R]
pencocokan pola / tidak cocok dua kali, karena fakta bahwa daftar adalah asosiatif kanan tetapi penambahan dan pengurangan asosiatif kiri. Sayangnya, kita perlu menggunakan daftar aktual, daripada menciptakan tipe daftar asosiatif kiri kita sendiri dari sel kontra, untukfd_labeling
agar berfungsi.q
mirip denganx
, tetapi juga termasuk=
. Itu pada dasarnya hanya panggilanx
, dan itu sendiri secara rekursif. Secara kebetulan, ini adalah demonstrasi yang sangat jelas tentang cara kerja daftar perbedaan, menunjukkan bahwa Anda dapat menggabungkan dua daftar perbedaanL,T
danT,R
menjadi daftar perbedaan tunggalL,R
. Ide dasarnya adalah bahwa daftar perbedaan adalah fungsi parsial yang mengambil argumenR
dan mengembalikan nilaiL
yang ada diR
dalam daftar itu sendiri. Dengan demikian, dengan mengidentifikasi argumen dari satu daftar perbedaan dan nilai pengembalian yang lain, kita dapat menyusun fungsi, dan dengan demikian merangkai daftar tersebut.Akhirnya,
s
yang merupakan fungsi yang benar-benar menyelesaikan tugas dalam pertanyaan, adalah fungsi pembungkus yang memanggilq
dengan argumen. Kami mengonversi daftar perbedaan ke daftar reguler dengan memberikan[]
argumennya, dan gunakanfd_labeling
untuk menemukan solusi persamaan yang kami buat. (Secara default, sepertinya menetapkan nilai ke 1 jika tidak ada alasan untuk mengaturnya ke sesuatu yang lain. Namun, itu dapat dikonfigurasi;value_method(random)
memberikan lebih banyak solusi "menarik" daripada menempatkan 1s di mana-mana, misalnya, dan masih sangat cepat. )Output sampel
Dengan program seperti yang tertulis:
Jika saya membuat program sedikit lebih lama untuk ditambahkan
value_method(random)
, hasilnya bervariasi, tetapi terlihat seperti ini:Dalam kedua kasus,
?
pada akhir output berarti mungkin ada lebih dari satu solusi. (Tentu saja, dalam hal ini, kita tahu bahwa ada banyak lebih dari satu solusi!)sumber
Mathematica, 116 byte
Fungsi murni mengambil string sebagai input dan mengembalikan daftar bilangan bulat positif. Strategi dasar: kami hanya pernah menambah 1 dan mengurangi 1, dan kami memilih angka awal dalam setiap ungkapan untuk membuat semuanya sama.
c=Characters@StringSplit[#,"="]/."+"->-1/."-"->1
akan membagi string input pada setiap tanda sama dengan, lalu ganti masing-masing+
dengan-1
dan setiap-
oleh1
. Namun, jika ada tanda sama dengan di awal atau akhir, maka itu akan diabaikan. Oleh karena itu kami menambahkan karakter baru secara artifisial di setiap ujung ("0"<>#<>"0"
) dan membuatnya hilang setelah pemisahan-string selesai (/."0"->Nothing
).Total setiap sublist sekarang sama dengan integer yang dapat kita tempatkan di depan
+
s dan-
s untuk membuat setiap persamaan sama.1-Min[Tr/@c]
adalah bilangan bulat terkecil yang dapat kita tambahkan ke setiap total untuk membuat semuanya positif. Jadi,Prepend[#^2,1-Min[Tr/@c]+Tr@#]&
bawa setiap sublist (^2
giliran semua entri mereka1
) dan tambahkan totalnya digeser oleh bilangan bulat kompensasi terkecil ini. Daftar yang dihasilkanJoin
diedit bersama untuk menghasilkan output.sumber
Ruby, 76
Nilai target untuk ekspresi ditetapkan pada
5**8
minus 1 untuk alasan bermain golf! Awalnya saya menggunakans.size+1
minus 1.Tidak digabungkan dalam program uji
Keluaran
sumber
PHP,
207204197114 bytependekatan langsung: jauh lebih pendek dan lebih cepat
Jalankan dengan
echo '<input>' | php -nR '<code>'
atau coba online .kerusakan
!$c
benar di iterasi pertama, dilemparkan ke1
untuk pengindeksan string;"="[1]
kosong.Setelah itu,
$c
diatur dan!$c
salah, masukkan ke0
dan"="[0]
adalah karakter pertama.jadi kami pasti aman dengan panjang input. Semua persyaratan akan dievaluasi untuk itu.
chunk_split($s,$n,$i)
menyisipkan$i
setelah setiap$n
karakter$s
- dan pada akhirnya.Untuk mencegah istilah kosong beralih ke
1
, kesalahan terpaksa dengan mengatur panjang chunk ke0
.sumber
Röda ,
112110109 byteCobalah online!
Fungsi pemisahan tidak berfungsi seperti yang saya maksudkan dengan program ini. Misalnya,
split("", sep="")
mengembalikan satu string kosong, bukan apa-apa. Bagaimana itu logis? Karena ini program ini hampir 20 byte lebih besar dari apa yang bisa terjadi jika semantik yang terbelah itu ideal.Gagasan dari jawaban ini adalah bahwa kita tahu bahwa panjang string input harus lebih besar atau sama dengan nilai persamaan, jadi kami mendefinisikan nilai persamaan menjadi panjang string. Untuk setiap bagian dari persamaan, kami pikir setiap operator menjadi
+1
dan-1
dan mengurangi dan menambahkannya ke nilai persamaan.Tidak Disatukan:
sumber