579085261 là CRAZY, 725582 là GOLF, 10757494 là?


39

Nhiệm vụ của bạn là dịch một số 103 trơn thành một từ tiếng Anh, sử dụng phương pháp được mô tả dưới đây.

Làm sao?

  1. Tạo danh sách các thừa số nguyên tố (có sự lặp lại) của số đầu vào.
  2. Sắp xếp danh sách:
    • Nếu 2 không phải là một trong các thừa số nguyên tố, hãy sắp xếp danh sách theo thứ tự tăng dần.
    • Nếu 2 là một trong các yếu tố chính, hãy loại bỏ nó khỏi danh sách và sắp xếp các yếu tố còn lại theo thứ tự giảm dần.
  3. Dịch từng yếu tố thành một chữ cái, sử dụng bảng sau:

     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  
    

Lưu ý : Bảng này được xây dựng theo kinh nghiệm để tối đa hóa số lượng từ có thể. Đối với người tò mò, đây là danh sách 2.187 từ có thể được mã hóa theo cách đó (có thể bao gồm ngôn ngữ thô lỗ). Nó chắc chắn không được đảm bảo là tối ưu, nhưng nó đủ tốt cho thử thách này.

Ví dụ

Ví dụ 1: 579085261 (thứ tự tăng dần)

  1. Các yếu tố chính là [37, 47, 53, 61, 103] .
  2. 2 không phải là một yếu tố chính, vì vậy chúng tôi giữ danh sách được sắp xếp theo thứ tự tăng dần.
  3. 37 = C, 47 = R, v.v ... Đầu ra là "CRAZY".

Ví dụ 2: 725582 (thứ tự giảm dần)

  1. Các yếu tố chính là [2, 11, 13, 43, 59] .
  2. 2 là một yếu tố chính, vì vậy chúng tôi loại bỏ nó và sắp xếp danh sách theo thứ tự giảm dần, đưa ra:
    [59, 43, 13, 11] .
  3. 59 = G, 43 = O, v.v ... Đầu ra là "GOLF".

Ví dụ 3: 10757494 (với hệ số lặp lại)

  1. Các yếu tố chính là [2, 11, 71, 71, 97] .
  2. 2 là một yếu tố chính, vì vậy chúng tôi loại bỏ nó và sắp xếp danh sách theo thứ tự giảm dần, đưa ra:
    [97, 71, 71, 11] .
  3. 97 = B, 71 = E, 11 = F. Đầu ra là "BEEF".

Làm rõ và quy tắc

  • Số đầu vào được đảm bảo là 103 mịn và chia hết cho 2 lần.
  • Theo định nghĩa, số trơn là số nguyên dương .
  • Đầu vào và đầu ra có thể được xử lý trong bất kỳ định dạng hợp lý. Đầu ra có thể bằng chữ thường hoặc chữ hoa. Khoảng trống Trailing là chấp nhận được. Khoảng trắng hàng đầu là không.
  • Nếu chương trình / chức năng của bạn không thể hỗ trợ đầu vào lớn, vui lòng chỉ định nó trong câu trả lời của bạn.
  • Đây là mã golf, vì vậy câu trả lời ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

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 tào lao ... 05AB1E bộ nhớ cache hit khi sử dụng Òtrên 579085261, có cảm giác như <s> Emigna </ s> Adnan đã bắt đầu.
Bạch tuộc ma thuật Urn

Bạn có thể cho phép nhiều yếu tố là 2, sau đó thực hiện để tăng số lượng yếu tố thay đổi chỉ số bắt đầu đảo ngược.
mbomb007

@ mbomb007 Có, có nhiều biến thể có thể. Ý tưởng ban đầu của tôi là mã hóa bất kỳ từ nào bằng cách làm việc trên các nhóm chữ cái.
Arnauld

5
Các trường hợp thử nghiệm trong thử thách này nhắc nhở những điều "khám phá tên X của bạn" trên Facebook. Tìm tiêu đề của bộ phim bạn đang tham gia! Bước một, chọn số nguyên tố yêu thích của bạn <=103... kết quả của bạn là PIRATE MAZE, hoặc DOOM VACUUMS...
mbomb007

2
@ Qwerp-Derp Lần đầu tiên được xáo trộn ngẫu nhiên và được thử nghiệm với một từ điển ~ 106K từ, tối đa 11 chữ cái (tệp này trên HD của tôi trong một thời gian dài - Tôi nghĩ rằng nó ban đầu được trích xuất từ TWL ). Sau đó, tôi buộc 'S' là đầu tiên hoặc cuối cùng để tối đa hóa các từ số nhiều và thử một vài trao đổi thư riêng lẻ trên một kết hợp tốt (đệ quy). Cuối cùng, tôi mất kiên nhẫn và viết thử thách. :-) Trên thực tế, trước tất cả những điều này, tôi đã cố gắng tính Tổng số thư theo vị trí trong Word nhưng nó không tuyệt lắm.
Arnauld

Câu trả lời:


13

Thạch , 29 27 byte

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

Cảm ơn @Jonathan ALLan vì đã chơi golf 1 byte!

Hãy thử trực tuyến!

Lý lịch

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

là một chữ số. Các ký tự giữa các trích dẫn được thay thế bằng các chỉ số dựa trên 1 của chúng trong trang mã Jelly và mảng kết quả được hiểu là số cơ sở 250. Điều này mang lại số nguyên c: = 288823612868083015619552399 .

Làm thế nào nó hoạt động

Æ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

Thạch , 36 byte

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

Hãy thử trực tuyến!

Giải trình

Hằng số trợ giúp (sản xuất “SPMFLQUIXNCWORAGZTEJHVDBKY ”với 1 khoản dự phòng)

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

Chương trình chính

×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

Tôi có cảm giác rằng việc nén danh sách của tôi dễ dàng đánh bại câu trả lời Jelly khác, nhưng thuật toán của tôi để sử dụng nó có thể hiệu quả hơn rất nhiều. Có lẽ tôi sẽ cố gắng kết hợp chúng.

Jelly , 31 byte, lấy cảm hứng từ câu trả lời của @ Leakynun

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

Hãy thử trực tuyến! (sửa đổi một chút để chạy nhanh hơn nhiều)

Không nhất quán trong việc nó có in một dòng mới hay không (nhưng PPCG thường cho phép câu trả lời có hoặc không có dòng mới, vì vậy tôi đoán điều này cũng hoạt động?). Là rất chậm (O ( n ), nơi n là đầu vào, và những con số này không chính xác nhỏ ...)

Giải trình

Hằng số trợ giúp (sản xuất “¶SPMFLQUIXNCWORAGZTEJHVDBKY”, ở đâu là dòng mới)

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

Chương trình chính

Æ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

Đó là một cách rất hay để lưu trữ một hoán vị của bảng chữ cái ...
Leaky Nun

Ah bạn cũng đã sử dụng nguyên tử hoán vị của tôi: D
Jonathan Allan

9

05AB1E , 39 38 byte

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


8
Tôi biết đó là một trong số các bạn hahaha. phế liệu nửa chừng đã trả lời xong vào thùng rác
Magic Octopus Urn

6
@carusocomputing các lần truy cập bộ nhớ cache có thể tăng áp lực thời gian haha
Adnan

Ødù sao cũng là một phần của cái này đã đánh bại tôi 20 byte: P.
Bạch tuộc ma thuật Urn


2
Nó không hiệu quả lắm;)
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])

Dùng thử trực tuyến - chỉ chạy trường hợp thử nghiệm nhỏ nhất mà không hết bộ nhớ

Ung dung:

Phiên bản này không sử dụng exec, vì vậy bạn thực sự có thể kiểm tra tất cả các trường hợp thử nghiệm mà không hết bộ nhớ.

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)

Dùng thử trực tuyến


8

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

Sử dụng -rprimecờ cho +7 byte.

-1 byte từ @daniero. -4 byte bằng cách nhớ rằng tôi chỉ có thể thực hiện kiểm tra chia hết thông thường thay vì kiểm tra phân chia số nguyên tố cho sự tồn tại của 2.

-9 byte từ giải pháp Python của @ mbomb007 nhắc nhở tôi về một cách ngắn hơn để lấy lại chữ cái phù hợp.

-5 byte vì khoảng trắng theo dõi hiện được phép.

-5 byte từ khám phá 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}*''}

Hãy thử trực tuyến! (tất cả các trường hợp thử nghiệm)

Giải trình

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

Đẹp một. Bạn có thể xóa khoảng cách giữa zip"
daniero

7

Tiện ích Bash + GNU + gói bsd-games, 170

Có vẻ không tối ưu, nhưng nó hoạt động:

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

Hãy thử trực tuyến .



6

Japt , 51 50 byte

49 byte mã, +1 cho -Pcờ.

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

Hãy thử trực tuyến!

Điều này có thể ngắn hơn nếu chỉ Japt có thêm một vài tính năng ...

Giải trình

`yspmflquixncÙgz’jhvdbk`chỉ là cùng một chuỗi mà mọi người khác đang sử dụng đã nén nhiều như Japt có thể nén nó (ngắn hơn 3 byte so với ban đầu!). Công cụ nén tích hợp duy nhất của Japt tại thời điểm này thay thế các cặp chữ thường bằng một ký tự byte đơn.

Vì vậy, hãy kiểm tra mã thực tế:

%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.

Sau đó, £được sử dụng để thay thế từng mục Xtrong kết quả như thế này:

"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.

Kết quả là một mảng các ký tự tại thời điểm này, do đó -Pcờ kết hợp nó thành một chuỗi duy nhất và kết quả được gửi hoàn toàn đến đầu ra.



5

Bình thường , 54 47 byte

7 byte nhờ isaacg

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

( đại diện cho một nhân vật không thể in)

Pyth không có nhiều tiện ích tích hợp ...

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

Hãy thử trực tuyến!



@isaacg Tôi đã thử nó và tôi không biết tại sao nó lại tạo ra kết quả lạ cho cái cuối cùng.
Leaky Nun

Tôi không biết ý của bạn là gì: pyth.herokuapp.com/
isaacg

@isaacg Điều đó thật kỳ lạ.
Leaky Nun

5

J , 59 byte

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

Hãy thử trực tuyến!

Kha đơn gảin...

'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 byte

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];

Phiên bản trực tuyến

Mở rộng

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 byte

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];

Phiên bản trực tuyến

Mở rộng

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__))])

Điều này chắc chắn có thể bằng cách rút ngắn một số, nhưng đó là nỗ lực của tôi trong việc giải quyết nó mà không có số hoặc chuỗi ký tự. Tôi nhận ra đây là một vấn đề về golf-code và điều này không chính xác nhưng dù sao cũng muốn chia sẻ, không chắc điều này có vi phạm quy tắc nào hay không.

Thật thú vị khi thực hiện, tôi đã sử dụng thuật toán trên bài đăng trên blog này để giảm biểu diễn số ASCII của "SPMFLQUIXNCWORAGZTEJHVDBKY" trong biểu thức dịch chuyển bit mà tôi sử dụng. Tôi cũng thường lấy rất nhiều cảm hứng từ blog này, tôi muốn tự mình thử nó và đây dường như là một thử thách tốt để thực hiện nó.

Đây là một phiên bản dễ đọc hơn một chút, với một số tên biến hợp lý hơn


Có ít nhất một không gian có thể được loại bỏ.
mbomb007

2
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một cuộc thi golf mã, vì vậy mục tiêu của bạn là làm cho mã của bạn càng ngắn càng tốt. Trung tâm trợ giúp của chúng tôi tuyên bố rằng tất cả các giải pháp cho các thách thức nên [...] trở thành một ứng cử viên nặng ký cho các tiêu chí chiến thắng được sử dụng. [...] Một mục tham gia một cuộc thi golf mã cần phải được đánh gôn
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.