Primes dalam Berbagai Pangkalan

17

Tantangan:

Anda diberi nomor basis 10. Untuk setiap basis dari 10 menghitung mundur ke basis 2:

  1. Ambil nomor input asli sebagai string 10 basis, dan hapus angka apa pun dari nomor yang tidak valid untuk basis.
  2. Menafsirkan string angka yang dihasilkan di pangkalan itu. Jika ini memberi 1 atau 0, hentikan seluruh proses.
  3. Keluarkan atau cetak faktor prima terbesarnya, sebagai angka desimal.

Outputnya dapat berupa array dari faktor prima terbesar.

Contoh kasus:

Memasukkan:

987654321

Keluaran:

379721
10593529
1091
179
1493
293
19
7

Bergantian:

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

Ini mencetak faktor prima terbesar dari 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 , dan seterusnya hingga mencapai 1 2 , di mana ia berhenti.

poi830
sumber
2
Saya tidak jelas tentang prosesnya. Saya mungkin bisa mengetahuinya dari contoh, tetapi Anda harus memiliki instruksi yang jelas sehingga ini tidak diperlukan. Jadi kami mengonversi ke basis yang lebih rendah, menghapus angka yang tidak valid, lalu mencetak faktor utama terbesar? Basis apa kita mencetak faktor ini? Apakah kita kemudian melakukan proses yang sama dengan faktor prima terbesar dan basis yang lebih rendah? Atau apakah kita melakukannya dengan jumlah yang kita perhitungkan? Apakah kita mulai dengan 10 atau 9?
xnor
Selamat datang di situs ini!
DJMcMayhem
2
Saya mencoba menulis ulang tantangan untuk membuatnya lebih jelas. Saya harap ini yang Anda maksudkan. Jika tidak, jangan ragu untuk mengubahnya.
xnor
4
Saya menemukan langkah faktor prima terbesar yang agak terpaku pada operasi utama adalah konversi basis. Banyak bahasa hanya melakukannya secara langsung dengan faktorisasi bawaan bawaan, dan sisanya pada dasarnya harus melakukan tantangan terpisah kedua. Konversi basis juga built-in-atau-bust. Ketika operasi datang sebagai built-in, Anda berharap mereka menjadi tanah yang terinjak dengan baik untuk golf, dan memang faktorisasi dan konversi basis. Tetap, bagus untuk tantangan pertama, tetapi hal-hal yang perlu diingat untuk waktu berikutnya.
xnor
3
Adakah kemungkinan ini terinspirasi oleh Google Code Jam?
Mego

Jawaban:

6

Pyth, 25 byte

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

Coba di sini.

Gagang pintu
sumber
4

Pyth - 16 byte

V_S9#ePi~-z`NhNB

Cobalah online di sini .

Kadang-kadang ada beberapa baris kosong pada input tanpa semua digit, biar tahu kalau itu masalah.

Maltysen
sumber
4

MATL , 17 15 byte

9:PQ"G@ZAYfXzX>

Ini mengambil nomor sebagai string dengan tanda kutip, yang diizinkan secara default.

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
Yang ini menghasilkan 0 di akhir untuk input yang tidak berakhir pada 1.
poi830
Untuk input '98765432' dan '98765' (contoh acak), output angka yang benar kemudian 0 sebelum mengakhiri.
poi830
1
@ poi830 Dipecahkan sekarang
Luis Mendo
1

Julia, 101 byte

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

Ini adalah fungsi rekursif yang menerima input sebagai string dan mengembalikan array.

Tidak Disatukan:

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
Alex A.
sumber
1

Mathematica, 83 byte

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

Fungsi anonim, mengembalikan daftar. Tidak rumit, jujur ​​saja.

LegionMammal978
sumber
0

Ruby, 120 byte

Fungsi rekursif, mengambil input sebagai string.

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]}
Nilai Tinta
sumber
1
Anda dapat menyimpan beberapa byte dengan menggunakan -rprimeflag baris perintah alih-alih require.
Gagang Pintu
-rprimetidak bekerja untuk saya karena suatu alasan ...
Nilai Tinta
0

Pyke, 19 byte, tidak bersaing

(tambahkan fungsi splat_node)
DTAbPe
;1TtD=T`"":r

Coba di sini!

Mengambil input dalam tanda kutip, keluar dengan kesalahan.

Penjelasan (baris baru diganti dengan \ n):

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
Biru
sumber