Input: Anda diberi 2 bilangan bulat, n
dan k
. n
adalah bilangan bulat positif (> = 1), dan k
bilangan bulat, yang merupakan berapa kali Anda diizinkan untuk menggunakan n
.
Output: Output semua bilangan bulat non-negatif yang dapat dibentuk dengan menggunakan paling k
n
's menggunakan operasi-operasi matematika: +
, -
, *
, /
, dan tanda kurung.
Sunting: jika bahasa Anda mendukung penghapusan elemen dari array / set / etc., Persyaratan bilangan bulat non-negatif diperlukan. Jika tidak, maka itu tidak diperlukan.
Satu-satunya nilai numerik yang dapat ada dalam ekspresi adalah n (namun berkali-kali). Jika nilai ekspresi melebihi nilai maksimum penyimpanan data apa pun yang Anda miliki (seperti int
atau long
, dll.), Anda harus menggantinya (tidak ada nilai maksimum yang dapat diberikan n
).
Kecepatan tidak penting, tetapi kode terpendek menang!
Bonus:
-50: sertakan eksponensial dalam daftar operasi matematika. Eksponensial didefinisikan sebagai bahwa basis adalah ekspresi dari n, bukan e = 2,71828 ...
-50: sertakan fungsi lantai (atau langit-langit) jika operasi yang dimungkinkan bukan bilangan bulat.
Contohnya
> 2 2
0 1 4
> 4 3
3 4 5 12 20 64 ...
(Contoh input / output tidak selalu termasuk bonus)
2
sehingga 2 harus dimasukkan dalam output. 2. dengan exponentiation yang Anda maksud meningkatkan daya, bukane^x?
3. jika Anda ingin kode-golf (kode terpendek) maka tag kode-tantangan berlebihan.2^x
(atau2**x
) sebagai eksponensial, sedangkanexp(x)
eksponensial. Per 3, itu adalah bagian dari edit yang saya buat, jadi itu dihapus sekarangJawaban:
Javascript (E6) 215 (315 - 2 * 50 bonus)
252Edit Sederhana. Bug yang benar dari 0 hilang
Didefinisikan sebagai fungsi, kemudian menghitung 10 byte lebih untuk output menggunakan
alert()
Penting banget yang ini tidak valid sesuai aturan, karena javascript tidak bisa menangani angka besar. Misalnya dengan parameter 2,5 tidak dapat menemukan 2 ^ 2 ^ 2 ^ 2 ^ 2 (yaitu 2 ^ 65536). Angka sebesar ini adalah 'Infinity' dalam javascript.
Golf
Untuk golf.Saya punya ide yang ingin saya bagikan: gunakan notasi postfix. Dalam postfix, semua jenis ekspresi dibuat hanya dari nilai dan operator - tidak perlu tanda kurung. Notasi postfix dapat diterjemahkan ke notasi aljabar infiks biasa - tapi itu di luar cakupan dalam tantangan ini.Pemakaian
Keluaran
1,2,3,4,5,8,12,16,20,32,64,252,256,260,1024,4096,65536,4294967296,1.3407807929942597e+154
Tidak disatukan
Versi pertama ini lebih rumit tetapi mungkin lebih mudah diikuti
Tampilkan ekspresi postfix untuk setiap nomor
Pemakaian
Keluaran
sumber
Python 2, 249 karakter - 50 bonus = 199
Sampel berjalan:
Ini mengklaim bonus eksponensial -50 poin. Mengizinkan exponentiation dapat memberikan hasil yang luar biasa besar untuk input kecil (hapus
pow
dari daftar operator untuk dicoba tanpa exponentiation).sumber
Mathematica, 105 byte - 100 bonus = 5
Catatan: Saat ini tidak mendukung tanda kurung. Memperbaiki setelah OP mengklarifikasi tantangan.
Jika bilangan bulat negatif juga oke, ini skor 1 sebagai gantinya.
Agak tidak terserang:
Saya mengklaim kedua bonus untuk memasukkan hasil eksponensial dan lantai non-integer.
Contoh:
sumber
Python 2.x: 32 (
132-(50+50)
)Saya akan mengklaim kedua bonus:
x/y
berperilaku seperti yang Anda harapkanfloor(x/y)
untuk berperilaku, dan itu mendukung kekuatan.Demo:
sumber
abs
Pintar, saya pikir saya mencuri itu sebagai hadiah karena menunjukkan kesalahan;)4,3
kasing?4^4^4
dimulai dengan13407...
.2**2**2**2**2
, karena saya punya satu pengulangan terlalu banyak.f(5,2)
harus tetap memberikan jawaban itu.J: -23 (77-50 * 2)
Ini belum bekerja untuk saat
n<=2
ini, tidak yakin mengapa. Saya akan melihat ke dalam memperbaiki ini, tetapi jika ada yang tahu anwer, tolong katakan di komentar.sumber
Haskell, 35
Saya tidak yakin apakah fungsi cukup atau program yang sebenarnya diperlukan, jadi saya memposting dua versi, keduanya dengan 100 bonus.
Sebagai sebuah program, skor 80:
atau sebagai fungsi, skor 35:
output sampel, untuk
(4%3)
atauecho 4 3|codegolf.exe
, diurutkan untuk pertemuan Anda:Satu-satunya hal yang sedikit aneh tentang ini adalah bahwa angka-angka floating-point
Infinity
menjadi bilangan bulat besar, tapi saya harap ini tidak terlalu menjadi masalah.sumber
J, -43 (53-2 * 50)
Ini tidak selalu berhasil, karena J mencoba mencegah perhitungan dengan angka yang terlalu besar. Jika kita diizinkan untuk menggunakan float (mesin), yang hanya diatur ke tak terhingga pada overflow, kita mendapatkan yang berikut, sedikit lebih pendek, untuk skor 52-100 = -48:
Ini adalah versi yang tidak dalam bentuk apa pun atau terinspirasi dari jawaban J saya sebelumnya, jadi saya mempostingnya sebagai jawaban terpisah. Trivia: ini mungkin pertama kalinya saya harus menggunakan fungsi eksplisit dalam jawaban J.
Penggunaan (Ya, kotak kecil adalah struktur data aktual dalam J, dan sebenarnya ditampilkan seperti ini.):
sumber
Python 2 - 212 byte (262-50)
Golf kode kedua!
EDIT: Ok dengan tanda kurung menjadi sedikit lebih besar:
Dengan kurung - 354 byte (404-50)
sumber
Haskell - 235 byte - 100 bonus = 135
Diuji dengan
Hasil ini dicapai dengan menggunakan
replicateM
. Jika kita menggunakan input4 3
,replicateM
akan memberi kita array fungsi berikut:,[[(+),(+)],[(+),(-)],[(+),(*)],[(+),(/)],[(+),(**)],[(-),(+)],[(-),(-)],[(-),(*)],[(-),(/)],[(-),(**)],[(*),(+)],[(*),(-)],[(*),(*)],[(*),(/)],[(*),(**)],[(/),(+)],[(/),(-)],[(/),(*)],[(/),(/)],[(/),(**)],[(**),(+)],[(**),(-)],[(**),(*)],[(**),(/)],[(**),(**)]]
atau lebih sederhana[[a->a->a]]
,. Setiap array kemudian dilipat dari kanan menggunakann
sebagai masukan:[(+),(+)] = 4+(4+4) = 12
. Perhatikan bahwa tidak ada operator didahulukan di sini:[(*),(+)] = 4*(4+4) != (4*4)+4
.Angka-angka yang diberikan kemudian lantai, nubed, diurutkan dan difilter untuk angka kurang dari 0.
sumber
2
ada yang hilang? (seperti(4+4)/4
)Utilitas C, dc & bash - 259 (sumber) + 21 (untuk menjalankan) - 100 bonus = 180
Simpan sebagai
calc.c
:Menyusun:
Ini akan menghasilkan permutasi dari
dc
input yang kompatibel.dc
adalah kalkulator presisi tak terbatas, sehingga dapat menghasilkan angka besar, juga memiliki eksponensial.dc
dalam mode standar menggunakan bilangan bulat aritmatika sehinggafloor
builtin, dan perintah umum did*v
dekat akhir secara efektif mengambil nilai absolut untuk meningkatkan jumlah kemungkinan hasil yang valid.Menjalankan sendiri menghasilkan banyak output, mis
Jadi untuk mendapatkan hasil, ikat ini
dc | sort -n | uniq | xargs
untuk mendapatkan output yang diinginkan, misalnyaK tertinggi yang dapat ditanganinya adalah 13, tetapi kemudian Anda akan menunggu lama untuk hasilnya!
Saat ini, ia mengikuti
# # op # op # op ...
pola yang ketat , tetapi Anda bisa mendapatkan lebih banyak angka dengan mengubah pola, misalnya:Cara ini bisa dilakukan adalah memperlakukan angka dan operator sebagai simbol dan membolehkannya sama. Anda akan mendapatkan banyak urutan yang tidak sah
dc
, tetapi biarkandc
dipecahkan. Hasil menunggu ...sumber
HASKELL 98 (bonus 198-100)
sunting: Saya berkomentar, tetapi saya tidak bisa, saya sarankan untuk memperlakukan rentang tanpa batas sebagai bonus
Sepertinya saya bahwa beberapa jawaban yang kehilangan titik:
using at most k n
. Ini berarti bahwa f (4,3) dapat menghasilkan (4/4) = 1 atau (4 * 4) = 16.Pokoknya itu jawaban saya. Saya menganggap int / int untuk berperilaku sebagai lantai. Termasuk eksponensial.
HASKELL 111 (bonus 211-100)sumber
<!-- language: lang-haskell -->
dua baris sebelum kode untuk penyorotan sintaksis.<!-- language-all: lang-haskell -->
suatu tempat sebelum blok kode pertama, trik yang saya pelajari beberapa hari yang lalu.Ruby 181 - 50 - 50 = 81
sumber