Olumlu bölenleri bulun!


11

Tanım

Sıfırdan büyükse sayı pozitiftir.

Bir sayı ( A) bölünebilirse başka bir sayının ( B) AbölenidirB ve geriye kalanla .

Örneğin, 2bir bölen bir 6çünkü 2kutu bölmek6 hiçbir kalıntı olmadan .

Hedef

Göreviniz, pozitif bir sayı alan bir program / işlev yazmak ve sonra tüm bölmelerini bulmaktır.

kısıtlama

  • Asal veya çarpanlara ayırma ile ilgili yerleşik bir öğeyi kullanamazsınız .
  • Algoritmanızın karmaşıklığı O (sqrt (n)) değerini geçmemelidir .

özgürlük

  • Çıktı listesi kopyalar içerebilir.
  • Çıktı listesinin sıralanması gerekmez.

puanlama

Bu . Baytlarda en kısa çözüm kazanır.

testcases

input    output
1        1
2        1,2
6        1,2,3,6
9        1,3,9

Muhtemelen bölen demek istiyorsun , faktör değil . Ve senin olsun istiyorum sanırım zaman karmaşıklığı arasında O(sqrt(n)).
kusur

Divisor ve factor arasındaki fark nedir ?
Leaky Nun

Bu sonuçların ürünü tekrar orijinal sayı ile sonuçlanırsa, örneğin bir sayının faktörleri hakkında konuşuyoruz, ancak bölenler genellikle bahsedilen sayıyı kalan olmadan bölen sayılardır .
Kusur

@flawr Buna göre güncellendi.
Leaky Nun

2
Daha fazla örnek olmalı. 99 (1 3 9 11 33 99)
Brad Gilbert b2gills

Yanıtlar:


4

PostgreSQL, 176 bayt

WITH c AS(SELECT * FROM(SELECT 6v)t,generate_series(1,sqrt(v)::int)s(r)WHERE v%r=0)
SELECT string_agg(r::text,',' ORDER BY r)
FROM(SELECT r FROM c UNION SELECT v/r FROM c)s

SqlFiddleDemo

Giriş: (SELECT ...v)

Nasıl çalışır:

  • (SELECT ...v) - giriş
  • generate_series(1, sqrt(v)::int) - 1 ile sqrt (n) arasındaki sayılar
  • WHERE v%r=0 filtre bölücüler
  • iki kez başvurmak için ortak tablo ifadesi ile sarın
  • SELECT r FROM c UNION SELECT v/r FROM c geri kalan bölenleri generete edin ve birleştirin
  • SELECT string_agg(r::text,',' ORDER BY r) virgülle ayrılmış nihai sonuç üret

Tablo olarak giriş:

WITH c AS(SELECT * FROM i,generate_series(1,sqrt(v)::int)s(r)WHERE v%r=0)
SELECT v,string_agg(r::text,',' ORDER BY r)
FROM(SELECT v,r FROM c UNION SELECT v,v/r FROM c)s
GROUP BY v

SqlFiddleDemo

Çıktı:

╔═════╦════════════════╗
║ v   ║   string_agg   ║
╠═════╬════════════════╣
║  1  ║ 1              ║
║  2  ║ 1,2            ║
║  6  ║ 1,2,3,6        ║
║  9  ║ 1,3,9          ║
║ 99  ║ 1,3,9,11,33,99 ║
╚═════╩════════════════╝

3

C # 6, 75 bayt

string f(int r,int i=1)=>i*i>r?"":r%i==0?$"{i},{n(r,i+1)}{r/i},":n(r,i+1);

Downrep_nation'ın C # çözümüne dayanıyor, ancak yinelemeli ve C # 6'nın bazı yeni özelliklerini kullanarak daha da aşağı iniyor.

Temel algoritma downrep_nation tarafından sunulan algoritma ile aynıdır. For-loop bir özyinelemeye, dolayısıyla ikinci parametreye çevrilir. özyineleme başlangıcı varsayılan parametre tarafından yapılır, bu nedenle işlev yalnızca gerekli tek başlangıç ​​numarasıyla çağrılır.

  • blok tabanlı ifade tabanlı fonksiyonların kullanılması return ifadesini önler
  • Üçlü işleç içindeki dize enterpolasyonu dize birleştirme ve koşullarına katılmaya izin verir

Çoğu cevap burada (henüz) örneklerden tam çıkış biçimini takip etmediğinden, olduğu gibi tutuyorum, ancak bir dezavantaj olarak işlev sonuçta tek bir sondaki virgül içeriyor.


Güzel ilk gönderi!
Rɪᴋᴇʀ


2

Matlab, 48 bayt

n=input('');a=1:n^.5;b=mod(n,a)<1;[a(b),n./a(b)]

Bu nasıl çalışıyor?
Leaky Nun

Ayrıca, düşünemediğim bir algoritma geliştirdiniz ... Ne kadar aptalım.
Leaky Nun

Ben bütün divisos yukarı bulmak sqrt(n)ve ardından her böleni koymak dve n/dlistemde.
flawr

Bazı kurallar eklendi. Belki size biraz bayt kazandırabilir.
Leaky Nun

1
Test etmedim, ancak b=~mod(n,a)1 bayt kaydetmek için kullanamaz mısınız?
Luis Mendo

2

J, 26 bayt

(],%)1+[:I.0=]|~1+i.@<.@%:

açıklama

(],%)1+[:I.0=]|~1+i.@<.@%:  Input: n
                        %:  Sqrt(n)
                     <.@    Floor(Sqrt(n))
                  i.@       Get the range from 0 to Floor(Sqrt(n)), exclusive
                1+          Add 1 to each
             ]              Get n
              |~            Get the modulo of each in the range by n
           0=               Which values are equal to 0 (divisible by n), 1 if true else 0
       [:I.                 Get the indices of ones
     1+                     Add one to each to get the divisors of n less than sqrt(n)
   %                        Divide n by each divisor
 ]                          Get the divisors
  ,                         Concatenate them and return

2

JavaScript (ES6) - 48 bayt

f=n=>[...Array(n+1).keys()].filter(x=>x&&!(n%x))

Çok verimli değil ama çalışıyor! Aşağıdaki örnek:

let f=n=>[...Array(n+1).keys()].filter(x=>x&&!(n%x));
document.querySelector("input").addEventListener("change", function() {
  document.querySelector("output").value = f(Number(this.value)).join(", ");
});
Divisors of <input type="number" min=0 step=1> are: <output></output>


PPCG'ye Hoşgeldiniz!
Laikoni

Ö(n)

1

MATL , 12 bayt

tX^:\~ftGw/h

Yaklaşım @ flawr'ın cevabındakine benzer .

Çevrimiçi deneyin!

açıklama

t      % take input N. Duplicate.
X^:    % Generate range from 1 to sqrt(N)
\      % modulo (remainder of division)
~f     % indices of zero values: array of divisors up to sqrt(N)
tGw/   % element-wise divide input by those divisors, to produce rest of divisors
h      % concatenate both arrays horizontally

MATL'de yazılan programların yanmış kodlarının iyi bir RNG yapıp yapmayacağını merak ediyorum.
flawr

@flawr Muhtemelen hemen hemen her kod golf dili için geçerlidir :-)
Luis Mendo

1

05AB1E , 14 12 bayt

Kod:

ÐtLDŠÖÏDŠ/ï«

Açıklama:

Ð             # Triplicate input.
 tL           # Push the list [1, ..., sqrt(input)].
   D          # Duplicate that list.
    Š         # Pop a,b,c and push c,a,b.
     Ö        # Check for each if a % b == 0.
      Ï       # Only keep the truthy elements.
       D      # Duplicate the list.
        Š     # Pop a,b,c and push c,a,b
         /ï   # Integer divide
           «  # Concatenate to the initial array and implicitly print.

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


Bir açıklama yapmak ister misiniz?
Leaky Nun

@KennyLau Eklendi
Adnan

1

Python 2, 64 bayt

lambda n:sum([[x,n/x]for x in range(1,int(n**.5+1))if n%x<1],[])

Bu anonim işlev bölücülerin bir listesini çıkarır. Bölenler aralığında tamsayılar deneme bölünmesi ile hesaplanır [1, ceil(sqrt(n))]olup, O(sqrt(n)). Eğer n % x == 0(eşdeğer n%x<1), daha sonra her iki xven/x bölücüleridir n.

Çevrimiçi deneyin


1

Jöle , 9 bayt

½Rḍ³Tµ³:;

Diğer cevaplar gibi, tamsayı bölümünün (yanlış) varsayımını yaparsak , O ()n) O (1) .

Nasıl çalışır

½Rḍ³Tµ³:;  Main link. Argument: n

½          Compute the square root of n.
 R         Construct the range from 1 to the square root.
  ḍ³       Test each integer of that range for divisibility by n.
    T      Get the indices of truthy elements.
     µ     Begin a new, monadic chain. Argument: A (list of divisors)
      ³:   Divide n by each divisor.
        ;  Concatenate the quotients with A.

Çevrimiçi deneyin!




0

Mathematica, 50 bayt

@ Flawr's solution benzer .

X için 1'den n'nin kare köküne kadar iz bölümü gerçekleştirir ve bölünebilirse bunu bir listeye kaydeder x ve n / x .

(#2/#)~Join~#&@@{Cases[Range@Sqrt@#,x_/;x∣#],#}&
  • Not 48 karakter dizesini hale UTF-8 temsil etmek 3 bayt gerektirir UTF-8 temsilinde 50 bayt gerektirir.

kullanım

  f = (#2/#)~Join~#&@@{Cases[Range@Sqrt@#,x_/;x∣#],#}&
  f[1]
{1, 1}
  f[2]
{2, 1}
  f[6]
{6, 3, 1, 2}
  f[9]
{9, 3, 1, 3}

3 bayt gerektirir ...
Leaky Nun

@KennyLau Evet, yanılmışım, çift kontrol etmeliydim
mil

0

JavaScript (ES6), 66 62 bayt

f=(n,d=1)=>d*d>n?[]:d*d-n?n%d?f(n,d+1):[d,...f(n,d+1),n/d]:[d]

Sıralı bir tekilleştirilmiş liste döndüren bir sürüm yazacağımı sanıyordum ve aslında 4 bayt daha kısa olduğu ortaya çıktı ...


0

C #, 87 bayt


golfed

String m(int v){var o="1";int i=1;while(++i<=v/2)if(v%i==0)o+=","+i;o+=","+v;return o;}

Ungolfed

String m( Int32 v ) {
    String o = "1";
    Int32 i = 1;

    while (++i <= v / 2)
        if (v % i == 0)
            o += "," + i;

    o += "," + v;

    return o;
}

Tam kod

using System;
using System.Collections.Generic;

namespace N {
    class P {
        static void Main( string[] args ) {
            List<Int32> li = new List<Int32>() {
                1, 2, 6, 9,
            };

            foreach (Int32 i in li) {
                Console.WriteLine( i + " »> " + m( i ) );
            }

            Console.ReadLine();
        }

        static String m( Int32 v ) {
            String o = "1";
            Int32 i = 1;

            while (++i <= v / 2)
                if (v % i == 0)
                    o += "," + i;

            o += "," + v;

            return o;
        }
    }
}

Salıverme

  • v1.0 - 87 bytes- İlk çözüm.

notlar

  • In golfed kodu , kullandığım var'ın ve int' yerine s String'ler ve Int32süre, kod kısaltmak için' lar Ungolfed Kodu ve Tam Kod ben kullanım String'ın ve Int32' ın kodu daha okunabilir hale getirmek için.

forGenelde bundan daha iyi olduğunu duydum while.
Leaky Nun

Çözümünüz, O (sqrt (n)) yerine O (n) karmaşıklığına sahiptir ...
Leaky Nun

@KennyLau duruma göre değişir, bu durumda bir forilmek sahip olmak ilmekle aynı uzunlukta olur while. Bu durumda diğerine sahip olmak veya diğerine sahip olmak ilgisizdir.
auhmaan

Ama bu durumda size bir bayt kurtarabilir ...
Leaky Nun

0

Lua, 83 bayt

s=''x=io.read()for i=1,x do if x%i==0 then s=s..i..', 'end end print(s:sub(1,#s-2))

Maalesef daha iyisini yapamadım


1. PPCG'ye hoş geldiniz, bu sitenin tadını çıkaracağınızı umuyoruz! 2. Bazı baytları kaydetmek için == 0 değerini <1 olarak değiştirebilirsiniz. 3. Eğer sonra bitirmek yerine üçlü yapıyı kullanabilirsiniz, ancak herhangi bir bayt kaydedecek wil bilmiyorum. 4. algoritmanızın karmaşıklığı, gereksinimi karşılamayan O (n) 'dir.
Sızdıran Rahibe

Tamam. Listenin sipariş edilmesi veya uygun şekilde biçimlendirilmesi gerekiyor mu?
user6245072

"Çıktı listesi kopyalar içerebilir. Çıktı listesinin sıralanması gerekmez."
Leaky Nun

Doğru lol. Ve sonucu veya bunu içeren bir diziyi yazdırmam gerekiyor mu?
user6245072

Ya yazdırırsınız ya da iade edersiniz (bir fonksiyonun içinde).
Leaky Nun

0

Perl 6 , 40 bayt

{|(my@a=grep $_%%*,^.sqrt+1),|($_ X/@a)}

Açıklama:

{
  # this block has an implicit parameter named $_

  # slip this list into outer list:
  |(

    my @a = grep
                 # Whatever lambda:
                 # checks if the block's parameter ($_)
                 # is divisible by (%%) this lambda's parameter (*)

                 $_ %% *,

                 # upto and exclude the sqrt of the argument
                 # then shift the Range up by one
                 ^.sqrt+1
                 # (0 ..^ $_.sqrt) + 1

                 # would be clearer if written as:
                 # 1 .. $_.sqrt+1
  ),
  # slip this list into outer list
  |(

    # take the argument and divide it by each value in @a
    $_ X/ @a

    # should use X[div] instead of X[/] so that it would return
    # Ints instead of Rats
  )
}

Kullanımı:

my &divisors = {|(my@a=grep $_%%*,^.sqrt+1),|($_ X/@a)}

.say for (1,2,6,9,10,50,99)».&divisors
(1 1)
(1 2 2 1)
(1 2 3 6 3 2)
(1 3 9 3)
(1 2 10 5)
(1 2 5 50 25 10)
(1 3 9 99 33 11)

0

c #, 87 bayt

void f(int r){for(int i=1;i<=Math.Sqrt(r);i++){if(r%i==0)Console.WriteLine(i+" "+r/i);}

Bu tüm sayılar için işe yarayıp yaramadığını bilmiyorum.

ama karmaşıklık doğru, bu zaten bir şey değil



0

IA-32 makine kodu, 27 bayt

HexDump:

60 33 db 8b f9 33 c0 92 43 50 f7 f3 85 d2 75 04
ab 93 ab 93 3b c3 5a 77 ec 61 c3

Kaynak kodu (MS Visual Studio sözdizimi):

    pushad;
    xor ebx, ebx;
    mov edi, ecx;
myloop:
    xor eax, eax;
    xchg eax, edx;
    inc ebx;
    push eax;
    div ebx;
    test edx, edx;
    jnz skip_output;
    stosd;
    xchg eax, ebx;
    stosd;
    xchg eax, ebx;
skip_output:
    cmp eax, ebx;
    pop edx;
    ja myloop;
    popad;
    ret;

İlk parametre ( ecx) çıktı için bir işaretçi, ikinci parametre ()edx ) sayıdır. Çıktının sonunu hiçbir şekilde işaretlemez; listenin sonunu bulmak için çıktı dizisini sıfırlarla doldurmalısınız.

Bu kodu kullanan tam bir C ++ programı:

#include <cstdint>
#include <vector>
#include <iostream>
#include <sstream>
__declspec(naked) void _fastcall doit(uint32_t* d, uint32_t n) {
    _asm {
        pushad;
        xor ebx, ebx;
        mov edi, ecx;
    myloop:
        xor eax, eax;
        xchg eax, edx;
        inc ebx;
        push eax;
        div ebx;
        test edx, edx;
        jnz skip_output;
        stosd;
        xchg eax, ebx;
        stosd;
        xchg eax, ebx;
    skip_output:
        cmp eax, ebx;
        pop edx;
        ja myloop;
        popad;
        ret;
    }
}
int main(int argc, char* argv[]) {
    uint32_t n;
    std::stringstream(argv[1]) >> n;
    std::vector<uint32_t> list(2 * sqrt(n) + 3); // c++ initializes with zeros
    doit(list.data(), n);
    for (auto i = list.begin(); *i; ++i)
        std::cout << *i << '\n';
}

Spesifikasyona uysa bile çıktıda bazı aksaklıklar var (sıralama gerekmiyor; benzersizliğe gerek yok).


Giriş: 69

Çıktı:

69
1
23
3

Bölenler çiftler halinde.


Giriş: 100

Çıktı:

100
1
50
2
25
4
20
5
10
10

Mükemmel kareler için, son bölen iki kez çıkarılır (kendisiyle bir çifttir).


Giriş: 30

Çıktı:

30
1
15
2
10
3
6
5
5
6

Giriş mükemmel bir kareye yakınsa, son çift iki kez çıkar. Bunun nedeni döngüdeki kontrollerin sırasıdır: ilk olarak, "remainder = 0" ve çıkışları kontrol eder ve ancak o zaman döngüden çıkmak için "bölüm <bölen" olup olmadığını kontrol eder.


0

SmileBASIC, 49 bayt

INPUT N
FOR D=1TO N/D
IF N MOD D<1THEN?D,N/D
NEXT

Gerçeğini kullandığı D>N/D= D>sqrt(N)pozitif sayılar için


0

C 87 81 bayt

@Ceilingcat , 81 bayt tarafından geliştirilmiştir :

i,j;main(n,b)int**b;{for(;j=sqrt(n=atoi(b[1]))/++i;n%i||printf("%u,%u,",i,n/i));}

Çevrimiçi deneyin!


Orijinal cevabım 87 bayt:

i;main(int n,char**b){n=atoi(b[1]);for(;(int)sqrt(n)/++i;n%i?:printf("%u,%u,",i,n/i));}

İle derleyin gcc div.c -o div -lmve ile çalıştırın./div <n> .


Bonus: O (n) zaman karmaşıklığı ve sabit kodlu n(46 bayt + uzunluk ) ile daha da kısa bir varyant n:

i,n=/*INSERT VALUE HERE*/;main(){for(;n/++i;n%i?:printf("%u,",i));}

Düzenleme: @Sriotchilism O'Zaic girişlerin sabit kodlu olmaması gerektiğini işaret ettiğiniz için teşekkür ederim, ben argv üzerinden giriş almak için ana gönderme değiştirildi.


1
ngirdi? Girdiyi bir değişkene koymak, bir dizi nedenden dolayı burada girdi yapmanın kabul edilen bir yolu değildir. Kabul edilen ve kabul edilmeyen giriş ve çıkış formlarımız hakkında daha fazla bilgiyi burada bulabilirsiniz: codegolf.meta.stackexchange.com/questions/2447/… . Belirli bir dili (ör. C) merak ediyorsanız buraya bakabilirsiniz: codegolf.meta.stackexchange.com/questions/11924/… .
Ad Hoc Garf Hunter

@ SriotchilismO'Zaic Evet, ngirdi. Bunu değiştirmeyi deneyeceğim, böylece girdiyi başka bir şekilde alacak. Bilgi için teşekkürler!
OverclockedSanic

0

APL (NARS), 22 karakter, 44 bayt

{v∪⍵÷v←k/⍨0=⍵∣⍨k←⍳⌊√⍵}

Ölçek:

  f←{v∪⍵÷v←k/⍨0=⍵∣⍨k←⍳⌊√⍵}
  f 1
1 
  f 2
1 2 
  f 6
1 2 6 3 
  f 9
1 3 9 
  f 90
1 2 3 5 6 9 90 45 30 18 15 10 

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.