pengantar
Ini adalah salah satu teka-teki matematika favorit saya.
Diberi angka (katakanlah 3) dan berapa kali menggunakan angka itu (katakanlah 5), hasilkan 10 ekspresi yang menghasilkan 1, 2, 3, 4, 5, 6, 7, 8, 9 dan 10 menggunakan just +, -, ×, ÷, ^ dan √ (root) (tanda kurung diperbolehkan untuk operasi grup).
Sebagai contoh:
(3^3 + 3)/(3 + 3) = (33 - 3)/(3 + 3) = 3 + 3/3 + 3/3 = 5
Perhatikan bahwa semua di atas menggunakan lima 3 dan operasi matematika dan hasil ke 5. Anda juga dapat menggunakan 3 sebelum √ untuk menunjukkan akar pangkat tiga. Hal yang sama berlaku untuk menggunakan 4 sebelum √ untuk menunjukkan akar keempat.
Juga perhatikan bahwa dua 3 dapat digunakan untuk membentuk 33, atau tiga 3 dapat digunakan untuk membentuk 333 dan seterusnya.
Tantangan
- Anda akan diberi dua angka (keduanya mulai dari 1 hingga 5) sebagai argumen fungsi, STDIN atau argumen baris perintah.
- Angka pertama menunjukkan digit mana yang digunakan dan angka kedua menunjukkan berapa kali digit itu digunakan dalam ekspresi.
- Program Anda harus menampilkan array ukuran 10 (atau 10 angka yang dipisahkan spasi) di mana setiap elemen menunjukkan apakah ekspresi matematika (hanya menggunakan operator yang diizinkan) yang menghasilkan
(index + 1)
angka tersebut mungkin atau tidak menggunakan nilai kebenaran / kepalsuan.
Misalnya, jika inputnya adalah
1 3
Maka output seharusnya
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1]
karena hanya 1, 2, 3 dan 10 yang dapat diekspresikan menggunakan tiga 1.
Skor
- Ini adalah kode-golf sehingga panjang kode minimum dalam byte menang.
Bonus
Cetak-em-semua [−50]
Kurangi 50 dari skor Anda jika elemen array output sama dengan jumlah total kombinasi yang masuk akal untuk mendapatkan (index + 1)
nilai alih-alih nilai jujur atau palsu.
Sebagai contoh, jika hanya ada 3 kemungkinan kombinasi dari lima 3 yang menghasilkan 5, maka entri ke- 4 larik keluaran haruslah 3.
Matematika Ekstrim [−100]
Kurangi 100 dari skor Anda jika elemen array output mengandung setidaknya satu dari ekspresi aktual yang menghasilkan (index + 1)
nilai.
Misalnya, jika menggunakan lima 3, entri ke- 4 larik keluaran dapat berupa (3^3 + 3)/(3 + 3)
, (33 - 3)/(3 + 3)
atau3 + 3/3 + 3/3
Berlebihan [−200]
Kurangi 200 dari skor Anda jika elemen array keluaran berisi semua kemungkinan kombinasi (dipisahkan oleh |
). Bonus ini ditambahkan di atas bonus Matematika Ekstrim , sehingga Anda mendapatkan total −300.
Misalnya, jika menggunakan lima 3, elemen ke- 4 larik keluaran harus(3^3 + 3)/(3 + 3)|(33 - 3)/(3 + 3)|3 + 3/3 + 3/3
Catatan: Setiap dua ekspresi untuk mencapai hasil yang sama harus berbeda secara logis dengan pendekatan yang berbeda di keduanya.
Misalnya, untuk mendapatkan 5 menggunakan lima 3, 3 + 3/3 + 3/3
sama 3/3 + 3 + 3/3
atau 3/3 + 3/3 + 3
karena pendekatan yang sama diambil untuk masing-masing. (3^3 + 3)/(3 + 3)
dan (33 - 3)/(3 + 3)
berbeda, karena 30 dalam pembilang dicapai melalui pendekatan yang berbeda.
UPDATE : Setelah melalui semua jawaban, ditemukan bahwa semua jawaban memiliki ketidaksempurnaan karena kasus tepi unary -
dan √. Dengan demikian, melewatkan kasus tepi itu dianggap oke sejauh kelengkapan jawaban terlibat.
Ini adalah pertanyaan yang sulit, tetapi yang agak menarik.
Selamat bermain golf!
sumber
1
s?Jawaban:
Python 3 (tidak sempurna), 449 - 300 = 149
Menderita semua kekurangan yang sama dengan solusi KSab : tidak ada operator unary, yang dipasangkan sepenuhnya, mengandung ekspresi yang sama seperti
(1+1)+1
dan1+(1+1)
. Saya menghilangkan duplikat yang tepat dengan meneruskan hasilnya keset()
. Outputnya bisa sedikit lebih buruk untuk menghemat beberapa byte, tapi saya suka cara ini. Saya juga tidak melakukan nth root karena sepertinya mereka tidak banyak memberi Anda masalah ini.Ini akan memakan waktu beberapa menit untuk dijalankan jika argumen kedua adalah 5. Tes dengan menelepon
m(digit, number)
:sumber
Python (tidak sempurna)
493474 - 300 = 174Ada sejumlah masalah dengan solusi ini, pertama bahwa ia mengabaikan eksponen yang terlalu besar (apa pun di mana eksponen lebih besar dari 100). Saya sebenarnya tidak berpikir ini menghilangkan kemungkinan input kurang dari atau sama dengan 5, tapi saya tidak 100% yakin.
Hal lain adalah bahwa ia tidak mempertimbangkan akar kuadrat apapun, karena akan menjadi rumit (solusi apa pun dengan istilah apa pun yang sama dengan 0 atau 1 akan menghasilkan jumlah solusi yang tak terbatas). Itu juga tidak mempertimbangkan negasi unary (simbol '-') untuk alasan yang sama, dan juga fakta bahwa saya tidak benar-benar yakin jika pertanyaannya diajukan.
Saya juga mempertimbangkan kriteria apa yang harus memutuskan jika dua ekspresi adalah setara, tetapi saya tidak dapat menemukan cara untuk mendefinisikannya secara ketat dengan cara yang saya temukan intuitif, jadi (setidaknya untuk saat ini) saya tidak menerapkan hal seperti itu. Ini berarti bahwa itu menghasilkan beberapa hasil, dan juga menggunakan tanda kurung dengan cara yang cukup naif.
Di samping catatan saya pikir ini mungkin termasuk baris kode terpanjang yang pernah saya tulis, terutama sebelum golf sepenuhnya.
Contoh: ('v' mewakili '√')
sumber
L
:L=lambda D,N:[(int(str(D)*N),str(D)*N)]+[(o(u,v),"(%s%s%s)"%(s,c,t))for p in R(1,N)for u,s in L(D,p)for v,t in L(D,N-p)for c,o in[('+',F('a+b')),('-',F('a-b')),('*',F('a*b')),('/',F("1.*a/b if b else''")),('^',F("''if(a<0 and int(b)!=b)|(a and b<0)or b>100 else a**b")),('v',F("''if a==0 or(b<0 and int(1./a)!=(1./a))or(b or a<0)or(1./a)>100 else b**(1./a)"))]if o(u,v)!='']
0
, saya mencoba untuk meniadakan pernyataan, kemudian menukar konsekuensinya. Saya juga menemukan beberapa tempat untuk digunakan|
dan&
bukannyaor
danand
. Kedua trik ini dapat digunakan untuk mempersingkat panggilan terakhir ke F, tetapi yang satu membutuhkan beberapa Demorgan dan saya kehabisan waktu paruh; peval
butuh waktu cukup lama untuk mencari tahu baris kedua Anda! Saya pikir saya membuat Anda mengalahkan pada "baris tunggal terpanjang," meskipun. ;) Saya setuju untuk mengabaikan eksponen besar; sebenarnya, saya pikir eksponen yang lebih besar dari 9 tidak akan berguna (kecuali sebagai no-op ketika basisnya 1).3 = 33 √ (3 ^ 33)
. Sebenarnya ketika saya menulis ini saya menyadari bahwa dua (mungkin hanya dua?) Kombinasi yang saya lewatkan4 = (4^4) √ (4 ^ (4^4))
dan ekspresi yang setara dengan5
s. Memang root tampaknya tidak menambah banyak masalah, karena sebagian besar dari mereka baik digunakan sebagai no-ops pada 0 atau 1, no-ops ketika root adalah 1, atau hanya untuk membatalkan kekuatan.Python 3 -
349346Berikut ini adalah versi yang agak tidak bercabang:
Untuk pengujian saya sarankan untuk mengubah
(9)
ke sesuatu yang lebih kecil, karena ini adalah jumlah dari beberapa akar kuadrat yang diperhitungkan, yang memiliki dampak besar pada kinerja.Akhirnya, ini membuat saya bertanya-tanya, apakah minus unary sebenarnya diperlukan dalam beberapa kasus ...
sumber
1 = 3^3 * 3^(-3)
, tetapi bahkan mempertimbangkan ini, saya ragu ada angka yang ini merupakan solusi yang mungkin ketika tidak ada yang lain.a**.5**%i
alih-aliha**(1/2**%i)
menghitung beberapa akar kuadrat.Mathematica - 246 karakter (tidak ada bonus diklaim)
Penjelasan
Fungsi
j
menggabungkan dua angka digit-bijaksana.Fungsi
z
mengambil hasilr
, jumlahn
, dan daftar fungsiL
, masing-masing yang beroperasi pada dua argumen. Itu kemudian menerapkan daftar fungsi secara berurutan ke argumen[r,n]
menggunakan rekursi, sampai daftar kosong, di mana ia mengembalikan hasilnya.Fungsinya
a
mengambil sejumlahn
dan sejumlah salinant
. Itu membuat semua tuple panjang (t-1) dari daftar fungsi{Plus, f, Times, g, Power, h, j}
dan mengirimkan setiap tuple melalui fungsi z, kemudian mengembalikan daftar semua angka 1 hingga 10 yang telah dibuat.Contoh eksekusi
a[2,3]
kembali{1, 2, 3, 6, 8}
.Keterbatasan
Karena daftar fungsi diterapkan secara berurutan, memakan satu salinan nomor setiap kali, itu dapat kehilangan beberapa kombinasi. Misalnya, ketika beroperasi pada empat berpasangan, ia akan kehilangan 22/22 = 1 karena ketidakmampuannya untuk mengevaluasi daftar fungsi yang rusak. Tentu saja, 2/2 * 2/2 = 1 mencakup kasus ini.
sumber