Latar belakang meta
Ini ditetapkan sebagai pertanyaan pada membingungkan , dan reaksi instan adalah "baik, seseorang hanya akan menyelesaikannya dengan komputer". Ada perdebatan tentang betapa rumitnya sebuah program untuk menyelesaikannya. Nah, "seberapa kompleks program ini harus" cukup banyak definisi kode-golf , jadi mungkin PPCG dapat menyelesaikan masalah ini?
Latar Belakang
Sebuah persamaan batang korek api pada dasarnya adalah sebuah persamaan matematika yang normal, tetapi di mana angka dan operator dibangun secara fisik dengan menempatkan korek api ke meja. (Fitur utama yang relevan dari korek api di sini adalah bahwa mereka cukup kaku dan memiliki panjang yang konstan; kadang-kadang orang menggunakan benda lain, seperti penyeka kapas.)
Untuk tantangan ini, kita tidak perlu mendefinisikan aturan khusus tentang bagaimana mengatur korek api (seperti halnya tantangan terkait); alih-alih, kami hanya peduli tentang berapa banyak korek api yang kami perlukan untuk mewakili ekspresi yang mengevaluasi ke nomor tertentu.
Tugas
Berikut adalah alfabet digit dan operator matematika yang dapat Anda gunakan, masing-masing memiliki biaya dalam korek api:
0
, seharga 6 batang korek api1
, seharga 2 batang korek api2
, seharga 5 batang korek api3
, seharga 5 batang korek api4
, seharga 4 batang korek api5
, seharga 5 batang korek api6
, seharga 6 batang korek api7
, seharga 3 batang korek api8
, seharga 7 batang korek api9
, seharga 6 batang korek api+
, seharga 2 batang korek api-
, seharga 1 batang korek api×
, seharga 2 batang korek api
(Anda dapat mewakili ×
sebagai *
dalam output program Anda jika Anda ingin, untuk menghindari perlu menggunakan karakter non-ASCII. Dalam kebanyakan pengkodean, ×
membutuhkan lebih banyak byte daripada *
, dan jadi saya membayangkan bahwa sebagian besar program akan ingin memanfaatkan kelonggaran ini .)
Anda perlu menulis sebuah program yang menggunakan integer nonnegatif sebagai input (melalui cara yang masuk akal ), dan menghasilkan ekspresi yang mengevaluasi integer sebagai output (sekali lagi melalui cara yang masuk akal). Selain itu, ekspresi harus trivial: itu harus mengandung setidaknya satu operator +
, -
atau×
. Akhirnya, ekspresi yang Anda hasilkan harus yang termurah (atau terikat untuk yang termurah) dalam hal total biaya batang korek api, di antara semua output yang memenuhi spesifikasi.
Klarifikasi
- Anda dapat membentuk angka beberapa digit melalui mengeluarkan beberapa digit dalam satu baris (mis.
11-1
Adalah output yang valid untuk diproduksi10
). Untuk lebih tepatnya, angka yang dihasilkan ditafsirkan dalam desimal. Rangkaian semacam ini bukan operasi yang bekerja pada hasil antara; hanya pada digit literal yang muncul dalam ekspresi asli. - Untuk tujuan tantangan ini.
+
,,-
dan×
merupakan operator infiks; mereka membutuhkan pertengkaran di sebelah kiri dan ke kanan. Anda tidak diizinkan menggunakannya dalam posisi awalan seperti+5
atau-8
. - Anda tidak memiliki tanda kurung (atau cara lain untuk mengontrol prioritas). Ekspresi mengevaluasi menurut aturan presedensi default tipikal (perkalian terjadi pertama kali, dan kemudian penambahan dan pengurangan dievaluasi dari kiri ke kanan).
- Anda tidak memiliki akses ke operator matematika atau konstanta selain yang tercantum di atas; solusi "berpikir lateral" sering diterima di Puzzling, tetapi tidak masuk akal untuk meminta komputer untuk membuatnya sendiri, dan di sini di PPCG, kami ingin bersikap objektif apakah solusi itu benar atau tidak.
- Aturan bilangan bulat bilangan bulat yang biasa berlaku: solusi Anda harus dapat bekerja untuk bilangan bulat besar yang sewenang-wenang dalam versi hipotetis (atau mungkin nyata) bahasa Anda di mana semua bilangan bulat tidak terikat secara default, tetapi jika program Anda gagal dalam praktik karena implementasi tidak mendukung bilangan bulat yang besar, itu tidak membatalkan solusi.
- Jika Anda menggunakan angka atau operator yang sama lebih dari sekali, Anda harus membayar biaya batang korek api setiap kali Anda menggunakannya (karena, jelas, Anda tidak dapat menggunakan kembali korek api fisik yang sama di dua lokasi berbeda di tabel).
- Tidak ada batasan waktu; solusi brute-force dapat diterima. (Meskipun jika Anda memiliki solusi yang lebih cepat daripada brute force, jangan ragu untuk mempostingnya bahkan jika itu lebih lama; melihat bagaimana pendekatan alternatif membandingkan selalu menarik.)
- Meskipun menulis penjelasan tentang kode Anda tidak pernah diperlukan , ini mungkin merupakan ide yang bagus; solusi kode-golf seringkali sangat sulit dibaca (terutama bagi orang yang tidak terbiasa dengan bahasa yang mereka tulis), dan mungkin sulit untuk mengevaluasi (dan dengan demikian memilih) sebuah solusi kecuali Anda mengerti cara kerjanya.
Kondisi kemenangan
Sebagai tantangan kode-golf , jawaban dengan byte lebih sedikit dianggap lebih baik. Namun, seperti biasa, jangan ragu untuk mengirim jawaban dengan pendekatan yang berbeda, atau dalam bahasa tertentu bahkan jika mereka lebih bertele-tele daripada bahasa lain; tujuan golf adalah untuk melihat seberapa jauh Anda dapat mengoptimalkan program tertentu, dan melakukan hal-hal seperti ini memberi kami banyak program potensial untuk dioptimalkan. Jadi jangan berkecil hati jika seseorang mengajukan solusi menggunakan pendekatan yang sama sekali berbeda, atau bahasa yang sama sekali berbeda, dan mendapat jawaban yang jauh lebih pendek; mungkin saja jawaban Anda dioptimalkan dengan lebih baik dan menunjukkan lebih banyak keterampilan, dan pemilih di PPCG sering menghargai itu.
sumber
Jawaban:
Python2, 1̶9̶8̶ ̶b̶y̶t̶e̶s̶ 182 bytes berkat math_junkie
Algoritma ini tidak melakukan apa pun untuk mengecualikan versi awalan
+
dan-
, tetapi mereka akan lebih buruk daripada, atau sama dengan dan muncul kemudian dalam pencarian, rekan-rekan infiks mereka. Karena menggunakan argumen kata kunci secarae
bergantian, itu akan memberikan hasil yang tidak valid jika dipanggil beberapa kali per sesi. Untuk memperbaikinya, gunakanf(n, e=[(0,'')])
bukan hanyaf(n)
. Perhatikan bahwa indentasi empat spasi mewakili tab, jadi ini hanya akan bekerja dengan Python 2.Saya juga memiliki versi tidak dioptimalkan dan dioptimalkan yang berjalan cepat bahkan untuk jumlah yang cukup besar:
sumber
PHP, 241 Bytes
Versi Online
Kerusakan
Cara dengan kinerja sedikit lebih baik
Dukungan bilangan bulat negatif
Versi dengan bilangan bulat negatif
sumber
$e+="6255456376"[$i[$s++]];
.