579085261 adalah GILA, 725582 adalah GOLF, 10757494 adalah ...?


39

Tugas Anda adalah menerjemahkan angka 103-halus menjadi kata bahasa Inggris, menggunakan metode yang dijelaskan di bawah ini.

Bagaimana?

  1. Buat daftar faktor prima (dengan pengulangan) dari nomor input.
  2. Sortir daftar:
    • Jika 2 bukan salah satu faktor utama, urutkan daftar dalam urutan menaik.
    • Jika 2 adalah salah satu faktor utama, hapus dari daftar dan urutkan faktor yang tersisa dalam urutan menurun.
  3. Terjemahkan setiap faktor menjadi huruf, menggunakan tabel berikut:

     3 = S   13 = L   29 = X   43 = O   61 = Z   79 = H  101 = K  
     5 = P   17 = Q   31 = N   47 = R   67 = T   83 = V  103 = Y  
     7 = M   19 = U   37 = C   53 = A   71 = E   89 = D  
    11 = F   23 = I   41 = W   59 = G   73 = J   97 = B  
    

Catatan : Tabel ini dibangun secara empiris untuk memaksimalkan jumlah kata yang mungkin. Bagi yang penasaran, berikut adalah daftar 2.187 kata yang dapat dikodekan seperti itu (mungkin termasuk bahasa kasar). Jelas tidak dijamin optimal, tetapi cukup bagus untuk tantangan ini.

Contohnya

Contoh 1: 579085261 (urutan naik)

  1. Faktor utama adalah [37, 47, 53, 61, 103] .
  2. 2 bukan merupakan faktor utama, jadi kami menjaga daftar diurutkan dalam urutan menaik.
  3. 37 = C, 47 = R, dll. Outputnya adalah "GILA".

Contoh 2: 725582 (urutan menurun)

  1. Faktor utama adalah [2, 11, 13, 43, 59] .
  2. 2 adalah faktor utama, jadi kami menghapusnya dan mengurutkan daftar dalam urutan menurun, yang menghasilkan:
    [59, 43, 13, 11] .
  3. 59 = G, 43 = O, dll. Outputnya adalah "GOLF".

Contoh 3: 10757494 (dengan faktor berulang)

  1. Faktor utama adalah [2, 11, 71, 71, 97] .
  2. 2 adalah faktor utama, jadi kami menghapusnya dan mengurutkan daftar dalam urutan menurun, yang menghasilkan:
    [97, 71, 71, 11] .
  3. 97 = B, 71 = E, 11 = F. Outputnya adalah "BEEF".

Klarifikasi dan aturan

  • Nomor input dijamin 103-halus dan habis dibagi 2 paling banyak satu kali.
  • Menurut definisi, bilangan halus adalah bilangan bulat positif .
  • Input dan output dapat ditangani dalam format apa pun yang wajar. Outputnya bisa dalam huruf kecil atau besar. Trailing whitespace dapat diterima. Ruang putih terkemuka tidak.
  • Jika program / fungsi Anda tidak dapat mendukung input besar, harap tentukan dalam jawaban Anda.
  • Ini adalah kode golf, jadi jawaban tersingkat dalam byte menang.

Uji kasus

34874          --> ARM
483254         --> BAR
353722         --> EAR
494302         --> EGG
39061          --> FAT
6479           --> FUN
60421          --> ICE
54166          --> JAM
48911474       --> BETA
2510942        --> BOOM
2303854        --> DOOM
844261         --> FIRE
1606801        --> MAZE
1110085        --> PAGE
5212974        --> BALLS
67892046       --> BEANS
885396199      --> CREEK
67401037       --> FUNKY
27762173       --> QUICK
1238440506     --> ARROWS
33045832681    --> CRAGGY
1362714005     --> PIRATE
137302698      --> TROLLS
358310128062   --> BEGGARS
40255151586    --> DETAILS
164633248153   --> FIXATED
621172442227   --> UNRATED
2467812606     --> VACUUMS
86385078330    --> GROWNUPS
26607531423091 --> UNWORTHY

9
Ohhh omong kosong ... 05AB1E cache hit saat menggunakan Òpada 579085261, merasa seperti <s> Emigna </ s> Adnan sudah dimulai.
Magic Gurita Guci

Anda dapat mengizinkan beberapa faktor 2, lalu membuatnya sehingga meningkatkan jumlah faktor mengubah indeks saat pembalikan dimulai.
mbomb007

@ mbomb007 Ya, ada banyak varian yang memungkinkan. Ide awal saya adalah menyandikan kata apa pun dengan mengerjakan kelompok huruf.
Arnauld

5
Kasus uji pada tantangan ini mengingatkan hal-hal "temukan nama X" di Facebook. Temukan judul film tempat Anda berada! Langkah satu, pilih nomor utama favorit Anda <=103... hasilnya adalah PIRATE MAZE, atau DOOM VACUUMS...
mbomb007

2
@ Qwerp-Derp Pertama kali acak-acakan dan diuji terhadap kamus ~ 106 ribu kata, hingga 11 huruf (file ada di HD saya untuk waktu yang lama - saya pikir ini awalnya diekstraksi dari TWL ). Kemudian saya memaksa 'S' untuk menjadi yang pertama atau terakhir untuk memaksimalkan kata-kata jamak dan mencoba beberapa pertukaran surat individu pada kombinasi yang baik (secara rekursif). Akhirnya, saya kehilangan kesabaran dan menulis tantangan. :-) Sebenarnya, sebelum semua ini, saya mencoba untuk memperhitungkan Jumlah Surat dengan Posisi Dalam Kata tetapi itu tidak terlalu bagus.
Arnauld

Jawaban:


13

Jelly , 29 27 byte

ÆEµØA“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?xḊṚḢ}¡

Terima kasih kepada @JonathanAllan untuk bermain golf 1 byte!

Cobalah online!

Latar Belakang

“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’

adalah literal numerik. Karakter di antara tanda kutip diganti dengan indeks berbasis 1 di halaman kode Jelly , dan array yang dihasilkan ditafsirkan sebagai angka dasar-250. Ini menghasilkan bilangan bulat c: = 288824892868083015619552399 .

Bagaimana itu bekerja

ÆEµØA“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?xḊṚḢ}¡  Main link. Argument: n

ÆE                           Yield the exponents of n's prime factorization, with.
                             zeroes. This yields an array A.
  µ                          Begin a new monadic chain with argument A.
   ØA                        Set the return value to “ABC...XYZ”.
     “¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?        Select the c-th permutation of the alphabet, yielding
                             s := “SPMFLQUIXNCWORAGZTEJHVDBKY”.
                      Ḋ      Dequeue; yield A without its first element, stripping
                             the exponent of 2.
                     x       Repeat the k-th letter of s r times, where r is the
                             exponent of the k-th odd prime number.
                          ¡  Combine the two links to the left into a quicklink:
                        Ḣ}     - Apply head to the right argument (A), yielding the
                                 exponent of 2. Since n is at most divisible by the
                                 first power of 2, this yields 1 for even numbers
                                 and 0 for odd ones. Call the link to the left that
                                 many times on the previous return value.
                       Ṛ       - Reverse the string to the left.

10

Jelly , 36 byte

“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?ØA1;;⁶
×107ÆE¢×UḢ¡t⁶

Cobalah online!

Penjelasan

Pembantu konstan (menghasilkan “SPMFLQUIXNCWORAGZTEJHVDBKY ”dengan 1 prepended)

“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?ØA1;;⁶
“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’          288824892868083015619552399 (compressed representation)
              œ?ØA      th permutation of the alphabet
                  1;    prepend 1
                    ;⁶  append a space

Program utama

×107ÆE¢×UḢ¡t⁶
×107           Multiply {the input} by 107
    ÆE         Convert to a list of frequencies for each factor
      ¢×       {Vectorized} multiply by the return value of 1£
        UḢ¡    Delete the first value, reverse the list that many times
           t⁶  Delete trailing/leading space

Saya merasa bahwa kompresi daftar saya dengan mudah mengalahkan jawaban Jelly lainnya, tetapi algoritma saya untuk menggunakannya bisa jauh lebih efisien. Mungkin saya akan mencoba menggabungkannya.

Jelly , 31 byte, terinspirasi oleh jawaban @ Leakynun

“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?ØA⁷;
ÆfÆCị¢U⁸¡U

Cobalah online! (sedikit dimodifikasi untuk berjalan jauh lebih cepat)

Tidak konsisten dalam apakah ia mencetak baris baru (tetapi PPCG biasanya memungkinkan jawaban dengan atau tanpa baris baru, jadi saya kira ini juga berfungsi?). Apakah sangat lambat (O ( n ) di mana n adalah input, dan angka-angka bukan kecil ...)

Penjelasan

Pembantu konstan (menghasilkan “¶SPMFLQUIXNCWORAGZTEJHVDBKY”, di mana baris baru)

“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’œ?ØA⁷;
“¡3ḅḲ+Ṿɼ¡ẏƙẊƘ’          288824892868083015619552399 (compressed representation)
              œ?ØA      th permutation of the alphabet
                  ⁷;    prepend newline

Program utama

ÆfÆCị¢U⁸¡U
Æf          Produce list of prime factors (repeating repeated factors)
  ÆC        Map the nth prime to n
    ị¢      Index into the output of 1£
      U     Reverse
        ¡   a number of times
       ⁸    equal to the input
         U  Reverse again

Itu cara yang sangat bagus untuk menyimpan permutasi alfabet ...
Leaky Nun

Ah Anda telah menggunakan atom permutasi saya juga: D
Jonathan Allan

9

05AB1E , 39 38 byte

ÒW<iR¨}26LØR•6Ê2"£´õþÕàçŸôëÂÛ*™•36BS:J

Menggunakan pengkodean CP-1252 . Cobalah online!


8
Aku tahu itu salah satu dari kalian hahaha. goresan setengah jadi jawaban ke sampah
Magic Octopus Mm

6
@caruscomputing hit cache dapat memunculkan tekanan waktu haha
Adnan

Øadalah bagian dari ini yang mengalahkan tambang sebesar 20 byte: P.
Guci Gurita Ajaib


2
Ini sangat tidak efisien;)
Emigna

8

Python 2, 220 217 byte

n=input()
i=1
L=[]
exec'i+=1;c=0\nwhile n%i<1:c+=1;n/=i\nif c:L+=[i]*c\n'*n
T='SPMFLQUIXNCWORAGZTEJHVDBKY'
print''.join(T[[p for p in range(3,104)if all(p%k for k in range(2,p))].index(q)]for q in[L,L[:0:-1]][L[0]<3])

Coba online - hanya menjalankan test case terkecil tanpa kehabisan memori

Tidak Disatukan:

Versi ini tidak digunakan exec, jadi Anda benar-benar dapat menguji semua test case tanpa kehabisan memori.

n=input()
i=1
L=[]
while~-n:
 i+=1;c=0
 while n%i<1:c+=1;n/=i
 if c:L+=[i]*c
if L[0]<3:L=L[:0:-1]
T='SPMFLQUIXNCWORAGZTEJHVDBKY'
print''.join(T[[p for p in range(3,104)if all(p%k for k in range(2,p))].index(q)]for q in L)

Cobalah online


8

Ruby , 139 138 134 125 120 115 + 7 = 146 145 141 132 127 122 byte

Menggunakan -rprime bendera untuk +7 byte.

-1 byte dari @daniero. -4 byte dengan mengingat bahwa saya hanya dapat melakukan pemeriksaan keterbagian reguler alih-alih memeriksa divisi utama untuk keberadaan2 .

-9 byte dari solusi Python @ mbomb007 mengingatkan saya tentang cara yang lebih pendek untuk mengambil huruf yang cocok.

-5 byte karena trailing spasi sekarang diizinkan.

-5 byte dari penemuan Enumerable#find_index

->n{x=Prime.prime_division n;x.reverse!if n%2<1;x.map{|i,c|" SPMFLQUIXNCWORAGZTEJHVDBKY"[Prime.find_index i]*c}*''}

Cobalah online! (semua kasus uji)

Penjelasan

->n{                                   # Anonymous procedure with one argument n
    x=Prime.prime_division n;          # Get prime factorization of n, sorted
                                       # p0^e0 * p1^e1 ... -> [[p0,e0],[p1,e1],...]
    x.reverse!if n%2<1;                # Reverse if divisible by 2
    x.map{|i,c|                        # For each prime/exponent pair:
        " SPMFLQUIXNCWORAGZTEJHVDBKY"[ # Get corresponding character by obtaining:
            Prime.find_index i]        # Determine index of the current prime
                               *c      # Repeat the letter by the supplied exponent
                                 }*''} # Join all letter sequences together

Bagus Anda dapat menghapus ruang antara zipdan"
daniero

7

Paket Bash + GNU utilities + bsd-games, 170

Tampaknya tidak optimal, tetapi berfungsi:

p='printf %03d\n'
a=(`factor $1`)
x=$[a[1]<3]
$p `primes 3 104`|paste - <(fold -1<<<SPMFLQUIXNCWORAGZTEJHVDBKY)|join -o1.2 - <($p ${a[@]:x+1})|(((x))&&tac||cat)|tr -d \\n

Cobalah online .



6

Japt , 51 50 byte

49 byte kode, +1 untuk -Pbendera.

%2?Uk :Uk Åw)£`yspmflquixncÙgz’jhvdbk`g#ho fj bX

Cobalah online!

Ini bisa menjadi jauh lebih pendek jika hanya Japt memiliki beberapa fitur lagi ...

Penjelasan

`yspmflquixncÙgz’jhvdbk`hanya string yang sama semua orang menggunakan terkompresi sebanyak Japt dapat mengompresnya (3 byte lebih pendek dari aslinya!). Satu-satunya alat kompresi built-in Japt saat ini menggantikan pasangan huruf kecil dengan char byte tunggal.

Jadi mari kita periksa kode yang sebenarnya:

%2?Uk :Uk Å  w)
%2?Uk :Uk s1 w)
%2?             // If the input mod 2 is non-zero,
   Uk           //   take the prime factors of the input (U).
      :Uk       // Otherwise, take the prime factors of the input,
          s1 w  //   slice off the first one (2), and reverse.

Kemudian £digunakan untuk mengganti setiap item Xdalam hasil seperti ini:

"string"g#h o fj bX
"string"g104o fj bX

         104o         // Create the range [0...104).
              fj      // Filter to only items Z where Z.j() is truthy (Z is prime).
                      // This results in the list of prime numbers from 2 to 103.
                 bX   // Take the index of X in this list.
"string"g             // Get the char in the compressed string at that index.
                      // For `y`, the index is 26, but since the string is only 26 chars
                      // long, Japt wraps around and grabs the first char in the string.

Hasilnya adalah array karakter pada titik ini, sehingga -Pbendera bergabung menjadi sebuah string tunggal, dan hasilnya secara implisit dikirim ke output.



5

Pyth , 54 47 byte

7 byte berkat isaacg

s__W%Q2@L."AZ❤O❤❤❤❤❤❤Q❤9❤❤×❤❤"xL_MP#r_3_103-PQ2

( mewakili karakter yang tidak patut dicetak)

Pyth tidak memiliki banyak built-in utama ...

Hexdump:

0000000: 73 5f 5f 57 25 51 32 40 4c 2e 22 41 5a 03 4f f3 s__W%Q2@L."AZ.O.
0000010: 14 af 15 ed f5 51 90 39 d5 18 d7 20 a8 22 78 4c .....Q.9... ."xL
0000020: 5f 4d 50 23 72 5f 33 5f 31 30 33 2d 50 51 32    _MP#r_3_103-PQ2

Cobalah online!



@isaacg Saya mencobanya, dan saya tidak tahu mengapa ini menghasilkan hasil yang aneh untuk yang terakhir.
Leaky Nun

Saya tidak tahu maksud Anda: pyth.herokuapp.com/...
isaacg

@isaacg Itu sangat aneh.
Leaky Nun

5

J , 59 byte

'SPMFLQUIXNCWORAGZTEJHVDBKY'{~(p:>:i.26)i.[:|.@}.^:(2={.)q:

Cobalah online!

Cukup sederhana...

'SPMFLQUIXNCWORAGZTEJHVDBKY'{~(p:>:i.26)i.[:|.@}.^:(2={.)q:
                              (p:>:i.26)                      first 26 primes after 2
                                        i.                    for which the indices is
                                                         q:   prime factors
                                            |.@}.             remove first and reverse
                                                 ^:           if
                                                   (2={.)     the first entry is 2
                            {~                                reverse index
'..........................'                                  hardcoded string

3

PHP, 173 Bytes

for($i=2;1<$n=&$argn;$n%$i?++$i:$r[]=$i.!$n/=$i)for($t=$i;$i>2&!$w[$i]&&$i%--$t;$t>2?:$w[$i]=SPMFLQUIXNCWORAGZTEJHVDBKY[$p++]);$r[0]>2?:rsort($r);foreach($r as$s)echo$w[$s];

Versi Online

Diperluas

for($i=2;1<$n=&$argn; # loop till input is 1
$n%$i?++$i:$r[]=$i.!$n/=$i) #after loop add value to result if input is divisible and divide input
  for($t=$i;$i>2&!$w[$i]&&$i%--$t; # loop if number is gt 2 and not in letter array till number is divisible 
  $t>2?:$w[$i]=SPMFLQUIXNCWORAGZTEJHVDBKY[$p++]) # if is prime add to letter array
  ; # make nothing in the loop
$r[0]>2?:rsort($r); # reverse result array if 2 is in result array
foreach($r as$s) # loop result array
  echo$w[$s]; # Output 

PHP, 178 Bytes

for($z=2;$p<26;$t>1?:$w[$z]=SPMFLQUIXNCWORAGZTEJHVDBKY[$p++])for($t=++$z;$z%--$t;);for($i=2;1<$n=&$argn;)$n%$i?++$i:$r[]=$i.!$n/=$i;$r[0]>2?:rsort($r);foreach($r as$s)echo$w[$s];

Versi Online

Diperluas

for($z=2;$p<26;
$t>1?:$w[$z]=SPMFLQUIXNCWORAGZTEJHVDBKY[$p++]) # after loop if is prime add to letter array
  for($t=++$z;$z%--$t;); 
for($i=2;1<$n=&$argn;)  # loop till input is 1
  $n%$i?++$i:$r[]=$i.!$n/=$i; #add value to result if input is divisible and divide input
$r[0]>2?:rsort($r); # reverse result array if 2 is in result array
foreach($r as$s) # loop result array
  echo$w[$s]; # Output 

1

Python, 1420 byte

lambda x:(lambda a,b,e,k,l,m,q,p:len.__name__[:a].join(dict(zip((lambda n:(lambda n,f,g:f(n,e,[],f,g))(n,lambda n,i,r,f,g:g(n,i+b,r,f,g)if i<n else r,lambda n,i,r,f,g:f(n,i,[r,r+[i]][all(i%x!=a for x in[e]+r)],f,g)))(l*e*(k*l+b)),(lambda n,o,t:(lambda n,f,g:f(n, len.__name__[:a],f,g))(n,lambda n,s,f,g:g(n,s,f,g)if n>o else s,lambda n,s,f,g:f(n//t,s+chr(n%t),f,g)))((((((k<<e)-b)<<m)+m)<<((k<<q)+(k<<b)))+(((((k<<e)-b)<<e)+b)<<((k<<q)-(b<<b)))+((((((b<<k)+b))<<l)+b)<<((((k<<e)-b)<<l)+(b<<b)))+(((((k<<e)-b)<<l)-k)<<((m<<m)+p))-(((p<<m)-b)<<((m<<m)-(b<<b)))+(((m<<k)+b)<<((((m<<e)-b)<<k)-(b<<b)))+(((((k<<e)-b)<<l)-m)<<((((b<<l)+b)<<k)+k))-(((((b<<l)-b)<<l)-p)<<((b<<p)+(b<<b)))-(((p<<k)-b)<<((((b<<l)-b)<<k)+k))-(((k<<q)-b)<<((p<<l)))+(((m<<m)+m)<<((((k<<e)+b)<<k)-b))-(((k<<m)+b)<<((k<<m)-b))-(((m<<m)+k)<<((((k<<e)-b)<<k)-(b<<b)))+(((((k<<e)+b)<<e)+b)<<((m<<l)-(b<<e)))-(((((k<<e)+b)<<e)+b)<<((((b<<l)+b)<<e)-b))+((((((b<<k)+b))<<k)+b)<<((p<<k)))+(((((k<<e)-b)<<k)-k)<<((k<<l)))+(((m<<l)+b)<<((m<<k)))+(((m<<e)-b)<<((b<<m)+(b<<b)))+((((((b<<k)+b))<<e)-b)<<((k<<k)+b))+(((m<<k)-b)<<((b<<l)+b))-((((k<<e)-b))<<((k<<e)))+(((m<<e)+b)<<e)-b,b,b<<l*e)))[i]for i in(lambda x: [x.remove(e), x[::-b]][b] if e in x else x)((lambda x:(lambda x,g,h:g(x,b,[],g,h))(x,lambda x,n,r,g,h:h(x,n+b,r,g,h)if x>b else r,lambda x,n,r,g,h:h(x//n,n,r+[n],g,h)if x%n==a else g(x,n,r,g,h)))(x))))(*[x for x in range(True<<len(len.__name__))])

Ini tentu saja dapat menyingkat beberapa, tapi ini adalah upaya saya untuk menyelesaikannya tanpa angka atau string literal. Saya menyadari ini adalah masalah kode-golf dan ini tidak persis pendek tetapi ingin berbagi pula, tidak yakin apakah ini melanggar aturan atau tidak.

Sangat menyenangkan untuk dibuat, saya menggunakan algoritma pada posting blog ini untuk mengurangi representasi numerik ASCII dari "SPMFLQUIXNCWORAGZTEJHVDBKY" ke dalam ekspresi bit-shift yang saya gunakan. Saya juga umumnya mengambil banyak inspirasi dari blog ini, saya ingin mencobanya sendiri dan ini sepertinya merupakan tantangan yang baik untuk melakukannya.

Ini adalah versi yang sedikit lebih mudah dibaca, dengan beberapa nama variabel yang lebih masuk akal juga


Setidaknya ada satu ruang yang bisa dihapus.
mbomb007

2
Selamat Datang di Programming Puzzles & Code Golf! Ini adalah kompetisi golf kode, jadi tujuan Anda adalah membuat kode sesingkat mungkin. Pusat bantuan kami menyatakan bahwa semua solusi untuk tantangan harus [...] menjadi pesaing serius untuk kriteria kemenangan yang digunakan. [...] Entri ke kontes kode golf harus di-golf
Dennis
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.