Cetak Rasio Emas

26

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:

  1. 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.6yang dianggap 1.6sudah dicetak).
  2. 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.618Anda memiliki 60 karakter.
  3. Pustaka-standar termasuk / impor tidak dihitung terhadap ukuran kode. Tetapi Anda tidak dapat memberikan itu termasuk alias steno secara gratis!
  4. Anda tidak boleh menggunakan angka yang sedang Anda hasilkan, atau angka yang sudah Anda cetak. Misalnya 1dapat muncul di kode sumber Anda, karena ini adalah digit pertama. Kode yang menampilkan 8dalam 1.618dapat 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 mewakili 9karena '\t'Anda tidak diizinkan menggunakannya di mana saja, di mana Anda tidak bisa menggunakannya 9.
  5. Anda tidak boleh menghasilkan banyak digit sekaligus. Seharusnya mungkin untuk dengan jelas membagi kode Anda menjadi potongan-potongan yang menghasilkan satu digit waktu.
  6. 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 PIuntuk keduanya pdan qtidak berarti Anda bisa menggunakannya psekali dan qsekali. Demikian juga, Anda yang diizinkan untuk menggunakan nama dua kali jika mengacu pada dua berbeda built-in, seperti tali lengthdan berbagai length.

    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

  7. 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)/2atau 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+2juga 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 mungkin 5dalam 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 .

Martin Ender
sumber
Komentar dihapus; beri tahu saya jika ada informasi yang hilang.
Gagang Pintu
"Menggunakan versi yang dikaburkan ..." Itu hanya menggunakan rumus kuadrat pada x = (x+1)/x(atau x^2 = x+1) (atau x^2-x+1).
Cole Johnson
.... Dapatkah saya merujuk ke operator yang ditentukan implementasi lebih dari sekali?
Stackstuck
Juga, bisakah saya menggunakan kembali tugas?
Stackstuck

Jawaban:

18

PHP, 100 digit

Saya mungkin sedikit membengkokkan aturan di sini, tetapi PHP memiliki banyak konstanta untuk dipilih:

<?php
echo TRUE . '.' . PM_STR . DNS_A . MSG_EOR . LC_ALL . T_FMT . LOCK_UN . SQL_DATE
. E_NOTICE . IMG_WBMP . INI_ALL . E_PARSE . SOCKET_EBADF . LOG_USER .
IMAGETYPE_JPC . IMG_PNG . GLOB_MARK . LOCK_NB . LOG_NDELAY . D_FMT . PHP_ZTS .
GLOB_ERR . AM_STR . SQL_DOUBLE . SOL_TCP . FILE_APPEND . LOG_ERR . SORT_ASC .
SOCK_RAW . LOG_INFO . LC_TIME . SQL_FLOAT . SORT_DESC . INFO_MODULES . E_ERROR .
IMG_GIF . SQL_REAL . LOG_DEBUG . DNS_NS . CODESET . CAL_FRENCH . CURLE_OK .
LDAP_OPT_RESTART . LOCK_SH . XML_PI_NODE . SQLITE_INTERRUPT . MYSQLI_ASYNC .
CURLM_OK . SNMP_NULL . SQLITE_NOMEM . LC_MESSAGES . IMG_JPG . SO_KEEPALIVE .
SOCKET_ENXIO . LOCK_EX . D_T_FMT . ENT_QUOTES . LOG_NOTICE . SOCK_RDM .
INPUT_ENV . CURLAUTH_NTLM . INPUT_SESSION . AF_INET . IMG_JPEG . SQL_CONCURRENCY
. SEEK_SET . SOCKET_EIO . LC_CTYPE . PHP_URL_QUERY . LOG_KERN . INI_SYSTEM .
IMAGETYPE_BMP . SEEK_END . JSON_HEX_QUOT . LOG_PID . LIBXML_DTDATTR .
XML_DOCUMENT_NODE . PHP_DEBUG . LOG_CRIT . ENT_IGNORE . LC_NUMERIC .
DOM_NOT_SUPPORTED_ERR . PHP_URL_FRAGMENT . FILE_TEXT . IMAGETYPE_TIFF_II .
LOG_CONS . LOG_EMERG . UPLOAD_ERR_CANT_WRITE . MSG_PEEK . SQLITE_OK . FNM_PERIOD
. AF_UNIX . CURLPROTO_FTPS . STREAM_NOTIFY_FAILURE . MYSQL_BOTH .
CURLE_FTP_ACCESS_DENIED . MSG_OOB . FTP_TEXT . LC_MONETARY .
CURLE_COULDNT_CONNECT . SQLITE_BUSY . "\n";

Ini mungkin bukan kode yang sangat portabel, tetapi berfungsi dengan baik di sistem saya. Inilah kode yang menghasilkannya:

<?php
$phi = "6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375";
echo "<?php\necho TRUE . '.' . ";
$consts = get_defined_constants();
foreach($consts as $k=>$v) if (preg_match('/\d|TRUE|PHP_EOL/',$k)) unset($consts[$k]);
for ($p=0;$p<strlen($phi);$p++) {
  $d = ord($phi[$p]) - 48;
  $min = 999;
  foreach($consts as $k=>$v) {
    if (strlen("$v")==1 && $v==$d && strlen($k)<$min) {
      $min = strlen($k);
      $maxk = $k;
    }
  }
  if ($min==999) break;
  echo "$maxk . ";
  unset($consts[$maxk]);
}
echo "\"\\n\";\n";
osifrque melengking
sumber
Hm, saya harus akui itu mungkin benar. Satu-satunya hal yang mungkin jatuh adalah "beberapa nama merujuk pada konstanta yang sama", tetapi saya tidak benar-benar bermaksud kata-kata untuk menutupi kasus ini. Saya mengklarifikasi dalam jawaban kernigh bahwa ini hanya akan menjadi tidak valid jika benar-benar menunjuk ke integer yang sama , tapi saya pikir itu tidak mungkin. Fakta bahwa banyak dari ini bergantung pada sistem Anda adalah hal yang memalukan, tetapi juga bukan bagian dari peraturan. Jadi, kecuali orang lain dapat menemukan masalah di sini, saya harus mengakui bahwa jawaban Anda benar-benar valid. ;)
Martin Ender
<?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/wSrtJBco
primo
Meskipun, menjalankan generator tidak menghasilkan representasi yang valid, jadi +1 untuk itu;) Versi yang berjalan pada server codepad
primo
2
Selamat, Anda memecahkan tantangan. ;) ... Tidak juga ... jawaban ini agak mengesampingkan tantangan yang sebenarnya, tapi itu masih dalam aturan sejauh yang saya lihat, jadi saya harus mengakui kekalahan dan menerimanya. :)
Martin Ender
11

Perl - 37 digit

use Math::Trig;
use POSIX;

print
  !0,'.',chop$=||$=,A==A,2**3,$|,++$^F,75/5/5,pi*pi%\_,4+4,a^Y,w&'?',~"\xcb",$^=~y/_//c,
  ord"\b",unpack(h,"\t").@{[c,c,c,c]},$#{[b..j]},"$^W"|'$',$^H>>log$^H,cos()- -cos,$[,
  $-=sqrt%SIG,$%=$],$+[*$=~/($)/],split('',$~).map(glob,"{,,,}{,}"),index(\L,L),
  exp(exp)<<exp,ceil(sinh acosh$^C).keys{stat$0},rindex(\R,R),($s=ssssss)=~s/s//g,
  $?=acos(--$z),$^T=pack(u,$^T.$^T.TTTT),B~~B,C<=C,length$^V,

392 byte saat ini, (10,6 per digit).

Keluaran:

1.618033988749894848204586834365638117

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

!0                       # returns 1
'.'
chop$=||$=               # $= is 60, chop the 0, returns 6
A==A                     # returns 1 (because 0==0)
2**3                     # returns 8
$|                       # auto flush, returns 0
++$^F                    # max system filehandle pre-incremented, returns 3
75/5/5                   # returns 3
pi*pi%\_                 # pi² mod a large value, returns 9
4+4                      # returns 8
a^Y                      # bitwise 'a' xor 'Y', returns 8
w&'?'                    # bitwise 'w' and '?', returns 7
~"\xcb"                  # bitwise inversion of char 203, returns 4
$^=~y/_//c               # count non-underscores in $^, returns 9

ord"\b"                  # returns 8
unpack(h,"\t")           # unpack "\t" as a hex nibble, returns 9
@{[c,c,c,c]}             # anonymous array, returns 4 in scalar context
$#{[b..j]}               # final index of the range b..j, returns 8
"$^W"|'$'                # bitwise '0' or '$', returns 4
$^H>>log$^H              # $^H is 256, log$^H is ~5, returns 8
cos()- -cos              # cos(undef) is 1, subtract -1, returns 2
$[                       # array start index, returns 0

$-=sqrt%SIG              # set $- to sqrt(23), returns 4
$%=$]                    # set $% to the version number, returns 5
$+[*$=~/($)/]            # match end on *$ (aka *main::$), returns 8
split('',$~)             # split "STDOUT" into chars, returns 6 in scalar context
map(glob,"{,,,}{,}")     # an array of 8 empty strings, returns 8 in scalar context
index(\L,L)              # finds 'L' in 'SCALAR(...)', returns 3

exp(exp)<<exp            # 2.718281828 << 1, returns 4
ceil(sinh acosh$^C)      # ceil(2.30129...), returns 3
keys{stat$0}             # stat$0 is an array with 13 entries, which has 6 keys when
                         # interpreted as a hash, returns 6 in scalar context
rindex(\R,R)             # finds 'R' in 'SCALAR(...)' in reverse, returns 5
($s=ssssss)=~s/s//g      # replace the every 's' in 'ssssss' with nothing, returns 6

$?=acos(--$z)            # set $? to 3.14159... implicit int conversion, returns 3
$^T=pack(u,$^T.$^T.TTTT) # set $^T to "8,30P,...", returns 8
B~~B                     # returns 1 (because B represents the same thing as B)
C<=C                     # returns 1 (because 0<=0)
length$^V                # string length of $^V, returns 7
primo
sumber
8

Python 2.7, 19 angka, 231 karakter yang relevan

from math import ceil, pi, trunc, gamma, sin

print ''.join(map(str,
[33-32,
chr(46),
~-7,
8>>3,
trunc(gamma(4.3)),
'x'.find('x'),
22/7,
range(4).pop(),
len('am I phi?'),
52%44,
2*4,
5|2,
ord('/'),
'\b',
5+2+2,
2<<2,
eval("5+2+2"),
ceil(pi),
'\b',
'\b',
str(sin(5))[5],
5&52]))
salah
sumber
Jawaban ini diposting sebelum celah ruang mundur ditutup. Karena ini adalah trik yang cukup pintar dan tidak berbahaya untuk tantangan dalam kasus ini (dan karena ini adalah jawaban yang benar-benar menunjukkan saya ke celah), jawaban ini mungkin tetap apa adanya - jadi tolong jangan downvote berdasarkan itu, lebih memilih untuk kepintaran. :)
Martin Ender
6

Ruby 2.1 untuk 54 digit, 808 karakter

#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
print 2/2,?.,9-3,3&5,2*4,2^2,7%4,55>>4,5+4,2<<2,-~7,5|2,2**2,(2r+2+5).to_i,(2.2+5).ceil,(55r/5-2).floor,(2.2*2).to_i,(2r*2*2).ceil,(2.2**2).floor,2.to_bn<<2,__LINE__,$<.to_i,IO::LOCK_NB,Errno::EIO::Errno,File::APPEND,'aaaaaa'.size,?a.encoding.name.sub(/\D+/,''),%w[a a a].size,%w[a b c d].to_set.size,%w[a a a].count,Socket::AF_NS,Date.jd(Date::ITALY).wday,*Digest::MD5.digest(?j).scan(/\d/),Set[?a,?b,?c].count,SignalException.new('FPE').signo,Float::ROUNDS,begin
exit false
rescue Object
$!.status
end,Process::RLIMIT_NPROC,:aaaaaaa.size,Prime.first,?/.next,{a:p,b:p,c:p}.size,STDIN.lineno,?a.crypt('at')[/\d/],{a: :a}.find_index([:a,:a]),/b/=~'aaaaaaaaab',[?a,?b].index(?b),:aaaaaaab=~/b/,?\t.ord,'aaaaaaaab'=~/b/,open(?/).pos,'aaaaab'.index(?b),?\a.bytes{|b|break b},'aaaaaaa'.rindex(?a),%w[a a].map.size

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:

  1. Tanda kurung, titik dan rangkap dua bukan operator. Tanda kurung hanya mengubah urutan operasi. Titik memanggil metode, seperti dalam $<.fileno, dan titik dua mendapat konstanta, seperti pada IO::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.
  2. Metode dengan implementasi yang berbeda adalah metode yang berbeda. Sebagai contoh, Array#countdan Enumerable#countbukan fungsi yang sama untuk pembatasan 6. Kedua metode bertindak sama, tetapi Array#countditimpa Enumerable#countdengan implementasi yang berbeda. Jika saya gunakan Array#countuntuk menghasilkan satu digit, saya dapat menggunakan Enumerable#countuntuk menghasilkan digit lain.
  3. Kelas # baru adalah satu metode. Di Ruby, Mutex.new, Random.new, Time.newdan sebagainya mengacu pada metode yang sama, Class#new. Saya gunakan SignalException.newuntuk menghasilkan satu digit. Karena batasan 6, saya mungkin tidak akan pernah menggunakannya lagi Class#new.
  4. Konstanta untuk kelas atau modul masih tetap. Di Ruby, nama kelas seperti Floatdan IOadalah konstanta! Saya gunakan IO::LOCK_NBuntuk menghasilkan satu digit. Karena batasan 6, saya mungkin tidak akan pernah menggunakannya lagi IO. Interpretasi ini hanya mengikat Ruby, dan bukan bahasa lain di mana nama paket bukan konstanta.
  5. Literal bukan konstanta. Meskipun 2 adalah konstanta matematika (tidak tergantung pada variabel apa pun), ini bukan konstanta di Ruby. Saya tidak menerapkan batasan 6 untuk literal, dan saya dapat menggunakan kembali literal 2 untuk lebih dari satu digit.
  6. Literal bukan operator. Saya tidak menerapkan batasan 6 pada tanda kurung atau kutipan yang membentuk array literal, hash, ekspresi reguler, atau string, seperti pada [] {} // ''. Saya mungkin selalu menggunakan literal seperti itu untuk menghasilkan lebih banyak digit.
  7. Dua konstanta dengan nilai yang sama adalah konstanta yang sama. File::APPENDdan IPSocket::LOCK_UNdua nama untuk nomor yang sama 8. Pembatasan 6 mengatakan, "tidak masalah dengan nama mana Anda merujuk ke built-in." Karena File::APPENDdan IPSocket::LOCK_UNhanya berbeda nama, mereka harus konstan yang sama, jadi saya tidak boleh menggunakannya untuk dua digit.
  8. Dua digit mungkin tidak merujuk ke variabel global yang sama. Ini menutup celah. Batasan 6 hanya berlaku untuk fungsi, operator, dan konstanta. Batasan 4 hanya berlaku untuk literal. $SAFEadalah variabel global bawaan, bukan fungsi, operator, konstan, atau literal. $SAFEmemiliki nilai 0. Dengan celah itu, saya dapat menggunakan kembali $SAFEuntuk 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 oleh require 'date', require 'digest'dan seterusnya. Saya tidak menghitung 56 karakter ini, karena pembatasan 3 membebaskan "impor perpustakaan standar / termasuk".

Sisa program memanggil printdengan daftar panjang argumen, untuk mengubahnya menjadi string dan mencetaknya secara berurutan. Argumennya adalah ini:

  1. 1from 2/2: division Fixnum # /
    . from ?.: string karakter tunggal literal
  2. 6dari 9-3: pengurangan Fixnum # -
  3. 1dari 3&5: bitwise dan Fixnum # &
    • Dengan interpretasi 5, saya dapat menggunakan 3lagi.
  4. 8dari 2*4: multiplikasi Fixnum # *
  5. 0dari 2^2: bitwise eksklusif-atau Fixnum # ^
  6. 3dari 7%4: modulus Fixnum #%
  7. 3dari 55>>4: shift kanan Fixnum # >>
  8. 9dari 5+4: tambahan Fixnum # +
  9. 8dari 2<<2: shift kiri Fixnum # <<
  10. 8dari -~7: negasi komplemen Fixnum # - @ Fixnum # ~
    • Subtraction Fixnum # - dan negation Fixnum # - @ adalah metode yang berbeda.
  11. 7dari 5|2: bitwise atau Fixnum # |
  12. 4dari 2**2: exponentiation Fixnum # **
  13. 9dari (2r+2+5).to_i: tambahan rasional Rasional # + Rasional # to_i
    • Dengan interpretasi 2, Fixnum # + dan Rasional # + adalah metode yang berbeda. Mereka berdua menambahkan angka, tetapi mereka memiliki implementasi yang berbeda, mulai dari tipe yang berbeda untuk angka kiri.
    • Literal rasional seperti 2rbaru di Ruby 2.1. 2r+2memanggil Rasional # + dan mengembalikan rasional lainnya; 2r+2+5memanggil Rasional # + lagi.
    • Ruby mencetak rationals like 2/1dan float like 2.0. Untuk memperbaiki ini, saya mengkonversi ke integer: to_i putaran menuju nol, ceil putaran atas, lantai putaran bawah.
  14. 8dari (2.2+5).ceil: float Selain Float # + Float # ceil
    • Dengan interpretasi 1, saya dapat menggunakan tanda kurung ()dan dot .lagi.
  15. 9dari (55r/5-2).floor: pembagian rasional dan pengurangan Rasional # / Rasional # - Rasional # lantai
  16. 4from (2.2*2).to_i: float multiplication Float # * Float # to_i
  17. 8dari (2r*2*2).ceil: perkalian rasional Rasional # * Rasional # ceil
  18. 4dari (2.2**2).floor: eksponensial rasional Rasional # **
  19. 8from 2.to_bn<<2: shift kiri dengan OpenSSL angka besar Fixnum # to_bn OpenSSL :: BN # <<
  20. 2dari __LINE__: konstanta ajaib untuk nomor baris saat ini
  21. 0from $<.to_i: file deskriptor dari input standar IO # to_i
  22. 4from IO::LOCK_NB: flag untuk kunci file yang tidak menghalangi
    • Ini adalah konstanta pertama dari banyak yang bergantung pada sistem. OpenBSD memiliki 4.
    • Dengan interpretasi 4, saya mungkin tidak lagi menggunakan IO. Dengan interpretasi 7, saya tidak boleh lagi menggunakan konstanta dengan nilai 4.
  23. 5from Errno::EIO::Errno: number untuk kesalahan input / output
  24. 8dari File::APPEND: panji untuk ditambahkan ke file
    • Ini adalah celah di sekitar penafsiran 4. Saya mungkin tidak menggunakan IO, tetapi Filemewarisi konstanta IO, jadi File::APPENDcara yang berbeda untuk mendapatkannya IO::APPEND.
  25. 6dari 'aaaaaa'.size: panjang string Ukuran string #
  26. 8from ?a.encoding.name.sub(/\D+/,''): bagian dari nama encoding String # encoding Encoding # name String # sub
    • Dengan interpretasi 6, saya dapat menggunakan string quotes lagi.
    • Sejak Ruby 2.0, penyandian default adalah UTF-8. Saya mengambil nama "UTF-8" dan mengganti / \ D + / mencocokkan "UTF-" dengan string kosong. Ini menghasilkan "8".
  27. 3from %w[a a a].size: length of array Ukuran # array
  28. 4dari %w[a b c d].to_set.size: jumlah elemen dalam set Array # to_set Setel ukuran #
  29. 3dari %w[a a a].count: hitung semua elemen Array # count
    • Perbedaan antara Array # ukuran dan Array # count adalah bahwa yang terakhir mengambil argumen opsional untuk memilih elemen untuk menghitung. Saya tidak memberikan argumen, jadi ia menghitung semua elemen.
  30. 6dari Socket::AF_NS: nomor untuk keluarga alamat NS
  31. 5dari Date.jd(Date::ITALY).wday: nomor hari kerja untuk Jumat 15 Oktober 1582, ketika Italia beralih ke kalender Gregorian Tanggal :: jd Tanggal # wday
  32. 6from *Digest::MD5.digest(?j).scan(/\d/): digit ASCII pertama dalam binary MD5 digest "j" Digest :: MD5 :: digest String # scan
    • Pemindaian string # mengembalikan array semua kecocokan. The *melewati elemen array sebagai argumen untuk print. Array ini adalah ["6"].
  33. 3dari Set[?a,?b,?c].count: hitung semua elemen Set :: [] Enumerable # count
    • Dengan interpretasi 2, jumlah # array dan jumlah # adalah metode yang berbeda.
  34. 8dari SignalException.new('FPE').signo: jumlah SIGFPE Kelas # baru SignalException # signo
  35. 1from Float::ROUNDS: rounding mode, di sini 1 untuk round-to-terdekat
  36. 1from begin(baris baru) exit false(baris baru) rescue Object(baris baru) $!.status(baris baru) end: status keluar untuk kegagalan
    • Ini adalah nilai yang sama dengan SystemExit.new(false).status, tetapi dengan interpretasi 3, saya mungkin tidak lagi memanggil Kelas # baru . Alih-alih, saya meningkatkan dan menyelamatkan SystemExit.
  37. 7 dari Process::RLIMIT_NPROC : angka untuk batas sumber daya untuk jumlah proses untuk satu pengguna
  38. 7dari :aaaaaaa.size: panjang simbol Ukuran
  39. 2dari Prime.first: bilangan prima pertama Enumerable # first
  40. 0from ?/.next: string berikutnya setelah "?"String # selanjutnya
  41. 3dari {a:p,b:p,c:p}.size: panjang hash Hash # size String # p
  42. 0from STDIN.lineno: nomor baris saat ini untuk input standar IO # lineno
    • Dengan interpretasi 8, saya mungkin tidak menggunakan kembali $<. Saya menggunakan STDIN. Perbedaannya adalah $<variabel global dan STDINkonstanta. Suatu program dapat diatur $<ke input yang berbeda, tetapi STDINselalu merupakan nilai asli dari $<.
  43. 3dari ?a.crypt('at')[/\d/]: digit ASCII pertama dalam kata sandi terenkripsi. String # crypt String # []
    • Sistem dengan fungsi crypt () yang berbeda akan memberikan hasil yang berbeda.
  44. 0from {a: :a}.find_index([:a,:a]): index of first key: a, value: a in hash Enumerable # find_index
    • Saya menggunakan hash, bukan array, karena Array # find_index adalah alias untuk indeks # Array , yang saya rencanakan untuk segera digunakan.
  45. 9dari /b/=~'aaaaaaaaab': indeks di mana string cocok / b / Regexp # = ~
  46. 1dari [?a,?b].index(?b): index "b" pertama dalam array Array # index
  47. 7dari :aaaaaaab=~/b/: indeks di mana simbol cocok / b / Simbol # = ~
  48. 9dari ?\t.ord: Nilai ASCII dari tab "\ t" String # ord
  49. 8dari 'aaaaaaaab'=~/b/: indeks di mana string cocok / b / String # = ~
    • Dengan interpretasi 2, Regexp # = ~ dan String # = ~ adalah metode yang berbeda.
  50. 0from open(?/).pos: position in file setelah membuka direktori root "/" sebagai file Kernel # open IO # pos
  51. 5dari 'aaaaab'.index(?b): indeks "b" pertama dalam string String # index
  52. 7dari ?\a.bytes{|b|break b}: Nilai lansiran ASCII "\ a" String # byte
    • Ini bekerja dengan mengulangi byte di "\ a", tetapi memutus loop dengan mengembalikan byte pertama.
  53. 6dari 'aaaaaaa'.rindex(?a): index "a" terakhir di string String # rindex
  54. 2from %w[a a].map.size: size enumerator yang memetakan dari array Array # map Enumerator # size
kernigh
sumber
Impresif! Lagipula sebagian besar interpretasi Anda sejalan dengan aturan. 1. Saya tidak pernah berniat untuk membatasi operator, dereferencing dan akses, itulah sebabnya saya mengatakan operator "matematis, boolean, bit-wise, dan string". 2. Dicakup oleh aturan 6. 3. Menggunakan kembali baru akan baik-baik saja dalam bahasa lain, karena biasanya operator - tidak dapat digunakan kembali pada kelas yang sama karena memanggil konstruktor (fungsi bawaan). Bagaimana itu di Ruby? Apakah newbenar-benar selalu memanggil imlpementation yang sama atau diganti dalam subclass? [ctd.]
Martin Ender
4. Saya akan baik-baik saja jika Anda membuat pengecualian untuk Ruby, tapi terima kasih atas sportivitas Anda. ;) 5. dan 6. Tidak, itu sebabnya beberapa aturan dinyatakan seperti itu. 7. Itu poin halus yang bagus yang tidak saya pikirkan. Secara teknis, jika mereka tidak merujuk ke 8 yang sama , akan baik untuk menggunakan keduanya. 8. Poin bagus, saya tidak memikirkan variabel bawaan. Saya akan memeriksa apakah itu tidak secara substansial melanggar pengajuan lainnya dan mengubah aturan 6. Terima kasih telah bermain adil! :)
Martin Ender
Saya tidak dapat menemukan pelanggaran aturan dalam jawaban ini jadi saya menerimanya. Namun, saya ingin menghargai jawaban Anda, karena sejauh ini merupakan jawaban terpanjang yang sebenarnya memainkan bagaimana tantangan itu dimaksudkan. Karena itu, saya akan menawarkan hadiah untuk tantangan ini. Karunia itu akan berjalan selama tujuh hari dan jika jawaban datang yang mengalahkan milikmu dengan cara yang "adil", aku akan menghadiahkan hadiah itu. (Tentu saja, Anda bebas untuk mencoba dan mengalahkan pesaing;).) Semoga Anda baik-baik saja dengan itu!
Martin Ender
5

Java, 21 digit, 276 karakter

class C{public static void main(String[]a){System.out.print((3&5)+"."+(2|4)+Byte.BYTES+2*4+"".length()+(7-4)+~-4+(7+2)+(2<<2)+(int)Math.sqrt('@')+(2^5)+(int)Math.pow(2,2)+32%23+Byte.SIZE+('$'>>2)+Float.BYTES+Long.BYTES+Integer.BYTES+Double.BYTES+Short.BYTES+Math.round(.2));}}

class C {
  public static void main(String[] a) {
    System.out.print(
      (3&5)+       // 1
      "."+         // .
      (2|4)+       // 6
      Byte.BYTES+  // 1
      2*4+         // 8
      "".length()+ // 0
      (7-4)+       // 3
      ~-4+         // 3
      (7+2)+       // 9
      (2<<2)+      // 8
      (int)Math.sqrt('@')+  // 8
      (2^5)+       // 7
      (int)Math.pow(2,2)+   // 4
      32%32+       // 9
      Byte.SIZE    // 8

      // rest of explanation to come later today
    );
  }
}
Ypnypn
sumber
Ha, saya suka 7-4& -4+7, itu pintar! :)
Martin Ender
pintar, tapi saya pikir itu melanggar aturan untuk tidak menggunakan kembali konstanta (positif 7 digunakan di keduanya)
salah
1
@rangu 7bukan konstanta tetapi literal
Martin Ender
Jadi mengapa kamu berhenti di situ?
Valentin Grégoire
4

Ruby, 74 karakter, 10 angka

Itu baru permulaan; Saya harus pergi sehingga saya akan memperbaikinya nanti.

$><<[3-2,?.,3+3,?..size,2**3,$*.size,24/8,7%4,[*7..77][2],2*4,7.next].join

Saya memiliki 76 karakter yang disimpan untuk nanti, ketika itu akan semakin sulit!

Gagang pintu
sumber
Ini awal yang bagus! Akhirnya sebuah jawaban dalam semangat pertanyaan. :)
Martin Ender
3

Ruby, 17 digit, 168 byte

$><<[-~0,'.',9-3,3/3,2**3,$.,25%22,'   '=~/$/,2+7,2<<2,"10".oct,2|5,[2,2,2,2].size,[*$....2*5].last,(2^5).succ,'a'.to_i(25).pred,'aaaa'.count('a'),eval(55.chr.next)]*''

Tidak Disatukan:

$><<[
  -~0,                # 1
  '.',                # .
  9-3,                # 6
  3/3,                # 1
  2**3,               # 8
  $.,                 # 0
  25%22,              # 3
  '   '=~/$/,         # 3
  2+7,                # 9
  2<<2,               # 8
  "#{'a'.hex}".oct,   # 8
  2|5,                # 7
  [2,2,2,2].size,     # 4
  [*$....2*5].last,   # 9
  (2^5).succ,         # 8
  'a'.to_i(25).pred,  # 9
  'aaaa'.count('a'),  # 4
  eval(55.chr.next)   # 8
]*''

Belum dipaksa untuk melakukan sesuatu yang sangat pintar, saya mungkin kembali dan menambahkan angka.

histokrat
sumber
1
"Belum dipaksa untuk melakukan sesuatu yang sangat pintar." Ya, saya pikir Ruby, Perl dan para tersangka biasa tidak akan mengalami kesulitan dengan 15 karakter per digit, tetapi saya ingin meninggalkan ruang untuk hal-hal seperti C-derivatif dan Mathematica dengan perpustakaan standar besar tetapi nama yang lebih berbelit-belit.
Martin Ender
"Jika mereka benar-benar hanya alias, tidak [kamu tidak bisa menggunakannya]." succdan nextalias.
Gagang Pintu
1
Yang pertama dipanggil pada Fixnum, yang kedua pada sebuah String, jadi saya tidak berpikir mereka dihitung sebagai metode yang sama.
histokrat
Ah, poin bagus. Namun, pertanyaannya juga mengatakan "Anda tidak boleh merujuk ke ... konstanta yang Anda gunakan dalam kode yang menghasilkan digit sebelumnya," dan Anda menggunakan $.dua kali. Meskipun, harus cinta $....: D
Gagang Pintu
2

Naskah Golf , 17 digit

Upaya mudah. Golfscript mungkin memiliki banyak built-in satu huruf non-alfanumerik, tetapi tidak memiliki banyak built-in secara keseluruhan!

".",                         # 1: string length (separate from array length)
'.'    
3 3+                         # 6: addition
''[49]+                      # 1: string concatenation
-9~                          # 8: bitwise not
2!                           # 0: boolean not
7 4%                         # 3: modulus
4(                           # 3: decrement
7))                          # 9: increment
257 2/2/2/2/2/               # 8: division
4 2*                         # 8: multiplication
22 5- 5- 5-                  # 7: subtraction
2 2?                         # 4: power
[2 5] 2 base                 # 9: base conversion
[2 2 2 2 2 2 2 2],           # 8: array length (separate from str length)
[2 2 2 2 2 2 2 2 2 5]5?      # 9: array.find()
2 2+                         # 4: addition
"2 2*2*"~                    # 8: eval
Claudiu
sumber
2
Saya pikir Anda bisa melanjutkan 5,)\; # range, right uncons, flip, and pop.
Peter Taylor
1

Bash, 5 digit dalam 65 karakter

Saya akan segera memperbarui ini! Untuk saat ini, hanya dicetak 1.6180, dan tidak mengandung angka apa pun.

false
tr -d ' '<<<$?.`wc -c<<<abcde``nl<<<' '``kill -l FPE`$(())

Penjelasan

Metode berikut digunakan untuk menghasilkan digit:

1: keluar dari status false

6: panjang string

1: nl penyalahgunaan

8: kill nomor sinyal

0: nilai numerik dari ekspresi kosong


sumber
1

Mathematica 9 8 digit, dalam 86 83 78 karakter.

10`8FromDigits@#/10^Length@#&@{a/a,3!,-I I,2π/(45°),#&''[],Prime@2,Sqrt@9,4+5}

Keluaran:

1.6180339
Menghitung
sumber
Ah, saya tahu saya melakukan kesalahan di suatu tempat. Notasi awal sepertinya tidak berfungsi dalam kasus ini. Menggunakan unicode Pi dan Degree, tampaknya masih berfungsi.
Tally
Ya, # & '' [] akan menghasilkan kesalahan dari input yang tidak ada, sedangkan dalam formulir ini mengabaikan bahwa tidak mendapat input. Tetap tidak memaafkan saya untuk tidak menggunakannya di tempat kerjanya.
Tally
1
Terima kasih. Saya pribadi menyukai # & '' [] (Pada dasarnya turunan kedua dari f [x] = x
Tally
(Dibersihkan komentar.) Itu adalah cukup bagus, tapi Anda mungkin bisa menyimpan karakter, dengan mengganti #dengan digit diperbolehkan, dan menjatuhkan salah satu strip.
Martin Ender
Berpikir seperti ini saya akan dapat menyimpan angka itu untuk potensi penggunaan di masa depan.
Tally
1

Julia - 23 digit dalam 345 karakter (tepatnya 15 per digit)

print(div(2,2),'.','/'+7,length(" "),2^3,size([])[end],isqrt(9),int(cbrt(27)),54-45,'h'$'P',[2:22][7],endof("2222222"),count(isodd,[5,5,5,5]),search("Hello man",'n'),nextpow2(5),rsearch("Love boat",'t'),sizeof('й'),("I"summary(b"H"))[22],iceil(float(pi)),iround(cosh(e)),ifloor(exp(catalan)),cmp(5,5),itrunc(5sin(one(Int))),uint(erfcx(-ones())))

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):

1> div(2,2)
.> '.'
6> '/'+7
1> length(" ")
8> 2^3
0> size([])[end]
3> isqrt(9)
3> int(cbrt(27))
9> 54-45
8> 'h'$'P'
8> [2:22][7]
7> endof("2222222")
4> count(isodd,[5,5,5,5])
9> search("Hello man",'n')
8> nextpow2(5)
9> rsearch("Love boat",'t')
4> sizeof('й')
8> ("I"summary(b"H"))[22]
4> iceil(float(pi))
8> iround(cosh(e))
2> ifloor(exp(catalan))
0> cmp(5,5)
4> itrunc(5sin(one(Int)))
5> uint(erfcx(-ones()))
Glen O
sumber
0

C ++ 12,4 karakter per baris, adalah 14 karakter per baris untuk setiap digit

Memperbaiki kesalahan saya menggunakan kembali operator.

#include <iostream>
#include <math.h>
#define S std::string
#define C(x) std::cout<<x
int main()
{
C(cos(0));
C(char(46));
C('j'%'d');
C('\0'+3-2);
C(sqrt('@'));
C(log(1));
C('c'/'!');
S s("xyz");
C(s.size());
return 0;
}

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.

#include <iostream>
#define C(x) std::cout<<x
int main()
{
C('b'-'a');//1
C(char(46));//.
C('g'-'a');//6
C('b'-'a');//1
C('i'-'a');//8
C('a'-'a');//0
C('d'-'a');//3
C('d'-'a');//3
C('j'-'a');//9
//etc
return 0;
}
bacchusbeale
sumber
Literalnya baik-baik saja (karena tidak setara dengan angka satu digit), tetapi Anda tetap menggunakan kembali -operator. Juga, saya suka bagaimana Anda menghitung komentar untuk panjang garis. : D
Martin Ender
Ya itu terlihat jauh lebih baik, tetapi Anda menggunakan 1untuk menghasilkan 0(yang tidak diizinkan, karena 1muncul sebelumnya dalam rasio emas). Anda juga perlu menghitung #define S(bukan yang lain), karena ini bukan termasuk tetapi hanya mendefinisikan alias steno.
Martin Ender