Bilangan bulat positif n dapat direpresentasikan sebagai persegi panjang dengan sisi bilangan bulat a , b sedemikian rupa sehingga n = a * b . Artinya, area mewakili angka. Secara umum, a dan b tidak unik untuk yang diberikan n .
Seperti diketahui, persegi panjang secara khusus menyenangkan mata (atau apakah itu otak?) Ketika sisinya berada dalam rasio emas , φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
Menggabungkan dua fakta ini, tujuan dari tantangan ini adalah untuk menguraikan bilangan bulat n menjadi produk dari dua bilangan bulat a , b yang rasionya sedekat mungkin dengan φ (dengan metrik biasa pada ℝ). Fakta bahwa φ tidak rasional menyiratkan bahwa ada pasangan solusi yang unik ( a , b ).
Tantangan
Dengan bilangan bulat positif n , bilangan bulat keluaran positif a , b sehingga a * b = n dan perbedaan absolut antara a / b dan φ diminimalkan.
Sebagai contoh, perhatikan n = 12. Pasangan ( a , b ) yang memenuhi a * b = n adalah: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). Pasangan yang rasionya paling dekat dengan φ adalah (4,3), yang memberikan 4/3 = 1,333.
Aturan
Fungsi atau program dapat diterima.
The pembilang ( a ) harus muncul pertama pada output, dan penyebut ( b ) kedua . Selain itu, format input dan output fleksibel seperti biasa. Sebagai contoh, dua angka bisa berupa string dengan pemisah yang masuk akal, atau sebagai array.
Kode harus bekerja secara teori untuk jumlah besar yang sewenang-wenang. Dalam praktiknya, ini mungkin dibatasi oleh memori atau batasan tipe data.
Cukup untuk mempertimbangkan versi perkiraan φ , asalkan akurat hingga desimal ketiga atau lebih baik. Artinya, perbedaan absolut antara φ benar dan nilai perkiraan tidak boleh melebihi 0,0005. Misalnya, 1.618 dapat diterima.
Saat menggunakan perkiraan, versi rasional φ ada kemungkinan kecil bahwa solusinya tidak unik. Dalam hal ini Anda dapat menampilkan pasangan apa pun a , b yang memenuhi kriteria minimalisasi.
Kode terpendek menang.
Uji kasus
1 -> 1 1
2 -> 2 1
4 -> 2 2
12 -> 4 3
42 -> 7 6
576 -> 32 18
1234 -> 2 617
10000 -> 125 80
199999 -> 1 199999
9699690 -> 3990 2431
sumber
|a/b-b/a-1|
itu menjanjikan, meskipun ada bukti yang mendukunga/b
. Menghapus unit persegi meninggalkan persegi panjang kecil di sebelah kanan yang mewakilib/a
. Oleh karena itu, persegi panjang emas menghasilkan perbedaan 1.Jawaban:
Jelly,
161514 byteDisimpan 1 byte berkat @miles.
Cobalah online!
Penjelasan
sumber
÷/ạØp¶ÆDżṚ$ÇÞḢ
untuk 14 byte, ia mengembalikan daftar yang[a, b]
diberikann
sebagai argumen./
. (Ini yang saya lakukan dalam solusi Pyth saya.) Akan mengedit ketika saya mendapatkan di laptop saya.Pyth -
2423 byteHarus ada cara yang lebih baik untuk menemukan pembagi ...
Test Suite .
sumber
hoa.n3cFNm,d/Qdm*Fdty+1P
. TesMatlab,
9681 byteGolf (-15bytes), alat peraga untuk Luis Mendo
Asli:
Sejauh ini ini bukan solusi yang bagus, tetapi upaya pertama saya di kode-golf. Apanya yang seru!
sumber
not
dengan~
untuk menyimpan beberapa byte. Juga, dengan menggunakan output keduamin
Anda dapat menyingkirkanfind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
daripadafunction w(n);
kemudian Anda memiliki pasangan ekstra di()
sekitarmod
.05AB1E , 21 byte
Kode:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
Mathematica, 51 byte
Ini
adalah operator postfix Mathematica untuk transposisi (ditampilkan sebagai superscriptT
dalam Mathematica).Mathematica memiliki built-in
GoldenRatio
, tetapi 1.618 jauh lebih pendek, terutama karena yang pertama juga membutuhkanN@
.sumber
Pyth,
212018 byteCobalah online. Suite uji.
Penjelasan
S
rentang inklusif dari 1 hingga input.f
ilter untuk angka untuk membagi input!%QT
.[that list, that list reversed]
_B
. Pembagi nomor yang dibalik adalah daftar yang sama dengan nomor yang dibagi oleh masing-masing pembagi.[numerator, denominator]
.o
rt pasangan dengana
perbedaan bsolute dari rasio dari pasangancFN
dan rasio emas.n3
.h
cetak ) pertama dan cetak.sumber
Javascript (ES6), 73 byte
Kami mencari:
Kemudian, solusinya adalah [a, n / a] atau [b, n / b] . Kami membandingkan n / φ - a² dengan b² - n / φ untuk mengetahui ekspresi mana yang paling dekat dengan nol.
Rumus yang sebenarnya digunakan dalam kode didasarkan pada φ / 2 yang dapat ditulis dengan cara lebih pendek dari φ dengan presisi yang sama:
.809
vs1.618
.Karena itu:
dan:
Kompleksitas
Jumlah iterasi sangat tergantung pada jumlah faktor n. Kasus terburuk terjadi ketika n adalah prima, karena kita harus melakukan semua iterasi dari 1 ke n untuk menemukan hanya 2 pembagi. Inilah yang terjadi dengan 199999. Di sisi lain, 9699690 adalah 19-halus dan kami dengan cepat menemukan dua pembagi di kedua sisi titik pemecah √ (n / φ) ≈ 2448.
Uji kasus
sumber
JavaScript (ES6), 83 byte
Sebenarnya mengembalikan pasangan ( a , b ) yang meminimalkan nilai absolut dari a / b - b / a -1, tetapi ini bekerja untuk semua kasus uji setidaknya, meskipun saya kira saya bisa menghemat 4 byte dengan menggunakan tes 1,618 sebagai gantinya .
sumber
Brachylog , 41 byte
Cobalah online!
Penjelasan
Predikat utama:
Predikat 1: Output adalah pasangan
[A:B]
sedemikian rupaA*B = Input
Predikat 2: Hitung jarak antara
A/B
dan φ.Predikat 3: Konversi int menjadi float dengan membalikkan kebalikannya
sumber
φ
literal yang sudah ditentukan sebelumnya ada di Brachylog? Atau di mana itu didefinisikan dalam kode?$A
A
untukAu
;)Haskell (Lambdabot), 86 byte
sumber
php, 103 byte
Menghasilkan pemberitahuan (ini tidak mengganggu eksekusi) tentang $ i yang belum ditetapkan sehingga harus dijalankan di lingkungan yang membungkam pemberitahuan.
sumber
php -r '…'
(di mana-r
gratis). Dan jelas tidak perlu untuk bentuk panjang, sepertishort_open_tag
yang diaktifkan secara default.-r
dan$argv
bekerja sama dengan baik: pastebin.com/vcgb5pT2<?php
dengan<?
untuk menyimpan tiga byte.Python 3, 96 byte
Solusi yang cukup sederhana. Manfaatkan jawaban SO ini .
Cobalah online
Solusi yang sama di Python 2 adalah satu byte lebih lama.
sumber