579085261은 CRAZY, 725582는 GOLF, 10757494는…?


39

당신의 임무는 아래에 설명 된 방법을 사용하여 103 매끄러운 숫자 를 영어 단어로 번역하는 것 입니다.

어떻게?

  1. 입력 번호의 소인수 (반복 포함) 목록을 생성하십시오.
  2. 목록을 정렬하십시오.
    • 2 가 주요 요소 중 하나가 아닌 경우 목록을 오름차순으로 정렬하십시오.
    • 2 가 주요 요인 중 하나 인 경우 목록에서 제거하고 나머지 요인을 내림차순으로 정렬하십시오.
  3. 다음 표를 사용하여 각 요소를 문자로 번역하십시오.

     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  
    

참고 :이 표는 가능한 단어 수를 최대화하기 위해 경험적으로 만들어졌습니다. 궁금한 점은 다음과 같이 인코딩 할 수있는 2,187 개의 단어 목록입니다 (무례한 언어 포함). 반드시 최적이라고 보장 할 수는 없지만이 과제에 충분합니다.

예 1 : 579085261 (오름차순)

  1. 주요 요인은 [37, 47, 53, 61, 103] 입니다.
  2. 2 는 주요한 요소가 아니므로 목록을 오름차순으로 정렬합니다.
  3. 37 = C, 47 = R 등. 출력은 "CRAZY"입니다.

예 2 : 725582 (내림차순)

  1. 주요 요인은 [2, 11, 13, 43, 59] 입니다.
  2. 2 는 주요한 요소이므로 목록을 제거하고 목록을 내림차순으로 정렬하면
    [59, 43, 13, 11]이 됩니다.
  3. 59 = G, 43 = O 등. 출력은 "GOLF"입니다.

예 3 : 10757494 (반복 요인 포함)

  1. 주요 요인은 [2, 11, 71, 71, 97] 입니다.
  2. 2 는 주요한 요소이므로 제거하고 목록을 내림차순으로 정렬하면
    [97, 71, 71, 11]이 됩니다.
  3. 97 = B, 71 = E, 11 = F. 출력은 "BEEF"입니다.

설명 및 규칙

  • 입력 번호는 103-smooth이며 최대 2 번으로 나눌 수 있습니다.
  • 정의에 따라, 부드러운 숫자는 양의 정수 입니다.
  • 입력과 출력은 합리적인 형식으로 처리 할 수 ​​있습니다. 출력은 소문자 또는 대문자 일 수 있습니다. 후행 공백이 허용됩니다. 선행 공백은 아닙니다.
  • 프로그램 / 기능이 큰 입력을 지원할 수없는 경우 답을 지정하십시오.
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.

테스트 사례

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
사용하는 경우 오 쓰레기 ... 05AB1E 캐시 히트 Ò579085261, 같은 느낌 <S> Emigna </ S> 아드 난 이미 시작했다.
Magic Octopus Urn

2의 여러 요인을 허용 한 다음 요인 수를 늘리면 반전이 시작되는 색인이 변경되도록 할 수 있습니다.
mbomb007

@ mbomb007 예, 가능한 많은 변형이 있습니다. 저의 초기 아이디어는 글자 그룹 을 다루면서 단어 를 인코딩 하는 것이 었습니다 .
Arnauld

5
이 도전에 대한 테스트 사례는 Facebook에서 "X 이름을 발견"한 것들을 상기시킵니다. 당신이있는 영화의 제목을 찾으십시오! 1 단계, 선호하는 소수를 선택하십시오. <=103결과는 다음 PIRATE MAZE과 같습니다 DOOM VACUUMS.
mbomb007

2
@ Qwerp-Derp 처음에는 무작위로 섞어 ~ 106K 단어 사전, 최대 11 자까지 테스트했습니다 (파일은 오랫동안 HD에 있습니다-원래 TWL 에서 추출 된 것 같습니다 ). 그런 다음 복수 단어를 최대화하기 위해 'S'를 첫 번째 또는 마지막으로 강제하고 좋은 조합 (재귀 적으로)으로 두 개의 개별 문자 교환을 시도했습니다. 마지막으로 인내심을 잃고 도전을 썼습니다. :-) 사실,이 모든 것 전에, Word 내의 Position by Letter Counts 를 고려하려고했지만 그렇게 크지는 않았습니다.
Arnauld

답변:


13

젤리 , 29 27 바이트

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

1 바이트를 골프로 해준 @JonathanAllan에게 감사합니다!

온라인으로 사용해보십시오!

배경

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

숫자 리터럴입니다. 따옴표 사이의 문자는 Jelly 코드 페이지 에서 1 기반 인덱스로 대체되며 결과 배열은 기본 250 숫자로 해석됩니다. 정수 c : = 288824892868083015619552399가 생성 됩니다.

작동 원리

Æ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

젤리 , 36 바이트

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

온라인으로 사용해보십시오!

설명

도우미 상수 ( “SPMFLQUIXNCWORAGZTEJHVDBKY ”1 앞에 추가됨)

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

주요 프로그램

×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

나는 목록의 압축이 다른 젤리 대답보다 쉽게 ​​이길 수 있다고 생각하지만, 그것을 사용하는 알고리즘이 훨씬 효율적일 수 있습니다. 어쩌면 나는 그들을 결합하려고 노력할 것입니다.

@Leakynun의 답변에서 영감을 얻은 Jelly , 31 바이트

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

온라인으로 사용해보십시오! (더 빠르게 실행되도록 약간 수정)

후행 줄 바꿈을 인쇄하는지 여부에 일관성이 없습니다 (그러나 PPCG는 일반적으로 후행 줄 바꿈이 있거나없는 답변을 허용 하므로이 방법도 효과가 있습니까?). 가 매우 (O (느린 N ) 여기서 n은 ... 입력하고, 그 숫자는 정확히 작은되지 않습니다)

설명

도우미 상수 ( 줄 바꿈이 “¶SPMFLQUIXNCWORAGZTEJHVDBKY”있는 곳을 생성합니다 )

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

주요 프로그램

Æ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

알파벳 순열을 저장하는 아주 좋은 방법입니다.
Leaky Nun

아 당신도 내 순열 원자를 사용했습니다 : D
Jonathan Allan

9

05AB1E , 39 38 바이트

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

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


8
나는 그것이 당신의 하하하라는 것을 알고있었습니다. 쓰레기 반쯤 긁어 쓰레기에 대답
Magic Octopus Urn

6
캐시 적중에 @carusocomputing 시간 압력을 가져올 수 있습니다 하하
Adnan

Ø어쨌든 20 바이트만큼 내 비트를 이겼습니다 : P.
Magic Octopus Urn

난 당신이 할 수 있다고 생각 ? Ò26ÝØR • 1SI을 ¾ ± = ÔìÍècS|ÁÜ7d • 36BS : Já¹GR (37)에 대한
Emigna

2
그것은 매우 효율적이지 않다;)
Emigna

8

파이썬 2, 220 217 바이트

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

온라인으로 사용해보십시오 - 메모리 부족없이 가장 작은 테스트 사례 만 실행

언 골프 드 :

이 버전은을 사용하지 않으므로 exec실제로 메모리 부족없이 모든 테스트 사례를 테스트 할 수 있습니다.

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)

온라인으로 사용해보십시오


8

루비 , 139 138 134 125 120 115 + 7 = 146 145 141 132 127 122 바이트

-rprime+7 바이트에 플래그를 사용합니다 .

@daniero에서 -1 바이트 -4 바이트의 존재에 대한 소수를 검사하는 대신 정기적으로 나눗셈 검사를 수행 할 수 있음을 기억하여 -4 바이트 2.

@ mbomb007의 Python 솔루션에서 -9 바이트는 일치하는 문자를 검색하는 더 짧은 방법을 상기시킵니다.

후행 공백이 허용되므로 -5 바이트입니다.

감지에서 -5 바이트 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}*''}

온라인으로 사용해보십시오! (모든 테스트 사례)

설명

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

좋은데 zip"
daniero

7

배쉬 + GNU 유틸리티 + bsd-games 패키지, 170

최적이 아닌 것 같지만 작동합니다.

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

온라인으로 사용해보십시오 .



6

Japt , 51 50 바이트

49 바이트의 코드, -P플래그의 경우 +1

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

온라인으로 사용해보십시오!

Japt 만 몇 가지 기능을 더 가지고 있다면 이것은 더 짧을 수 있습니다 ...

설명

`yspmflquixncÙgz’jhvdbk`Japt가 압축 할 수있는만큼 압축 된 다른 문자열을 사용합니다 (원래보다 3 바이트 짧습니다!). 현재 Japt의 유일한 내장 압축 도구는 일반적인 소문자 쌍을 단일 바이트 문자로 대체합니다.

실제 코드를 살펴 보자.

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

그런 다음 결과에서 다음과 같이 £각 항목을 바꾸는 데 사용됩니다 X.

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

결과는이 시점에서 문자 배열이므로 -P플래그는 단일 문자열로 결합하고 결과는 암시 적으로 출력으로 전송됩니다.



5

Pyth , 54 47 바이트

isaacg 덕분에 7 바이트

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

( 인쇄 불가능한 캐릭터를 나타냅니다)

Pyth에는 많은 기본 제공 기능이 없습니다 ...

16 진 덤프 :

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

온라인으로 사용해보십시오!



@isaacg 나는 그것을 시도했지만 그것이 왜 마지막 결과에 이상한 결과를 낳는 지 모르겠다.
Leaky Nun

나는 당신이 무슨 뜻인지 모르겠어요 : pyth.herokuapp.com/...
isaacg

@isaacg 정말 이상합니다.
Leaky Nun

5

J , 59 바이트

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

온라인으로 사용해보십시오!

아주 간단합니다 ...

'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 바이트

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

온라인 버전

넓히는

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 바이트

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

온라인 버전

넓히는

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

파이썬, 1420 바이트

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

이것은 분명히 일부를 단축시킬 수는 있지만 숫자 나 문자열 리터럴없이 문제를 해결하려는 시도입니다. 나는 이것이 코드 골프 문제라는 것을 알고 있으며 이것은 정확히 짧지는 않지만 어쨌든 공유하고 싶었습니다. 이것이 규칙을 위반하는지 여부는 확실하지 않습니다.

만들기가 즐거웠습니다. 이 블로그 게시물 의 알고리즘을 사용하여 "SPMFLQUIXNCWORAGZTEJHVDBKY"의 ASCII 숫자 표현을 사용하는 비트 시프트 식으로 줄였습니다. 나는 또한 일반적 으로이 블로그에서 많은 영감을 얻었습니다. 나는 그것을 직접 시험 해보고 싶었습니다.

여기 에 좀 더 알아보기 쉬운 버전이 있으며 좀 더 합리적인 변수 이름도 있습니다


제거 할 수있는 공간이 하나 이상 있습니다.
mbomb007

2
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이것은 코드 골프 경쟁이므로 가능한 한 짧게 코드를 작성하는 것이 목표입니다. 우리의 도움말 센터도전에 대한 모든 솔루션이 사용중인 승리 기준에 대한 심각한 경쟁자가되어야한다고
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.