579085261はCRAZY、725582はGOLF、10757494は…?


39

あなたの仕事は、以下で説明する方法を使用して、103の滑らかな数値を英語の単語に翻訳することです。

どうやって?

  1. 入力数の素因数のリスト(繰り返しあり)を生成します。
  2. リストを並べ替える:
    • 2が素因数の1つでない場合は、リストを昇順で並べ替えます。
    • 2が主要因の1つである場合、リストから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で滑らかで、最大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
Ohhh crap ... 05AB1EでÒon を使用する579085261とキャッシュがヒットし、<s> Emigna </ s> Adnanがすでに起動しているように感じます。
魔法のタコUr

複数のファクター2を許可してから、ファクターの数を増やすと反転が開始するインデックスが変更されるようにすることができます。
mbomb007

@ mbomb007はい、多くの可能なバリアントがあります。私の最初のアイデアは、文字のグループで作業して単語をエンコードすることでした。
アーナウルド

5
このチャレンジのテストケースは、Facebookで「Xの名前を発見する」ことを思い出させます。あなたがいる映画のタイトルを見つけてください!ステップ1、お気に入りの素数を選択します<=103...結果は... PIRATE MAZEまたはDOOM VACUUMS
mbomb007

2
@ Qwerp-Derp最初にランダムにシャッフルされ、最大10文字の〜106K単語の辞書に対してテストされました(ファイルは長い間私のHD上にあります-最初はTWLから抽出されたと思います)。次に、複数の単語を最大化するために「S」を最初または最後にすることを強制し、適切な組み合わせでいくつかの個別の文字交換を(再帰的に)試みました。最後に、私は忍耐を失い、挑戦を書きました。:-)実際、これのすべての前に、Word内の位置による文字カウントを考慮に入れようとしましたが、それはそれほど素晴らしいものではありませんでした。
アーナルド

回答:


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

リストの圧縮は他のJellyの答えを簡単に打ち負かすことができると感じていますが、それを使用するためのアルゴリズムははるかに効率的であると思います。多分私はそれらを結合しようとします。

ゼリー、31バイト、@ Leakynunの答えに触発

“¡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:ああ、あなたは私の順列原子あまりにも使用していた
ジョナサン・アラン

9

05AB1E39 38バイト

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

CP-1252エンコードを使用します。オンラインでお試しください!


8
私はそれがあなたのハハハの一人であることを知っていました。解答を途中までこすってゴミに答える
マジックタコのUr

6
キャッシュヒットを@carusocomputingすると、ある程度の時間的プレッシャーが生じる可能性があります(笑
アドナン

Øとにかく私のものを20バイト倒したのはこの部分でした:P。
魔法のタコUr


2
それは非常に効率的ではありませんno;)
エミグナ

8

Python 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バイトの存在をプライム除算でチェックする代わりに、通常の分割可能性チェックを行うことができることを思い出してください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

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

Japt51 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

Pyth54 47バイト

isaacgのおかげで7バイト

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

印刷できない文字を表します)

Pythには多くの主要な組み込み機能がありません...

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

オンラインでお試しください!



@isaacg私はそれを試してみましたが、最後の結果がなぜ奇妙な結果をもたらすのか分かりません。
リーキー修道女

私はあなたが何を意味するのか分からない:pyth.herokuapp.com/...
isaacg

@isaacgそれは非常に奇妙です。
漏れの修道女

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

Python、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数値表現を、使用するビットシフト式に減らしました。また、私は一般にこのブログから多くのインスピレーションを得ました。自分で試してみたかったのですが、これを行うのは良い挑戦のように思えました。

これはもう少しわかりやすいバージョンで、よりわかりやすい変数名もあります


削除できるスペースが少なくとも1つあります。
mbomb007

2
プログラミングパズルとコードゴルフへようこそ!これはコードゴルフ大会ですので、あなたの目的はコードをできるだけ短くすることです。私たちのヘルプセンターは、課題に対するすべての解決策は、使用中の勝利基準の真の候補であるべきだと
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.