Ini sangat menyenangkan! Namun dengan hanya tiga digit, kesenangan itu terlalu cepat berlalu. Tantangan ini serupa, tetapi kami akan terus bersenang-senang.
Tantangan
Cetak sebanyak mungkin Rasio Emas φ sebanyak mungkin. Rasio Emas didefinisikan sebagai angka yang memenuhi φ = (φ + 1) / φ dan 100 digit pertama diberikan oleh:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Tantangan ini bukan tentang komputasi φ! Ini tentang mencetak angka sebanyak mungkin tanpa menggunakan metode apa pun untuk melakukan itu dua kali. Jadi temukan sebanyak mungkin cara kreatif untuk mendapatkan angka Anda!
Batasan
Dengan sendirinya, mencetak angka φ akan menjadi terlalu sederhana, jadi inilah aturannya:
- Anda harus membuat angka secara berurutan dari kiri ke kanan , baik dengan mencetaknya sepotong demi sepotong atau dengan membangun string dari kiri ke kanan dan mencetaknya di akhir - Anda bahkan dapat menghasilkan array karakter digit dan kemudian bergabung dengan dan cetak, selama Anda melakukannya secara berurutan. Dalam aturan berikut ini, "cetak" dan "keluaran" dapat merujuk ke salah satu dari proses tersebut (mis. Jika Anda sedang membangun string, dan string berisi
1.6
yang dianggap1.6
sudah dicetak). - Untuk kode Anda, Anda mendapatkan anggaran 15 karakter per digit . Periode tidak dihitung terhadap anggaran itu, tetapi harus dicetak juga. Perhatikan bahwa batasan hanya pada ukuran kode total: Anda dapat menggunakan lebih dari 15 karakter untuk setiap digit selama Anda tidak menggunakan lebih dari rata-rata. Bahkan, Anda dapat membangun "hutang" dalam karakter dan "melunasinya" nanti. Misalnya untuk mencetak
1.618
Anda memiliki 60 karakter. - Pustaka-standar termasuk / impor tidak dihitung terhadap ukuran kode. Tetapi Anda tidak dapat memberikan itu termasuk alias steno secara gratis!
- Anda tidak boleh menggunakan angka yang sedang Anda hasilkan, atau angka yang sudah Anda cetak. Misalnya
1
dapat muncul di kode sumber Anda, karena ini adalah digit pertama. Kode yang menampilkan8
dalam1.618
dapat menggunakan salah satu atau semua digit[0234579]
, tetapi tidak ada[168]
. Untuk tujuan ini, semua literal yang setara dengan satu digit diperlakukan sebagai digit itu . Jadi, jika bahasa Anda bisa mewakili9
karena'\t'
Anda tidak diizinkan menggunakannya di mana saja, di mana Anda tidak bisa menggunakannya9
. - Anda tidak boleh menghasilkan banyak digit sekaligus. Seharusnya mungkin untuk dengan jelas membagi kode Anda menjadi potongan-potongan yang menghasilkan satu digit waktu.
Anda tidak harus mengacu pada built-in fungsi, matematika operator / string / boolean / bit-bijaksana, variabel atau konstanta yang telah Anda gunakan dalam kode yang dihasilkan digit sebelumnya.Pengecualian adalah konversi bilangan bulat ke string, penggabungan string dan fungsi pencetakan yang mungkin Anda perlukan untuk setiap digit. Perhatikan bahwa tidak masalah dengan nama mana Anda merujuk ke built-in apa pun: hanya karena Anda alias built-in
PI
untuk keduanyap
danq
tidak berarti Anda bisa menggunakannyap
sekali danq
sekali. Demikian juga, Anda yang diizinkan untuk menggunakan nama dua kali jika mengacu pada dua berbeda built-in, seperti talilength
dan berbagailength
.Jika bahasa pemrograman Anda tidak memiliki fungsi gunakan penilaian terbaik Anda tentang apa yang setara akan - misalnya untuk bash scripting, memanggil program lain harus mengikuti aturan yang dikenakan pada fungsi
- Kiriman Anda harus ditulis dalam satu bahasa. Jadi, jangan mengeksekusi juru bahasa lain untuk mendapatkan akses ke built-in bahasa itu juga.
Implikasi
Poin-poin berikut semuanya tersirat oleh aturan di atas, tetapi saya menambahkannya di sini untuk menghindari pertanyaan yang telah muncul di sandbox ::
- Anda tidak diizinkan untuk menimpa bagian dari output Anda dengan mencetak beberapa spasi mundur (biasanya
'\b'
) di antaranya. - Loop yang menghasilkan / menghasilkan banyak digit dilarang. (Namun, loop yang menghitung satu digit baik-baik saja.)
- Dilarang menggunakan versi yang dikaburkan
(1 + √5)/2
atau membagi angka Fibonacci untuk mendapatkan lebih dari satu digit. - Anda tidak dapat menghitung ulang 10 digit dan menyimpannya dalam 10 variabel dan kemudian merujuknya saja, karena referensi variabel tersebut tidak ' menghasilkan digit - kode yang mengisi variabel, jadi ini merupakan pelanggaran aturan 6.
- Bahkan, Anda tidak dapat menggunakan kembali hasil sebelumnya (atau hasil antara), karena itu berarti dua digit akan berbagi kode dihasilkan .
- Jika tidak, Anda dapat menggunakan segala cara apa pun (yang tidak harus murni matematis) untuk menghasilkan angka. (Dan kamu harus!)
- Bahkan tidak perlu menghitung apa pun, jika Anda dapat menarik digit yang benar dari berbagai tempat menggunakan perpustakaan standar Anda.
- Anda dapat menggunakan operator beberapa kali sambil menghasilkan satu digit, begitu
2+2+2
juga permainan yang adil untuk menghasilkan yang pertama6
(meskipun itu bukan yang terpendek). - Anda dapat menggunakan literal apa pun sesering yang Anda inginkan, karena konstanta itu tidak ada. Jadi, selama Anda tidak harus mencetak
5
, Anda dapat sebanyak mungkin5
dalam kode yang Anda inginkan. - Anda tidak dapat membuat hardcode output, karena itu akan melibatkan menggunakan digit yang Anda outputkan.
Singkatnya: jangan gunakan metode apa pun untuk menghasilkan digit dua kali dan jangan gunakan digit yang saat ini Anda hasilkan atau yang sudah dicetak.
Jika Anda menemukan celah yang memungkinkan Anda untuk mendapatkan skor (kuasi-) tanpa batas, tolong jangan merusak tantangan dengan mengeksploitasinya, tetapi beri tahu saya agar saya dapat melihat apakah celah itu dapat diperbaiki tanpa merusak apa pun.
Mencetak gol
Program yang mencetak angka tertinggi dengan benar akan menang. Dalam kasus seri, kode yang lebih pendek akan merusak seri.
Harap tambahkan versi komentar yang tidak diklik yang mengidentifikasi bagian mana dari kode Anda yang menghasilkan digit mana.
PS: Jika ada yang mengalahkan 100 digit di atas, berikut ini ada beberapa lagi .
sumber
x = (x+1)/x
(ataux^2 = x+1
) (ataux^2-x+1
).Jawaban:
PHP, 100 digit
Saya mungkin sedikit membengkokkan aturan di sini, tetapi PHP memiliki banyak konstanta untuk dipilih:
Ini mungkin bukan kode yang sangat portabel, tetapi berfungsi dengan baik di sistem saya. Inilah kode yang menghasilkannya:
sumber
<?for(;;);
menggunakan memori 9MB. Sekarang saya tahu mengapa ... Saya suka pembatasan yang diberlakukan sendiri oleh @ kernigh # 7, yang menutup celah semacam ini. Juga, untuk apa nilainya, output pada sistem saya adalah ini: codepad.org/wSrtJBcoPerl - 37 digit
392 byte saat ini, (10,6 per digit).
Keluaran:
Pembatasan yang diterapkan sendiri
Saya telah menambahkan beberapa batasan tambahan untuk membatasi penggunaan fitur bahasa yang akan meremehkan masalah. Misalnya, array dereference
@{...}
dan indeks akhir array$#{...}
hanya digunakan satu kali. Setiap array yang digunakan dihasilkan dengan cara yang berbeda (bandingkan[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). Selain itu, tidak ada simbol atau kata kunci yang digunakan lebih dari sekali, meskipun ini secara eksplisit diizinkan dalam deskripsi tantangan. Saya pikir ini ide yang bagus untuk perl (atau bahasa apa pun dengan variabel khusus int-only (ada yang lain?)), Karena itu membatasi jumlah konversi int implisit.Potongan
sumber
Python 2.7, 19 angka, 231 karakter yang relevan
sumber
Ruby 2.1 untuk 54 digit, 808 karakter
Program ini bekerja dengan
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Sistem selain OpenBSD 5.5 mungkin memiliki nilai yang berbeda untuk beberapa digit.Interpretasi
Pembatasan tantangan ini, terutama pembatasan 6, tidak tepat untuk Ruby. Jadi saya menambahkan interpretasi saya sendiri:
$<.fileno
, dan titik dua mendapat konstanta, seperti padaIO::LOCK_NB
. Nama metode atau konstanta adalah bagian dari operasi. Karena()
.
::
bukan operator, saya tidak menerapkan batasan 6 untuk mereka. Saya dapat menggunakannya kembali untuk menghasilkan lebih banyak digit.Array#count
danEnumerable#count
bukan fungsi yang sama untuk pembatasan 6. Kedua metode bertindak sama, tetapiArray#count
ditimpaEnumerable#count
dengan implementasi yang berbeda. Jika saya gunakanArray#count
untuk menghasilkan satu digit, saya dapat menggunakanEnumerable#count
untuk menghasilkan digit lain.Mutex.new
,Random.new
,Time.new
dan sebagainya mengacu pada metode yang sama,Class#new
. Saya gunakanSignalException.new
untuk menghasilkan satu digit. Karena batasan 6, saya mungkin tidak akan pernah menggunakannya lagiClass#new
.Float
danIO
adalah konstanta! Saya gunakanIO::LOCK_NB
untuk menghasilkan satu digit. Karena batasan 6, saya mungkin tidak akan pernah menggunakannya lagiIO
. Interpretasi ini hanya mengikat Ruby, dan bukan bahasa lain di mana nama paket bukan konstanta.[]
{}
//
''
. Saya mungkin selalu menggunakan literal seperti itu untuk menghasilkan lebih banyak digit.File::APPEND
danIPSocket::LOCK_UN
dua nama untuk nomor yang sama 8. Pembatasan 6 mengatakan, "tidak masalah dengan nama mana Anda merujuk ke built-in." KarenaFile::APPEND
danIPSocket::LOCK_UN
hanya berbeda nama, mereka harus konstan yang sama, jadi saya tidak boleh menggunakannya untuk dua digit.$SAFE
adalah variabel global bawaan, bukan fungsi, operator, konstan, atau literal.$SAFE
memiliki nilai 0. Dengan celah itu, saya dapat menggunakan kembali$SAFE
untuk menghasilkan setiap digit 0 dalam program. Saya menutup celah dengan menafsirkan batasan 6 untuk juga membatasi variabel global.Komentar
Baris pertama adalah
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Ruby memecah baris ini dan memuat enam bagian dari perpustakaan standarnya, seolah-olah olehrequire 'date'
,require 'digest'
dan seterusnya. Saya tidak menghitung 56 karakter ini, karena pembatasan 3 membebaskan "impor perpustakaan standar / termasuk".Sisa program memanggil
print
dengan daftar panjang argumen, untuk mengubahnya menjadi string dan mencetaknya secara berurutan. Argumennya adalah ini:1
from2/2
: division Fixnum # /.
from?.
: string karakter tunggal literal6
dari9-3
: pengurangan Fixnum # -1
dari3&5
: bitwise dan Fixnum # &3
lagi.8
dari2*4
: multiplikasi Fixnum # *0
dari2^2
: bitwise eksklusif-atau Fixnum # ^3
dari7%4
: modulus Fixnum #%3
dari55>>4
: shift kanan Fixnum # >>9
dari5+4
: tambahan Fixnum # +8
dari2<<2
: shift kiri Fixnum # <<8
dari-~7
: negasi komplemen Fixnum # - @ Fixnum # ~7
dari5|2
: bitwise atau Fixnum # |4
dari2**2
: exponentiation Fixnum # **9
dari(2r+2+5).to_i
: tambahan rasional Rasional # + Rasional # to_i2r
baru di Ruby 2.1.2r+2
memanggil Rasional # + dan mengembalikan rasional lainnya;2r+2+5
memanggil Rasional # + lagi.2/1
dan float like2.0
. Untuk memperbaiki ini, saya mengkonversi ke integer: to_i putaran menuju nol, ceil putaran atas, lantai putaran bawah.8
dari(2.2+5).ceil
: float Selain Float # + Float # ceil()
dan dot.
lagi.9
dari(55r/5-2).floor
: pembagian rasional dan pengurangan Rasional # / Rasional # - Rasional # lantai4
from(2.2*2).to_i
: float multiplication Float # * Float # to_i8
dari(2r*2*2).ceil
: perkalian rasional Rasional # * Rasional # ceil4
dari(2.2**2).floor
: eksponensial rasional Rasional # **8
from2.to_bn<<2
: shift kiri dengan OpenSSL angka besar Fixnum # to_bn OpenSSL :: BN # <<2
dari__LINE__
: konstanta ajaib untuk nomor baris saat ini0
from$<.to_i
: file deskriptor dari input standar IO # to_i4
fromIO::LOCK_NB
: flag untuk kunci file yang tidak menghalangiIO
. Dengan interpretasi 7, saya tidak boleh lagi menggunakan konstanta dengan nilai 4.5
fromErrno::EIO::Errno
: number untuk kesalahan input / output8
dariFile::APPEND
: panji untuk ditambahkan ke fileIO
, tetapiFile
mewarisi konstantaIO
, jadiFile::APPEND
cara yang berbeda untuk mendapatkannyaIO::APPEND
.6
dari'aaaaaa'.size
: panjang string Ukuran string #8
from?a.encoding.name.sub(/\D+/,'')
: bagian dari nama encoding String # encoding Encoding # name String # sub3
from%w[a a a].size
: length of array Ukuran # array4
dari%w[a b c d].to_set.size
: jumlah elemen dalam set Array # to_set Setel ukuran #3
dari%w[a a a].count
: hitung semua elemen Array # count6
dariSocket::AF_NS
: nomor untuk keluarga alamat NS5
dariDate.jd(Date::ITALY).wday
: nomor hari kerja untuk Jumat 15 Oktober 1582, ketika Italia beralih ke kalender Gregorian Tanggal :: jd Tanggal # wday6
from*Digest::MD5.digest(?j).scan(/\d/)
: digit ASCII pertama dalam binary MD5 digest "j" Digest :: MD5 :: digest String # scan*
melewati elemen array sebagai argumen untukprint
. Array ini adalah ["6"].3
dariSet[?a,?b,?c].count
: hitung semua elemen Set :: [] Enumerable # count8
dariSignalException.new('FPE').signo
: jumlah SIGFPE Kelas # baru SignalException # signo1
fromFloat::ROUNDS
: rounding mode, di sini 1 untuk round-to-terdekat1
frombegin
(baris baru)exit false
(baris baru)rescue Object
(baris baru)$!.status
(baris baru)end
: status keluar untuk kegagalanSystemExit.new(false).status
, tetapi dengan interpretasi 3, saya mungkin tidak lagi memanggil Kelas # baru . Alih-alih, saya meningkatkan dan menyelamatkan SystemExit.7
dariProcess::RLIMIT_NPROC
: angka untuk batas sumber daya untuk jumlah proses untuk satu pengguna7
dari:aaaaaaa.size
: panjang simbol Ukuran2
dariPrime.first
: bilangan prima pertama Enumerable # first0
from?/.next
: string berikutnya setelah "?"String # selanjutnya3
dari{a:p,b:p,c:p}.size
: panjang hash Hash # size String # p0
fromSTDIN.lineno
: nomor baris saat ini untuk input standar IO # lineno$<
. Saya menggunakanSTDIN
. Perbedaannya adalah$<
variabel global danSTDIN
konstanta. Suatu program dapat diatur$<
ke input yang berbeda, tetapiSTDIN
selalu merupakan nilai asli dari$<
.3
dari?a.crypt('at')[/\d/]
: digit ASCII pertama dalam kata sandi terenkripsi. String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: index of first key: a, value: a in hash Enumerable # find_index9
dari/b/=~'aaaaaaaaab'
: indeks di mana string cocok / b / Regexp # = ~1
dari[?a,?b].index(?b)
: index "b" pertama dalam array Array # index7
dari:aaaaaaab=~/b/
: indeks di mana simbol cocok / b / Simbol # = ~9
dari?\t.ord
: Nilai ASCII dari tab "\ t" String # ord8
dari'aaaaaaaab'=~/b/
: indeks di mana string cocok / b / String # = ~0
fromopen(?/).pos
: position in file setelah membuka direktori root "/" sebagai file Kernel # open IO # pos5
dari'aaaaab'.index(?b)
: indeks "b" pertama dalam string String # index7
dari?\a.bytes{|b|break b}
: Nilai lansiran ASCII "\ a" String # byte6
dari'aaaaaaa'.rindex(?a)
: index "a" terakhir di string String # rindex2
from%w[a a].map.size
: size enumerator yang memetakan dari array Array # map Enumerator # sizesumber
new
benar-benar selalu memanggil imlpementation yang sama atau diganti dalam subclass? [ctd.]Java, 21 digit, 276 karakter
sumber
7-4
&-4+7
, itu pintar! :)7
bukan konstanta tetapi literalRuby, 74 karakter, 10 angka
Itu baru permulaan; Saya harus pergi sehingga saya akan memperbaikinya nanti.
Saya memiliki 76 karakter yang disimpan untuk nanti, ketika itu akan semakin sulit!
sumber
Ruby, 17 digit, 168 byte
Tidak Disatukan:
Belum dipaksa untuk melakukan sesuatu yang sangat pintar, saya mungkin kembali dan menambahkan angka.
sumber
succ
dannext
alias.$.
dua kali. Meskipun, harus cinta$....
: DNaskah Golf , 17 digit
Upaya mudah. Golfscript mungkin memiliki banyak built-in satu huruf non-alfanumerik, tetapi tidak memiliki banyak built-in secara keseluruhan!
sumber
5,)\; # range, right uncons, flip, and pop
.Bash, 5 digit dalam 65 karakter
Saya akan segera memperbarui ini! Untuk saat ini, hanya dicetak
1.6180
, dan tidak mengandung angka apa pun.Penjelasan
Metode berikut digunakan untuk menghasilkan digit:
1: keluar dari status
false
6: panjang string
1:
nl
penyalahgunaan8:
kill
nomor sinyal0: nilai numerik dari ekspresi kosong
sumber
Mathematica
98 digit, dalam868378 karakter.Keluaran:
sumber
#
dengan digit diperbolehkan, dan menjatuhkan salah satu strip.Julia - 23 digit dalam 345 karakter (tepatnya 15 per digit)
Output: 1.6180339887498948482045
Saya mengartikan karakter dan string sebagai dapat digunakan, selama saya tidak menggunakan kembali karakter atau string tertentu (karakter dalam string dapat digunakan kembali, selama string tidak); Namun, saya tidak mengizinkan diri saya untuk menggunakan nilai int karakter secara langsung. Ada satu karakter non-ASCII (й).
Dengan cara yang lebih mudah dibaca (bukan kode aktual):
sumber
C ++ 12,4 karakter per baris, adalah 14 karakter per baris untuk setiap digit
Memperbaiki kesalahan saya menggunakan kembali operator.
Tidak yakin apakah menggunakan karakter seperti ini dianggap sebagai karakter literal atau tidak? Jika kode ini dapat diterima, kode itu dapat dilanjutkan selamanya dan utang char akan dibayar kembali.
sumber
-
operator. Juga, saya suka bagaimana Anda menghitung komentar untuk panjang garis. : D1
untuk menghasilkan0
(yang tidak diizinkan, karena1
muncul sebelumnya dalam rasio emas). Anda juga perlu menghitung#define S
(bukan yang lain), karena ini bukan termasuk tetapi hanya mendefinisikan alias steno.