Angka Friedman adalah bilangan bulat positif yang sama dengan ekspresi non-sepele yang menggunakan digit sendiri dalam kombinasi dengan operasi +, -, *, /, ^, tanda kurung dan gabungan.
Angka Nice Friedman adalah bilangan bulat positif yang sama dengan ekspresi non-sepele yang menggunakan digit sendiri dalam kombinasi dengan operasi yang sama, dengan digit dalam urutan aslinya.
Angka Friedman yang sangat bagus (VNFN), yang saya temukan di sini, adalah angka Friedman yang bagus yang dapat ditulis tanpa bagian ekspresi yang kurang cantik (menurut saya). Kurung, konkatasi, dan negasi unary tidak diizinkan.
Untuk tantangan ini, ada tiga kemungkinan cara menulis ekspresi tanpa tanda kurung.
Awalan: Ini sama dengan asosiasi kiri. Jenis ekspresi ini ditulis dengan semua operator di sebelah kiri digit. Setiap operator berlaku untuk dua ekspresi berikut. Contohnya:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
VNFN yang dapat ditulis dengan cara ini adalah 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfix: Ini setara dengan asosiasi kanan. Ini seperti notasi awalan, kecuali bahwa operasi pergi ke kanan digit. Setiap operator berlaku untuk dua ekspresi sebelumnya. Contohnya:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
VNFN yang dapat ditulis dengan cara ini adalah 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: Notasi infix menggunakan urutan operasi standar untuk lima operasi. Untuk keperluan tantangan, urutan operasi itu akan didefinisikan sebagai berikut: Memberhentikan ^
terlebih dahulu, benar secara asosiatif. Kemudian, kurung *
dan /
secara bersamaan, pergi secara asosiatif. Akhirnya, kurung +
dan -
secara bersamaan, pergi secara asosiatif.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
VNFN yang dapat ditulis dengan cara ini adalah 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Tantangan: Diberikan bilangan bulat positif, jika dapat dinyatakan sebagai ekspresi non-sepele dari digitnya sendiri baik dalam notasi awalan, infiks atau postfix, output ekspresi itu. Jika tidak, tidak menghasilkan apa-apa.
Klarifikasi: Jika beberapa representasi dimungkinkan, Anda dapat menampilkan subset yang tidak kosong. Misalnya, 736 adalah VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
atau keduanya akan menjadi keluaran yang dapat diterima.
Ekspresi "Trivial" berarti ekspresi yang tidak menggunakan operator apa pun. Ini hanya relevan untuk satu angka angka, dan berarti bahwa satu angka angka tidak boleh VNFNs. Ini diwarisi dari definisi Nomor Friedman.
Jawaban harus berjalan dalam hitungan detik atau menit pada input di bawah satu juta.
IO: Aturan IO standar. Program penuh, fungsi, kata kerja atau sejenisnya. STDIN, baris perintah, argumen fungsi atau yang serupa. Untuk menghasilkan "Tidak Ada", string kosong, baris kosong, null
atau serupa, dan koleksi kosong semuanya baik-baik saja. Keluaran dapat berupa string yang dibatasi dengan karakter yang tidak bisa dalam representasi, atau mungkin kumpulan string.
Contoh:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Penilaian: Ini adalah kode golf. Bytes paling sedikit menang.
Juga, jika Anda menemukannya, tolong berikan Nomor Friedman Sangat Bagus baru dalam jawaban Anda.
sumber
*(+(*(1,2),3,4)
hilang satu paren dekat, setelah,3
Parentheses, concatenation and unary negation are disallowed.
Jawaban:
Perl,
345334318293263245BTelepon dengan
perl -M5.10.0 scratch.pl 736
Hasil
Beberapa hasil pertama yang saya temukan adalah:
Penjelasan
Sepenuhnya ungolfed
Saya berusaha mengulangi diri saya sebanyak mungkin untuk membuat golf nanti lebih mudah.
Bagaimana cara bermain golf
$_=q! ... !;eval
Ini memberikan sesuatu seperti ini, dari mana Anda dapat menghapus jeda baris untuk hasilnya:
sumber
}glob
dan menyimpan beberapa byte.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Hanya Ruby 2.1.5 -
213220238 + 9 = 247Tidak yakin bagaimana Ruby mengalahkan Perl, tapi ini dia ...
Jalankan ini dengan flag -rtimeout (dan -W0 atau kirim stderr Anda ke tempat lain).
Untuk membuat ini sedikit lebih kuat, ganti
send([].methods[81],z-1)
denganrepeated_permutation(z-1)
dan nilai karakter tambahan (jadi, 248 ).Pada dasarnya, telusuri semua permutasi operator dan coba infiks, postfix, dan prefix dalam urutan itu. The
d
metode penggunaaneval
pada parameter kedua untuk melakukan perhitungan, menangkap setiap DivideByZero atau Overflow pengecualian.Anda perlu mengirim stderr ke / dev / null, atau yang lain
eval
akan mencetak peringatan seperti(eval):1: warning: in a**b, b may be too big
.Sementara saya menemukan ungolfing ini, saya menemukan cara untuk menyelamatkan tiga karakter!
Tidak disatukan (prinsip-prinsip usang tetapi serupa):
Changelog
247 membuat ini berfungsi untuk angka yang lebih besar daripada waktu habis.
220 mencukur tiga karakter dengan mendeklarasikan array paren, dan memperbaiki bug di mana satu digit angka dianggap sebagai VNFN
213 komit awal
sumber
a.zip(b,c)
mengembalikan array array seperti[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
dan['hi', 'there']*''
hanya merangkai representasi string dari nilai array.[a,b]*3
hasilkan[a,b,a,b,a,b]
MATLAB (435 b)
coba di sini
http://octave-online.net/
sumber
Python 2, 303 byte
Cobalah online
Output infix akan berisi
**
bukan^
. Jika ini tidak diizinkan,.replace('**','^')
akan muncul dan menambahkan 18 byte lagiPenjelasan:
sumber