Farklı Bazlardaki Asallar


17

Meydan okuma:

Size bir taban 10 numarası verilir. 10'dan sayı 2'ye kadar her taban için:

  1. Orijinal giriş numarasını temel 10 dizesi olarak alın ve sayının taban için geçersiz olan tüm rakamlarını kaldırın.
  2. Ortaya çıkan sayı dizesini yorumlayın. Bu 1 veya 0 verirse, tüm işlemi sonlandırın.
  3. En büyük asal çarpanını ondalık sayı olarak çıktılar veya yazdırırlar.

Çıktı en büyük ana faktörlerden oluşan bir dizi olabilir.

Örnek vakalar:

Giriş:

987654321

Çıktı:

379721
10593529
1091
179
1493
293
19
7

Alternatif:

[379721,10593529,1091,179,1493,293,19,7]

Bu, 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 gibi en büyük asal faktörleri, durduğu yerde 1 2'ye ulaşana kadar yazdırır .


2
Süreç konusunda net değilim. Muhtemelen örnekten anlayabilirim, ancak açık talimatlara sahip olmalısınız, bu yüzden bu gerekli değildir. Yani daha düşük bir tabana dönüştürüyoruz, geçersiz rakamları kaldırıyoruz, sonra en büyük asal faktörü yazdırıyoruz? Bu faktörü hangi bazda yazdırıyoruz? Daha sonra aynı işlemi en büyük asal faktör ve daha düşük bir taban ile mi yapıyoruz? Yoksa çarpanlarımızla mı yapıyoruz? 10 veya 9 ile başlıyor muyuz?
xnor

Siteye Hoşgeldiniz!
DJMcMayhem

2
Daha açık hale getirmek için meydan okumayı yeniden yazmayı denedim. Umarım istediğin budur. Değilse, değiştirmekten çekinmeyin.
xnor

4
Ben ana operasyon yerine tacked büyük-asal faktör adım bulmak temel dönüşüm. Birçok dil, bunu doğrudan yerleşik bir birincil çarpanlara ayırma işlemiyle yapar ve geri kalanı temel olarak ikinci bir ayrı zorluk yapmak zorundadır. Taban dönüşümü de yerleşik veya büstü. Operasyonlar yerleşik olarak geldiğinde, golfler için iyi bir zeminde olmalarını beklersiniz ve aslında çarpanlara ayırma ve taban dönüşümü. Yine de, ilk meydan okuma için iyi, ama bir dahaki sefere akılda tutulması gereken şeyler.
xnor

3
Bunun Google Code Jam'den ilham alma ihtimali var mı?
Mego

Yanıtlar:


6

Pyth, 25 bayt

sfTm>1PiFdC,.u-N`tYKrT1zK
                       z   get input as a string
            .u      rT1    cumulative reduce over [10,9,...,2]
              -N`tY        remove one minus the number (10,9,...) from the input
          C,       K    K  pair each step along the chain with corresponding base
   m                       map over [["987654321", 10],...]:
       iFd                   apply the base-conversion (splat over i)
      P                      prime factorization, smallest to largest
    >1                       take [the last element], or [] if empty (1 or 0)
 fT                        remove the []s from 0s or 1s
s                          join the one-element arrays together

Burada deneyin.



4

MATL , 17 15 bayt

9:PQ"G@ZAYfXzX>

Bu, sayıyı varsayılan olarak izin verilen tırnak işaretleri içeren bir dize olarak alır.

Çevrimiçi deneyin!

açıklama

9:PQ     % Push array [10, 9, ..., 2]
"        % For each number in that array. These are the bases to be considered
  G      %   Push input. Forces for input to be taken implicitly first time
  @      %   Push current base
  ZA     %   Convert from that base to base 10, discarding non-valid digits
  Yf     %   Prime factors. Gives empty for input 1, and 0 for input 0
  Xz     %   Non-zero values. Gives empty if previous result was 0, or else
         %   leaves it as it was
  X>     %   Maximum of array. For empty input gives empty
         % Implicitly end for each
         % Implicitly display. Empty arrays are not displayed

Bu, 1 ile bitmeyen girişler için sonunda 0 verir.
poi830

'98765432' ve '98765' girişleri için (rastgele örnekler), sonlandırılmadan önce doğru sayıları sonra 0'ı verir.
poi830

1
@ poi830 Çözüldü
Luis Mendo

1

Julia, 101 bayt

f(s,x=[],b=10)=(t=filter(c->c<=47+b,s))>"1"&&b>1?f(s,[x;maximum(keys(factor(parse(Int,t,b))))],b-1):x

Bu, girdiyi dize olarak kabul eden ve bir dizi döndüren özyinelemeli bir işlevdir.

Ungolfed:

function f(s, x=[], b=10)
    # Filter the string down to only the digits valid for base b
    t = filter(c -> c <= 47 + b, s)

    # If the filtered string isn't "1" or "0" and b is a valid base
    if t > "1" && b > 1
        # Call the function again, appending the maximum prime factor
        # of t in base b to the argument x and decrementing the base
        f(s, [x; maximum(keys(factor(parse(Int, t, b))))], b-1)
    else
        # Otherwise return the array
        x
    end
end

1

Mathematica, 83 bayt

FactorInteger[Select[IntegerDigits@#,#<a&]~FromDigits~a][[-1,1]]~Table~{a,10,2,-1}&

Anonim işlev, bir liste döndürür. Dürüst olmak gerekirse karmaşık değil.


0

Ruby, 120 bayt

Özyinelemeli işlev, girdiyi dize olarak alır.

f=->n,b=2{require'prime';i=n.tr([*b.to_s..?9].join,"").to_i(b)
b>10?[]:f[n,b+1]+[*i>1?Prime.prime_division(i).max[0]:p]}

1
Bunun -rprimeyerine komut satırı bayrağını kullanarak bazı baytlar kaydedebilirsiniz require.
Kapı tokmağı

-rprimenedense benim için çalışmıyor ...
Değer Mürekkep

0

Pyke, 19 bayt, rakipsiz

(splat_node işlevini ekleyin)
DTAbPe
;1TtD=T`"":r

Burada deneyin!

Girdileri tırnak içine alır, bir hata ile çıkar.

Açıklama (yeni satır \ n ile değiştirildi):

D                    - Duplicate the first item on the stack (And get it from input first time)
 TAb                 - Convert input to base (whatever's in T, 10 default)
    Pe               - get the highest prime factor of the number
      \n;1           - print it out and get rid of it
          TtD=T      - T -= 1
               `"":  - input = input.replace(str(t), "")
                   r - GOTO start
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.