Hitung angka terendah di mana jumlah urutan angka melebihi nilai yang diberikan


14

Mengingat Anda memiliki urutan angka tak terbatas yang didefinisikan sebagai berikut:

1: 1 = 1
2: 1 + 2 = 3
3: 1 + 3 = 4
4: 1 + 2 + 4 = 7
5: 1 + 5 = 6
6: 1 + 2 + 3 + 6 = 12
7: 1 + 7 = 8
...

Urutannya adalah jumlah dari pembagi n, termasuk 1 dan n.

Diberikan bilangan bulat positif xsebagai input, hitung angka terendah nyang akan menghasilkan hasil lebih besar dari x.

Uji kasus

f(100) = 48, ∑ = 124
f(25000) = 7200, ∑ = 25389
f(5000000) = 1164240, ∑ = 5088960

Output yang Diharapkan

Program Anda harus mengembalikan keduanya n dan jumlah pembagi nya, seperti:

$ ./challenge 100
48,124

Aturan

Ini adalah kode-golf sehingga kode terpendek dalam byte, dalam setiap bahasa menang.


4
Apakah urutan itu hanya jumlah npembagi? Anda mungkin ingin menyatakannya secara eksplisit.
Martin Ender

3
Juga, menilai dari "hasil yang diharapkan" Anda menginginkan keduanya n dan f(n) , tetapi Anda tidak mengatakannya di mana pun dalam spesifikasi.
Martin Ender

2
Bonus buruk , terutama ketika tidak jelas. Saya memutuskan untuk menghapusnya, untuk melindungi ini dari downvoted.
Tn. Xcoder

2
Bisakah Anda periksa kembali f(1000) = 48? Jumlah pembagi 48adalah124
caird coinheringaahing

3
Sebaiknya tunggu setidaknya satu minggu sebelum menerima jawaban, jika tidak, Anda mungkin akan mencegah solusi baru.
Zgarb

Jawaban:


8

Brachylog , 9 byte

∧;S?hf+S>

Program ini mengambil input dari "variabel output" ., dan output ke "variabel input" ?. Cobalah online!

Penjelasan

∧;S?hf+S>
∧;S        There is a pair [N,S]
   ?       which equals the output
    h      such that its first element's
     f     factors'
      +    sum
       S   equals S,
        >  and is greater than the input.

Variabel implisit Ndisebutkan dalam urutan meningkat, sehingga nilai hukum terendah digunakan untuk output.


10

Jelly , 18 12 11 10 byte

1Æs>¥#ḢṄÆs

Cobalah online!

-1 byte terima kasih kepada Tn. Xcoder !

Bagaimana itu bekerja

1Æs>¥#ḢṄÆs - Main link. Argument: n (integer)
1   ¥#     - Find the first n integers where...
 Æs        -   the divisor sum
   >       -   is greater than the input
       Ṅ   - Print...
      Ḣ    -   the first element
        Æs - then print the divisor sum

Bisakah Anda menjelaskan mengapa 1itu perlu dan bagaimana ¥tindakannya?
dylnan

1
@dylnan The 1memberitahu #untuk mulai menghitung dari 1 dan ¥mengambil dua tautan sebelumnya ( Æsdan >) dan menerapkannya sebagai angka dua (yaitu dengan dua argumen), dengan argumen kiri menjadi iterasi, dan argumen kanan menjadi input.
caird coinheringaahing

Oh, itu masuk akal sekarang. #sebelumnya agak membingungkan saya dalam beberapa kasus.
dylnan

4

Bahasa Wolfram (Mathematica) , 53 byte

{#,f@#}&@@Select[Range[x=#]+1,(f=Tr@*Divisors)@#>x&]&

Cobalah online!

Mencoba semua nilai antara 2 dan x +1, di mana x adalah input.

( SelectMengembalikan daftar semua nilai yang bekerja, tetapi fungsi {#,f@#}&mengambil semua ini sebagai input, dan kemudian mengabaikan semua inputnya tetapi yang pertama.)



4

Sekam , 12 11 byte

§eVḟ>⁰moΣḊN

-1 byte, terima kasih kepada @Zgarb!

Cobalah online!


Pintar! Aneh meskipun bagaimana ,tidak bekerja (atau kesimpulan terlalu lama?).
ბიმო

Itu menyimpulkan suatu tipe, tetapi menampilkan daftar yang tak terbatas. Mungkin disebabkan oleh overloading takes yang mengambil integer sebagai argumen kedua, tapi itu hanya dugaan.
Zgarb


4

Japt , 15 byte

[@<(V=Xâ x}a V]

Cobalah


Penjelasan

Input bilangan bulat implisit U. []adalah pembungkus array kami. Untuk elemen pertama, @ }aadalah fungsi yang berjalan terus menerus hingga mengembalikan nilai yang sebenarnya, memberikan dirinya bilangan bulat yang bertambah (mulai dari 0) setiap kali, dan menghasilkan nilai akhir dari bilangan bulat itu. âmendapatkan pembagi dari integer saat ini ( X), xmenjumlahkannya dan hasilnya ditugaskan ke variabel V. <memeriksa apakah Ukurang dari V. Elemen kedua dalam array adalah adil V.


4

Clojure , 127 byte

(defn f[n](reduce +(filter #(zero?(rem n %))(range 1(inc n)))))
(defn e[n](loop[i 1 n n](if(>(f i)n){i,(f i)}(recur(inc i)n))))

Cobalah online!

terima kasih kepada @steadybox untuk -4 byte!


1
Selamat datang di situs ini!
caird coinheringaahing

Beberapa spasi putih dapat dihapus untuk menghemat beberapa byte. Cobalah online!
Steadybox

Dalam hal ini reducedapat diganti dengan apply, juga fungsi edapat dinyatakan sebagai fungsi anonim melalui #(...)sintaks, Anda tidak perlu menyebutkannya di Code Golf. #(=(rem n %)0)lebih pendek dari #(zero?(rem n %)). Dan ingat itu ,adalah spasi putih, dan dapat dihapus dalam kasus ini seperti yang diikuti oleh (, sehingga akan diuraikan dengan benar.
NikoNyrh

@NikoNyrh senang bertemu dengan sesama clojurist, saya akan segera mengedit posting ini
Alonoaky

3

Ruby , 58 byte

Program penuh karena saya tidak yakin apakah lambda diizinkan. /mengangkat bahu

gets
$.+=1until$_.to_i.<v=(1..$.).sum{|n|$.%n<1?n:0}
p$.,v

Cobalah online!

Penjelasan

gets     # read line ($_ is used instead of v= because it cuts a space)
$.+=1    # $. is "lines read" variable which starts at 1 because we read 1 line
    until     # repeat as long as the next part is not true
$_.to_i  # input, as numeric
  .<v=   # is <, but invoked as function to lower operator prescedence
  (1..$.)        # Range of 1 to n
  .sum{|n|       # .sum maps values into new ones and adds them together
     $.%n<1?n:0  # Factor -> add to sum, non-factor -> 0
  }
p$.,v    # output n and sum

3
Lambdas tentu saja diizinkan.
Giuseppe

3

JavaScript (ES6), 61 58 byte

f=(n,i=1,s=j=0)=>j++<i?f(n,i,i%j?s:s+j):s>n?[i,s]:f(n,++i)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Sunting: Disimpan 3 byte berkat @Arnauld.


Saya mendapatkan "Kesalahan skrip." saat memasukkan nilai lebih dari 545
StudleyJr

Coba gunakan Safari; ternyata itu mendukung Tail Call Optimization. (Atau jika Anda dapat menemukannya, beberapa versi Chrome mengaktifkannya melalui "Fitur JavaScript Eksperimental".)
Neil



2

SOGL V0.12 , 14 byte

1[:Λ∑:A.>?ao←I

Coba Di Sini!

Penjelasan:

1               push 1
 [              while ToS != 0
  :Λ              get the divisors
    ∑             sum
     :A           save on variable A without popping
       .>?  ←     if greater than the input
          ao        output the variable A
            ←       and stop the program, implicitly outputting ToS - the counter
             I    increment the counter


2

MATL , 12 byte

`@Z\sG>~}@6M

Cobalah online!

Penjelasan

`      % Do...while
  @    %   Push iteration index (1-based)
  Z\   %   Array of divisors
  s    %   Sum of array
  G    %   Push input
  >~   %   Greater than; logical negate. This is the loop condition
}      % Finally (execute on loop exit)
  @    %   Push latest iteration index
  6M   %   Push latest sum of divisors again
       % End (implicit). Run new iteration if top of the stack is true
       % Display stack (implicit)




2

Factor , 88

USE: math.primes.factors [ 0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ]

Pencarian dengan kekerasan. Ini kutipan (lambda), calldengan xdi tumpukan, daun ndanf(n) di tumpukan.

Sebagai sebuah kata:

: f(n)>x ( x -- n f(n) )
  0 0 [ drop 1 + dup divisors sum pick over > ] loop rot drop ;

2

Python 3, 163 byte

def f(x):
    def d(x):return[i for i in range(1,x+1) if x%i==0]
    return min(i for i in range(x) if sum(d(i)) >x),sum(d(min(i for i in range(x) if sum(d(i)) >x)))

3
Halo dan selamat datang di PPCG; posting pertama yang bagus! Dari aspek golf, Anda bisa menghemat beberapa byte dengan menghapus spasi, menggunakan fungsi lambda, menciutkan semuanya menjadi satu baris dan tidak mengulangi diri Anda sendiri. Kami juga biasanya menautkan ke lingkungan pengujian online, seperti misalnya TIO ( 105 byte , menggunakan teknik yang dijelaskan di atas.)
Jonathan Frech

@JonathanFrech: Komentar luar biasa. Terima kasih atas kesabaran Anda dengan noobies secara umum dan noobkhususnya;)
Eric Duminil

2

Python 3 , 100 byte

d=lambda y:sum(i+1for i in range(y)if y%-~i<1)
f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))

Cobalah online!

Terima kasih kepada Jonathan Frech komentar pada upaya python 3 sebelumnya, saya baru saja memperluas pengetahuan saya tentang sintaksis python. Saya tidak pernah memikirkan trik ~ ~ untuk i + 1, yang menyimpan dua karakter.

Namun, jawaban itu adalah 1) tidak minimal dan 2) tidak bekerja untuk x = 1 (karena kesalahan satu per satu yang mudah dibuat saat pergi untuk singkatnya, saya sarankan semua orang memeriksa jawaban mereka untuk tepi ini kasus!).

Penjelasan cepat: sum(i+1for i in range(y)if y%-~i<1)setara dengan sum(i for i in range(1,y+1)if y%i<1)tetapi menyimpan dua karakter. Sekali lagi terima kasih kepada Tn. Frech.

d=lambda y:sum(i+1for i in range(y)if y%-~i<1) Oleh karena itu mengembalikan pembagi y.

f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))adalah tempat saya benar-benar bekerja. Karena membandingkan tuple berfungsi dalam urutan kamus, kita dapat membandingkan j, d (j) semudah kita membandingkan j, dan ini memungkinkan kita tidak harus menemukan j minimal, menyimpannya dalam variabel, dan / kemudian / menghitung tuple dalam operasi terpisah. Juga, kita harus memiliki <=, bukan <, dalam x<=d(j), karena d (1) adalah 1 jadi jika x adalah 1 Anda tidak mendapatkan apa-apa. Ini juga mengapa kita perlu range(x+1)dan tidakrange(x) .

Sebelumnya saya harus mengembalikan tuple, tetapi kemudian saya harus menyalinnya dalam f, sehingga dibutuhkan tiga karakter lagi.


1
Selamat datang di situs dan posting pertama yang bagus. Anda dapat mencapai 98 byte dengan menghapus f=fungsi anonim yang dapat diterima di sini!
caird coinheringaahing

Anda tidak dapat memanggil fungsi anonim dari baris kode lain, masalahnya - Saya punya pernyataan cetak (f (100)) yang terpisah untuk menguji apakah fungsi itu berfungsi.
Michael Boger

Itu bukan masalah di sini. Ini benar - benar dapat diterima dan berfungsi untuk tidak memasukkan f=dalam jumlah byte Anda, dan merupakan cara yang baik untuk bermain golf di Python. Lihat ini untuk tips golf lainnya dengan Python!
caird coinheringaahing

Hm Saya dapat menyamai, tetapi tidak lebih baik, kiriman saya dengan menambahkan q=rangedan mengganti rangedengan qdalam kedua contoh yang ada. Sayangnya, ini tidak memperbaikinya dan karena lambda adalah kata kunci yang tidak dapat saya gunakan untuk itu, saya harus melakukan trik exec () yang membuang terlalu banyak karakter.
Michael Boger

@MichaelBoger Baiklah, Anda dapat memanggil fungsi anonim dengan Python; ekspresi lambda tidak harus ditugaskan ke variabel.
Jonathan Frech

2

Python 2 , 81 byte

def f(n):
 a=b=0
 while b<n:
	a+=1;i=b=0
	while i<a:i+=1;b+=i*(a%i<1)
 return a,b

Cobalah online!



Mengganti tab dengan dua spasi membuat ini berfungsi dalam python 3 pada 83 byte, meskipun untuk mencobanya saya harus meletakkan tanda kurung dalam pernyataan cetak. Anda juga dapat mengganti pernyataan kembali dengan pernyataan cetak dan tidak memerlukan fungsi bantu untuk mencetaknya; byte tetap sama.
Michael Boger



0

Clojure, 102 byte

#(loop[i 1](let[s(apply +(for[j(range 1(inc i)):when(=(mod i j)0)]j))](if(> s %)[i s](recur(inc i)))))

0

PHP, 69 byte

for(;$argv[1]>=$t;)for($t=$j=++$i;--$j;)$t+=$i%$j?0:$j;echo$i,',',$t;

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.