Jika Anda sudah membaca buku Kontak oleh Carl Sagan, tantangan ini mungkin terasa asing bagi Anda.
Diberikan input dari seperangkat persamaan matematika yang terdiri dari angka, operator yang tidak dikenal, nomor lain, dan hasil, menyimpulkan operator mana yang mewakili penambahan, pengurangan, perkalian, atau pembagian.
Setiap persamaan input akan selalu terdiri dari
- bilangan bulat non-negatif
- salah satu surat
A
,B
,C
, atauD
- bilangan bulat non-negatif lainnya
- karakter
=
- bilangan bulat non-negatif akhir
digabungkan bersama. Misalnya, input yang mungkin adalah 1A2=3
, dari mana Anda dapat menyimpulkan yang A
mewakili penambahan. Setiap bilangan bulat akan memuaskan 0 ≤ x ≤ 1,000
.
Namun, tidak selalu sesederhana itu. Dimungkinkan adanya ambiguitas antara:
5A0=5
: penambahan / pengurangan1A1=1
: perkalian / pembagian0A5=0
: perkalian / pembagian2A2=4
: penambahan / perkalian4A2=2
: pengurangan / pembagian0A0=0
: penambahan / pengurangan / perkalian
dan seterusnya. Tantangannya adalah menggunakan kemampuan ini untuk mempersempit pilihan, dikombinasikan dengan proses eliminasi, untuk mengetahui apa yang diwakili oleh setiap huruf. (Akan selalu ada setidaknya satu persamaan input, dan akan selalu memungkinkan untuk secara tidak ambigu mencocokkan secara unik setiap huruf yang digunakan dalam input dengan satu operator.)
Sebagai contoh, katakanlah input adalah persamaan berikut:
0A0=0
: this mempersempit A ke penjumlahan, pengurangan, atau perkalian (tidak dapat dibagi dengan 0).10B0=10
: B harus berupa penambahan atau pengurangan.5C5=10
: C jelas merupakan penambahan, yang membuat pengurangan B, yang membuat perkalian A.
Oleh karena itu, output untuk persamaan input ini harus sesuai A
dengan *
, B
dengan -
, danC
dengan +
.
Input dapat diberikan sebagai string spasi-tunggal / koma-dibatasi atau array string, masing-masing mewakili satu persamaan. Output dapat berupa string tunggal ( "A*B-C+"
), array ( ["A*", "B-", "C+"]
), atau kamus / seperti array 2D ( {"A": "*", ...}
atau [["A", "*"], ...]
).
Anda dapat berasumsi bahwa angka tidak akan pernah dibagi dengan angka lain yang tidak dapat dibagi oleh (jadi, Anda tidak perlu khawatir tentang apakah pembagian harus floating point atau terpotong).
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Kasus uji:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/
sumber
Jawaban:
MATL , 53 byte
Menggunakan versi saat ini (10.1.0)
EDIT (12 Juni 2016): untuk beradaptasi dengan perubahan dalam bahasa, ganti
Y}
dengang
dan1L3$)
olehY)
. Tautan di bawah ini menggabungkan modifikasi tersebutCobalah online!
Penjelasan
Ini menguji semua kemungkinan permutasi dari empat operator dalam satu lingkaran sampai satu permutasi membuat semua persamaan menjadi benar.
Untuk menguji apakah persamaan itu benar, regex diterapkan untuk mengganti empat huruf oleh operator (dalam urutan yang ditentukan oleh permutasi saat ini), dan string dikonversi ke angka (dievaluasi). Ini memberikan array dengan jumlah sebanyak persamaan, di mana persamaan yang benar menjadi
1
dan persamaan yang salah menjadi0
. Jika vektor ini hanya berisi1
nilai, kita sudah selesai.Solusi yang ditemukan menugaskan operator ke empat huruf, tetapi tidak semuanya muncul dalam input. Jadi tes akhir dilakukan untuk membuang huruf yang tidak digunakan (dan operator yang sesuai).
sumber
Python, 278 karakter
Jawaban pertama saya pada kode golf ...
Ini hanya fungsi yang mengimplementasikan algoritma brute force, Anda menyebutnya lewat sebagai argumen string persamaan.
sumber
["A","B","C","D"]
denganlist("ABCD")
?=
dalam definisil
.4A2=2 4B3=1
).JavaScript (ES6),
213208 bytePenjelasan
Input dan output adalah string.
Menentukan fungsi
f
yang berfungsi ganda sebagai fungsi rekursif untuk menghasilkan semua permutasi operator dan menguji permutasi lengkap dengan persamaan input yang digunakaneval
.Uji
Tes tidak menggunakan argumen default untuk kompatibilitas browser.
Tampilkan cuplikan kode
sumber