Twist Divisor Twist


13

Definisi

Biarkan mdan nmenjadi bilangan bulat positif. Kami mengatakan bahwa madalah twist yang pembagi dari njika ada bilangan bulat 1 < a ≤ bsehingga n = a*bdan m = (a - 1)*(b + 1) + 1. Jika mdapat diperoleh dari ndengan menerapkan nol atau lebih tikungan pembagi untuk itu, maka madalah keturunan dari n. Perhatikan bahwa setiap angka adalah turunannya sendiri.

Sebagai contoh, pertimbangkan n = 16. Kita dapat memilih a = 2dan b = 8sejak itu 2*8 = 16. Kemudian

(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10

yang menunjukkan bahwa itu 10adalah twist pembagi 16. Dengan a = 2dan b = 5, kita kemudian melihat bahwa itu 7adalah twist pembagi 10. Jadi itu 7adalah keturunan 16.

Tugas

Diberikan bilangan bulat positif n, hitung keturunan n, terdaftar dalam urutan yang meningkat, tanpa duplikat.

Aturan

Anda tidak diizinkan untuk menggunakan operasi bawaan yang menghitung pembagi nomor.

Baik program dan fungsi penuh diterima, dan mengembalikan tipe data koleksi (seperti jenis tertentu) diizinkan, asalkan itu diurutkan dan bebas duplikat. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji Kasus

1 ->  [1]
2 ->  [2] (any prime number returns just itself)
4 ->  [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]

@ Zgarb jika Anda mengizinkan rantai 0 pembagi tikungan, lalu bagaimana tidak setiap angka merupakan keturunan dari nomor lainnya?
rorlork

3
@ rcrmn Bagi saya, rangkaian nol operasi berarti operasi identitas. Jadi membiarkan nol pembagi tikungan hanya menyiratkan bahwa setiap angka adalah turunan dari dirinya sendiri.
Zgarb

@ Zgarb oke, jadi definisi harus diubah untuk menyatakan bahwa, karena jika tidak, sejauh yang saya tahu, nomor apa pun dianggap sebagai turunan dari setiap nomor lainnya. Saya tidak tahu mengapa perlu refleksivitas. Maukah Anda menjelaskannya?
rorlork

@ rcrmn Saya sedikit mengubah kata-katanya, apakah lebih jelas sekarang?
Zgarb

@ Zgarb maaf tapi tidak, ini bukan operasi, Anda mendefinisikan hubungan antara angka. Jika Anda mendefinisikan hubungan <untuk bilangan asli, untuk setiap n Anda mendapatkan setiap angka lebih kecil dari itu tetapi tidak sendiri. Saya pikir ini harus menjadi sesuatu yang serupa. Dengan cara ini saya pikir hanya 4 akan menjadi keturunannya sendiri (meskipun tidak yakin tentang itu).
rorlork

Jawaban:


9

Python 2, 109 98 85 82 byte

f=lambda n:sorted(set(sum(map(f,{n-x+n/x for x in range(2,n)if(n<x*x)>n%x}),[n])))

Sejak (a-1)*(b+1)+1 == a*b-(b-a)dan b >= a, keturunan selalu kurang dari atau sama dengan angka aslinya. Jadi kita bisa mulai dengan angka awal dan terus menghasilkan keturunan yang sangat kecil sampai tidak ada yang tersisa.

Kondisi (n<x*x)>n%xmemeriksa dua hal dalam satu - itu n<x*xdan n%x == 0.

(Terima kasih kepada @xnor karena melepaskan 3 byte dari casing dasar)

Pyth, 32 byte

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2b

Terjemahan langsung di atas, kecuali fakta bahwa Pyth tampaknya tersedak ketika mencoba menjumlahkan ( s) pada daftar kosong.

Ini mendefinisikan fungsi yyang dapat dipanggil dengan menambahkan y<number>pada akhirnya, seperti itu ( coba online ):

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2by60

CJam, 47 45 byte

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}

Juga menggunakan metode yang sama, dengan beberapa modifikasi. Saya ingin mencoba CJam untuk perbandingan, tetapi sayangnya saya jauh lebih buruk di CJam daripada saya di Pyth / Python, jadi mungkin ada banyak ruang untuk perbaikan.

Di atas adalah blok (pada dasarnya versi CJam tentang fungsi yang tidak disebutkan namanya) yang mengambil int dan mengembalikan daftar. Anda dapat mengujinya seperti itu ( coba online ):

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}:G; 60 Gp

Saya bukan ahli Python, tetapi apakah ada alasan mengapa Anda perlu set()di sana? Tidak bisakah Anda mengembalikan daftar yang disortir?
Alex A.

@Alex set()adalah untuk menghapus duplikat :)
Sp3000

Oh baiklah. Rapi. Kerja bagus!
Alex A.

Dapatkah Anda mungkin melakukan [n]+sum(...,[])seperti sum(...,[n])?
xnor

@xnor Ah ya, saya bisa. Saya tidak pernah menggunakan apa pun selain []sebagai dasar untuk menjumlahkan daftar, jadi saya benar-benar lupa!
Sp3000

6

Java, 148 146 104 byte

Versi golf:

import java.util.*;Set s=new TreeSet();void f(int n){s.add(n);for(int a=1;++a*a<n;)if(n%a<1)f(n+a-n/a);}

Versi panjang:

import java.util.*;
Set s = new TreeSet();
void f(int n) {
    s.add(n);
    for (int a = 1; ++a*a < n;)
        if (n%a < 1)
            f(n + a - n/a);
}

Jadi saya membuat debut saya di PPCG dengan program ini, yang menggunakan TreeSet(yang secara otomatis mengurutkan angka, untungnya) dan rekursi yang mirip dengan program Geobits, tetapi dengan cara yang berbeda, memeriksa kelipatan n dan kemudian menggunakannya di fungsi selanjutnya. Saya akan mengatakan ini adalah skor yang cukup adil untuk pemula (terutama dengan Java, yang sepertinya bukan bahasa yang paling ideal untuk hal semacam ini, dan bantuan Geobits).


Selamat datang di PPCG! Anda dapat menyimpan pasangan dengan mengubah a*bke njalur 9.
Geobits

Terima kasih atas sambutan dan sarannya! Ya, perlu beberapa saat bagi saya untuk menemukan hal-hal kecil ini. Setiap byte dihitung! Terima kasih lagi!
TNT

Anda juga dapat menyimpan dua lagi dengan memasukkan ke c=n+a-bdalam add(). Atau, Anda bisa menyingkirkan csemuanya dan hanya menggunakan n+a-bdi kedua tempat untuk dua byte yang sama.
Geobit

Omong-omong, saya pikir saya tidak perlu menggunakan adddua kali. Tunggu sebentar ...
TNT

Tetapi loop kedua tidak diperlukan secara keseluruhan. Jika Anda memiliki sesuatu ayang Anda tahu terbagi dengan nbersih, maka Anda tidak perlu mengulang untuk menemukannya b, hanya saja n/a. Pada titik itu mulai semakin dekat dan dekat dengan saya;)
Geobits

4

Jawa, 157 121

Berikut adalah fungsi rekursif yang mendapat keturunan dari setiap keturunan n. Ini mengembalikan a TreeSet, yang diurutkan secara default.

import java.util.*;Set t(int n){Set o=new TreeSet();for(int i=1;++i*i<n;)o.addAll(n%i<1?t(n+i-n/i):o);o.add(n);return o;}

Dengan beberapa jeda baris:

import java.util.*;
Set t(int n){
    Set o=new TreeSet();
    for(int i=1;++i*i<n;)
        o.addAll(n%i<1?t(n+i-n/i):o);
    o.add(n);
    return o;
}

2

Oktaf, 107 96

function r=d(n)r=[n];a=find(!mod(n,2:sqrt(n-1)))+1;for(m=(a+n-n./a))r=unique([d(m) r]);end;end

Cukup cetak:

function r=d(n)
  r=[n];                          # include N in our list
  a=find(!mod(n,2:sqrt(n-1)))+1;  # gets a list of factors of a, up to (not including) sqrt(N)
  for(m=(a+n-n./a))               # each element of m is a twist
    r=unique([d(m) r]);           # recurse, sort, and find unique values
  end;
end

1
Ini pemahaman saya bahwa Octave dapat mengakhiri blok dengan hanya enddaripada endfordan endfunction. Itu akan menghemat 11 byte.
Alex A.

Hei, kamu benar! Bukan bagaimana saya belajar bahasa dan tidak pernah menyadari itu bisa dilakukan. Mengapa Anda orang pertama yang menunjukkan hal ini setelah saya melakukan banyak golf dengannya?
dcsohl

Saya hanya tahu itu karena saya baru-baru mencarinya setelah melihatnya di golf orang lain pada pertanyaan lain. Saya tidak pernah menggunakan Octave dan sudah bertahun-tahun sejak saya menggunakan Matlab. Dugaan saya adalah tidak ada banyak pengguna Octave aktif di PPCG, tapi saya bisa saja salah.
Alex A.

Baiklah, terima kasih telah menunjukkannya.
dcsohl

Dengan senang hati, senang saya bisa membantu. Solusi yang bagus.
Alex A.

1

Haskell, 102 100 byte

import Data.List
d[]=[]
d(h:t)=h:d(t++[a*b-b+a|b<-[2..h],a<-[2..b],a*b==h])
p n=sort$nub$take n$d[n]

Penggunaan: p 16output mana[7,10,16]

Fungsi ini dsecara rekursif menghitung semua keturunan, tetapi tidak memeriksa duplikat, sehingga banyak yang muncul lebih dari sekali, misalnya d [4]mengembalikan daftar 4s yang tak terbatas . Fungsi pmengambil nelemen pertama dari daftar ini, menghapus duplikat dan mengurutkan daftar. Voa.


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.