Latar Belakang
Banyak bahasa pemrograman esoterik tidak memiliki angka bawaan pada literal, jadi Anda harus menghitungnya saat runtime; dan dalam banyak kasus ini, representasi angka bisa sangat menarik. Kami sudah memiliki tantangan tentang mewakili angka untuk Underload. Tantangan ini adalah tentang mewakili angka dalam SNUSP Modular . (Perhatikan bahwa Anda tidak perlu mempelajari SNUSP untuk menyelesaikan tantangan ini - semua informasi yang Anda butuhkan ada dalam spesifikasi - tetapi Anda mungkin menemukan latar belakangnya menarik.)
Tugas
Untuk tujuan tantangan ini, nomor SNUSP Modular adalah string yang terbentuk dari karakter @
,, +
dan =
, kecuali bahwa karakter terakhir adalah a #
, dan bahwa karakter kedua dari belakang harus +
atau =
(tidak mungkin @
). Misalnya, nomor yang valid termasuk @+#
, ==#
dan @@+@=#
; contoh nomor yang tidak valid termasuk +=
, @@#
, dan +?+#
.
Nilai nomor SNUSP Modular dihitung secara rekursif sebagai berikut:
#
memiliki nilai 0 (ini adalah kasus dasar).- Jika angka memiliki bentuk
=x
, untuk string apa punx
, nilainya sama dengan nilaix
. - Jika angka memiliki bentuk
+x
, untuk string apa punx
, nilainya sama dengan nilaix
, ditambah 1. - Jika angka memiliki bentuk
@cx
, untuk karakter tunggalc
dan string apa punx
, nilainya sama dengan nilaix
, ditambah nilaicx
.
Untuk tantangan ini, Anda harus menulis sebuah program yang mengambil bilangan bulat non-negatif sebagai input, dan menghasilkan string yang merupakan nomor SNUSP Modular tersingkat yang memiliki nilai sama dengan input.
Klarifikasi
- Sangat mungkin bahwa akan ada lebih dari satu string dengan nilai yang sama, dan khususnya, untuk beberapa bilangan bulat akan ada ikatan untuk nomor SNUSP Modular terpendek dengan nilai itu. Dalam kasus seperti itu, Anda dapat menampilkan nomor apa pun yang terkait dengan seri.
- Tidak ada batasan pada algoritma yang Anda gunakan untuk menemukan nomornya; misalnya, string kasar dan mengevaluasinya adalah taktik hukum, tetapi begitu juga melakukan sesuatu yang lebih pintar untuk mengurangi ruang pencarian.
- Seperti biasa di PPCG, kiriman Anda bisa berupa program lengkap atau fungsi (pilih mana yang lebih ringkas dalam bahasa Anda).
- Ini bukan masalah tentang penanganan format input dan output, sehingga Anda dapat menggunakan cara apa pun yang masuk akal untuk memasukkan bilangan bulat negatif dan mengeluarkan string. Ada panduan lengkap tentang meta , tetapi metode hukum yang paling umum digunakan meliputi argumen fungsi / pengembalian, argumen baris perintah, dan input standar / output standar.
Uji kasus
Berikut adalah representasi terpendek dari beberapa angka pertama:
- 0 :
#
- 1 :
+#
- 2 :
++#
- 3 :
+++#
atau@++#
- 4 :
++++#
atau+@++#
atau@=++#
- 5 :
@+++#
atau@@++#
- 6 :
+@+++#
atau+@@++#
atau@=+++#
atau@=@++#
atau@@=++#
- 7 :
@++++#
atau@+@++#
- 8 :
@@+++#
atau@@@++#
- 9 :
+@@+++#
atau+@@@++#
atau@+++++#
atau@++@++#
atau@+@=++#
atau@@=+++#
atau@@=@++#
- 10 :
@=@+++#
atau@=@@++#
atau@@@=++#
( ini adalah kasus uji yang cukup penting untuk diperiksa , karena semua jawaban yang mungkin termasuk=
) - 11 :
@+@+++#
atau@+@@++#
atau@@++++#
atau@@+@++#
- 12 :
+@+@+++#
atau+@+@@++#
atau+@@++++#
atau+@@+@++#
atau@=+@+++#
atau@=+@@++#
atau@=@=+++#
atau@=@=@++#
atau@=@@=++#
atau@@=++++#
atau@@=+@++#
atau@@=@=++#
- 13 :
@@@+++#
atau@@@@++#
- 14 :
+@@@+++#
atau+@@@@++#
atau@=@++++#
atau@=@+@++#
atau@@+++++#
atau@@++@++#
atau@@+@=++#
- 15 :
@+@++++#
atau@+@+@++#
atau@@=@+++#
atau@@=@@++#
atau@@@=+++#
atau@@@=@++#
Sebagai kasus uji yang lebih besar, output dari input 40 harus @@@=@@+++#
, @@@=@@@++#
, @@@@=@+++#
, atau @@@@=@@++#
.
Kondisi kemenangan
Sebagai tantangan kode-golf , pemenangnya adalah entri terpendek, diukur dalam byte.
=
hanya akan terjadi secara optimal@=
, kan?Jawaban:
Oracle SQL 11.2,
341262 byteVersi lama
: 1 angka untuk diwakili dalam SNUSP Modular
Tidak golf:
Pertama buat tampilan dengan 3 baris, satu untuk setiap simbol yang digunakan untuk mewakili angka, minus # yang hanya digunakan di akhir string:
Kemudian tampilan rekursif dan menghasilkan setiap string yang mungkin dengan 3 simbol tersebut, menggabungkannya menjadi # dan mengevaluasinya.
Parameternya adalah:
s: representasi SNUSP Modular dari angka yang dievaluasi
v: nilai desimal dari s yang dihitung oleh iterasi sebelumnya
p: v dihitung dengan iterasi i-2
c: simbol berikutnya untuk digabungkan ke s
i: panjang s, hanya s diperlukan untuk menyingkirkan dua LENGTH () untuk tujuan bermain golf
Jika simbol terakhir adalah + lalu tambahkan 1
Jika itu adalah @ tambahkan nilai dari iterasi i-2
Lain simbol tersebut adalah # atau =. v diinisialisasi dengan 0 di bagian init dari tampilan rekursif, sehingga v baru sama dengan v sebelumnya dalam kedua kasus.
Setiap string yang mungkin dengan 3 simbol dihitung, bagian ini memastikan bahwa permintaan tidak berjalan sampai krisis besar.
Karena tidak ada aturan untuk konstruksi string, duplikat pasti akan muncul. Berada dalam pandangan rekursif, Oracle menginterpretasikan duplikat-duplikat itu sebagai siklus dan melemparkan kesalahan jika kasus tidak secara eksplisit ditangani.
Mengembalikan representasi SNUSP Modular pertama yang mengevaluasi ke angka desimal yang dimasukkan sebagai parameter: 1
Dalam tes saya, baris pertama selalu merupakan salah satu representasi terpendek.
Jika database Anda tidak akan bertindak dengan cara yang sama, maka klausa terakhir harus diganti
sumber
JavaScript (ES6), 100 byte
Algoritme pencarian luas pertama brute-force.
sumber
t<n
menjadit-n
mungkin bekerja ...Pyth, 41 byte
Suite uji
Bagaimana itu bekerja:
Ada dua bagian. Fungsi rekursif yang menghitung nilai ekspresi SNUSP tanpa trailing
#
, dan rutin brute force.Evalutaion:
Kasar:
sumber
CJam, 58
Brute force, dengan sedikit inspirasi dari jawaban Neil. Cobalah online
Versi efisien, 107
Cobalah online
Ini menggunakan pemrograman dinamis.
sumber
Haskell ,
8986 byteEDIT:
Solusi brute force lain yang berakhir dengan banyak inspirasi dari jawaban Neil. (Meskipun itu bekerja lebih seperti Pyth isaacg sebelum golf memperkenalkan
l
.)Cobalah online!
f
adalah fungsi utama, yang mengambil integer dan mengembalikan sebuah string.l
adalah daftar tuple yang tak terbatas(a,b,s)
, representasi terpendeks
pertama, bersama dengan nilainyaa
dan nilaib
representasi dengan char pertama dilucuti. (seperti orang lain juga perhatikan / perhatikan, tidak ada salahnya memperlakukan yang terakhir sebagai 0 untuk#
.)l
selain yang pertama dihasilkan secara rekursif dengan pemahaman daftar.d
adalah karakter yang harus diawali untuks
menghasilkan representasi baru dalam daftar, dan 'c' adalah kenaikan yang sesuai untuka
.sumber