Seventy Seven Sevens


19

nと上限のlリストを指定すると、長さが7桁以下で構成される2つ以上の数を乗算することで作成できる数nが未満になりlます。A161145はこの課題に近いですが、7、77、777、7777、77777などは含まれません。

n=anything, l<49 結果として:

[]

n=1, l=49 結果として:

7*7=49

f(1,49)=[49]

n=1, l=343 結果として:

7*7   =49
7*7*7 =343

f(1,343)=[49,343]

n=2,l=6000 結果として:

7*7    =49
7*7*7  =343
7*7*7*7=2401
7*77   =539
7*7*77 =3773
77*77  =5929

f(2,6000)=[49,343,539,2401,3773,5929]

n=3, l=604000 結果として:

[49, 343, 539, 2401, 3773, 5439, 5929, 16807, 26411, 38073, 41503, 59829, 117649, 184877, 266511, 290521, 418803, 456533, 603729]

等...

ルール

  1. 中間ステップを出力する必要はありません。これは明確にするために行われました。
  2. 出力は、配列として、または任意の文字(改行を含む)で区切ることができます。
  3. 出力は、最小から最大の数値順にする必要があります。
  4. タイトルを関連性のあるものにするには、n処理する必要のある最高のものがn=77(その高さを処理できない場合、言語の制限は受け入れられますが、怠inessは受け入れられません)。この制限は、メモリ内にスーパーセット全体を構築しようとしている人を妨げることです。
  5. TIOがn=77コードに対して実行できない場合、達成するために必要な仕様を説明しますn=77
  6. 製品が有効であるためには、少なくとも2つの数字で構成されている必要があります。
  7. これは最低バイト数が勝利したとみなされます。
  8. リストは、以下lまたは以下のアイテムを含むように選択できますl
  9. ボーナス:コードが正確に77バイトである場合、私から称賛されます。価値がない、私は知っています。

解析に問題があります。「長さが7桁n以下で、2桁以上の数字を掛けて作成できる数字をリストしてくださいl
-xnor

一部の数値を複数回出力することは許容されますか?
数学中毒

ルール5は、任意のコードの実行が与えられますが、かなり無意味ですn=77l=7**7**7、例えば?
ジョナサンアラン

1
結果が空ではないと仮定できますか?
タイタス

@JonathanAllan true。
魔法のタコUr

回答:


1

05AB1E、19バイト

L7×1¸ì©IF®âPD²‹Ïê®K

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

説明

非常に非効率的です。TIOリンクは、ゴルフバージョンで使用されるceil(l^(1/7))反復の代わりにl反復を実行して、大規模なテストケースのテストを容易にします。

L7×                   # create the list ['7', '77', '777' ...] 
                      # with the final item having n 7's 
   1¸ì©               # prepend a 1 and store a copy in register
       IF             # l times do:
         ®â           # cartesian product between current list and the list in register 
           P          # product of each sublist
            D²‹Ï      # keep only numbers smaller than l
                ê     # remove duplicates and sort
                 ®K   # remove 1, 7, 77, 777 ... from the list

$L7ׂ˜-5バイトを取得しようとしましたが、できませんでした。
魔法のタコUr

@carusocomputing:ええ、6バイトは多すぎるように感じますが、もっと短い方法は本当に見当たりません。もっと短い方法で教えてくれることを望んでいた;)
エミグナ

私が考えていた.pか、.sあまりにも、それでもそれらは長いようです。サンプル実装を実行するのではなく、TIOページで誤って「更新」を押して、存在から削除しました。26だったと思います。
魔法のタコUr

1
@carusocomputing:そのため、常にリンクボタンを定期的に押す必要があります。コンピューターを更新または再起動して、何かを失うことはありません。しかし、歴史をゆるめるのは少し面倒です:)
エミグナ

7

ゼリー21 20 19 18バイト

R7ẋḌµ;ŒċP€⁹f€FµÐLḟ

出力がOPに一致しないことに注意してください。コメントを残しました。

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

使い方

R7ẋḌµ;ŒċP€⁹f€FµÐLḟ  Main link. Left argument: n. Right argument: l

R                   Range; yield [1, ..., n].
 7ẋ                 Times; yield [[7], ..., [7] * n].
   Ḍ                Undecimal; yield s := [7, 77, ...].
    µ         µÐL   Begin a new chain with argument s and call the chain between 
                    until the results no longer chain.
                    Return the last unique result.
      Œċ            Combinations; return all unordered pairs in integers in the
                    return value.
     ;              Concatenate the return value and its pairs.
        P€          Take the product of each individual integer and each pair in
                    the result.
          ⁹f€       Filter each; for each j in [1, ..., l], intersect [j] with the
                    array of products. The result is sorted and contains no 
                    duplicates.
                 ḟ  Filterfalse; remove the elements of s from the result.


4

JavaScript(ES6)、103 101バイト

カリー化構文の入力を受け取ります(n)(l)

n=>l=>(a=[],g=(n,m,p,i)=>(p>l||g(n,m,(a[i>1?p:a]=p)*m,-~i),--n?g(n,m+7,p,i):a.filter(n=>n)))(n,'7',1)

テストケース

最後のテストケースが完了するまでに数秒かかる場合があります。


4

PHP、142バイト

$r=[];for([,$n,$l]=$argv;$n--;)f($v[]=$z.=7);function f($t){global$v,$l,$r;while($c=$t*$v[+$i++])$l<$c?:f($c)&$r[$c]=$c;}sort($r);print_r($r);

-5バイトは除去$r=[];と交換sort($r);@sort($r);

オンライン版

拡大

再帰関数は、制限を含むすべての順列を作成します

$r=[];
for([,$n,$l]=$argv;$n--;)
  f($v[]=$z.=7);
function f($t){
    global$v,$l,$r;
    while($c=$t*$v[+$i++])
      $l<$c?:f($c)&$r[$c]=$c;
}
sort($r);
print_r($r);

PHP、145バイト

for([,$n,$l]=$argv;$n;)$t[]=str_pad(7,$n--,7);for(;$l>=$i+=49;$v>1?:$u[]=$r)for($v=$i,$r=!$c=0;$d=$t[$c];)$v%$d?$c++:($v/=$d)&$r*=$d;print_r($u);

拡大

49で割り切れるすべての値をチェックする制限を含めるまでのループ

for([,$n,$l]=$argv;$n;)
  $t[]=str_pad(7,$n--,7);
for(;$l>=$v=$i+=49;$v>1?:$u[]=$r)
  for($r=!$c=0;$d=$t[$c];)
    $v%$d?$c++:($v/=$d)&$r*=$d;
print_r($u);

オンライン版

さらに数バイトと連想配列を作成できます。キーの数と値として使用されるセブンの配列

for([,$n,$l]=$argv;$n;)
  $t[]=str_pad(7,$n--,7);
for(;$l>=$v=$i+=49;$v>1?:$u[array_product($r)]=$r)
  for($r=[],$c=0;$d=$t[$c];)
    $v%$d?$c++:($v/=$d)&$r[]=$d;
print_r($u);

オンライン版


while($c=$t*$v[+$i++])$l<$c?f($c)&$r[$c]=$c;3バイト節約します。しかし、そうでなければなりません$l<=$c。保存する$r?sort($r)&print_r($r):0;代わりに$r=[];
タイタス

1
$z.=7;は、よりも5バイト短くなってい$z=$z*10+7;ます。
タイタス

そして、@さらに4バイト短くなってい$r?...:0;ます。(@Christophに感謝)
タイタス

@Titusなぜそうなの$l<=$cか?昨日は$z.=7、私が見つけた追加の2バイトの私の日ではなかったようです。最初に、他の2つの提案について考えています。あなた:はwhileループを欠場
ヨルグヒュルサーマン

OPに明確にするように依頼しました。説明の中で彼は結果について話していますthat are less than l、彼の例ではare less than or equal。明確化に応じて、$c>$l||.../ $c>$l?:...または$c<$l&&...最短です。
タイタス


3

Pyth、22バイト

JsM._*\7Eu@s*LR+JGJSQJ

JsM._*\7E
        E               second input
     *\7                repeat "7" as many times as the above
   ._                   all prefixes of above
 sM                     convert each to integer
J                       store list as J

         u@s*LR+JGJSQJ
         u              repeat the following until results not unique
                     J  starting from G = J
                        at each iteration, G is the current value
               +JG      append G to J
                  J     J
            *LR         multiply the elements of the above two, vectorizing each
           s            flatten list
          @        SQ   intersect with [1,2,3,...,first input]
                        this takes elements from [1,2,3,...,first input] and
                        check if each element is in the previous list
                        which ensures the result is sorted and unique

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

スペック

  • 入力: l[newline]n
  • 出力: array containing the sorted result

3

PHP、128の125 130 129 127 123バイト

最大22 7秒まで動作しますが、より大きな値を丸めます(7 ** 23は64ビットマシンの浮動小数点です)。

空の結果に対する警告を避けるために、Jörgによって3バイト、私によって3バイト、5 4 1が保存されました。

for([,$c,$z]=$argv,$n=$c+1;$c<$z;$p<$z&&$r[$p]=$p)for($b=$c+=$p=1;$b|0;$b/=$n)$p*=str_pad(7,$b%$n,7);@sort($r);print_r($r);

コマンドライン引数から入力を受け取ります。で実行する-nr、オンラインで試してください

壊す

for([,$c,$z]=$argv,$n=$c+1;         # $z=L, $n=N+1
    $c<$z;                          # loop $c from N to L-1:
    $p<$z&&$r[$p]=$p                    # 2. if product is < L, add to array
)                                       #    (key=val to avoid duplicates)
    for($b=$c+=$p=1;$b|0;$b/=$n)        # 1. loop $b through ++$c as base-N+1 number
        $p*=str_pad(7,$b%$n,7);             # take each base-N+1 digit as length
                                            # for a streak of 7s as factor
        // (str_pad is 1 byte shorter than str_repeat and saves 3 by ensuring positive $p)
@sort($r);                          # sort array (muted to avoid warning for empty result)
print_r($r);                        # print array

1
for([,$c,$z]=$argv,$n=1+$c;$c<$z;代わりにfor($n=1+$c=$argv[1];$c<$z=$argv[2];
ヨルクヒュルサーマン

1
@代わりに使用し$r&&て警告を抑制しますか?$p<$z&&$r[$p]=$p
クリストフ

私はちょうどそれが含まれるべきであることは明らかである$p>$z?:$r[$p]=$p例からであるべきであることに気づいた。そのため、またはを使用した場合の節約はありません。n=1, l=343l$p>$z||$r[$p]=$p$p>$z?:$r[$p]=$p
クリストフ

1
@Christoph私はOPに明確にするように頼みました。私に思い出させてくれてありがとう@。OPが応答すると編集します。
タイタス

1
@Christophはどちらも大丈夫そうです。そして、それは本当にウェザーかどう$p>$z||かは関係ありません$p<$z&&。説明に固執します。
タイタス

3

Brachylog、28バイト

h>.ḋ{p~c×ᵐ{=h7&l}ᵐobt≤~t?∧!}

ここでは、言語自体に改善の余地がたくさんあります。私が書いたものの多くは、言語の設計にいくつかの変更を加えることで明らかに改善できるように見えます。これは、現在のバージョンで見つけた最短の方法です。このプログラムをより効率的で、短く、読みやすくするために、Brachylogについていくつかの提案をすることができます。

とても、とても遅いです。TIOは、可能な限り単純な自明でない回答でもタイムアウトするため、TIOリンクを提供する意味はあまりありません。このプログラムをローカルで実行して検証しました。

これは(完全なプログラムではなく)関数であり、その出力は(リストではなく)ジェネレーターです。.w⊥最初の出力だけでなく、すべての出力を表示する場合は、関数の最後に追加します。(プログラムはTIOにとって遅すぎるので、とにかくローカルで実行する必要があり、ローカルBrachylogインタープリターはジェネレーターをうまく記述できるREPLで実行されるため、実際にはこれは実際には重要ではないことに注意してください。)

説明

h>.ḋ{p~c×ᵐ{=h7&l}ᵐobt≤~t?∧!}
  .                           The desired output is
h>                            a number less than the first input
   ḋ p                        such that taking its prime factors in some order,
      ~c                      partitioning them,
        ×ᵐ                    and taking the product of each partition
          {     }ᵐ            produces a number for which each digit
           =h7                is composed only of 7s
              &l              and for which the lengths of those numbers
                  o           are in sorted order
                    t         and the last element
                   b          (which is not also the first element)
                     ≤        is less than or equal to
                      ~t?     the last input.
                         ∧    (Delete an unwanted implicit constraint.)
   ḋ{                     !}  Output each number only once.


1

Pyth- 57 51 49 42バイト

FY}2eQKYJv*\7hQWJIqYJBW!%KJ=/KJ)=/JT)Iq1KY

それを試してみてください


2
PPCGへようこそ!多数のショートカットが用意されており、コードを大量に削減できます。詳細を知りたい場合は、チャットルームにアクセスしてpingを送信してください。
リーキー修道女

1
残念ながら、現在のプログラムは正しい結果を生成しません。つまり、現在の入力が含まれ7ている77ためです。
リーキー修道女

1
バイトを削減する方法は次のとおり使用mの代わりに、FまたはV(実行制御対関数型プログラミングなど); のhQ代わりに@Q0; のeQ代わりに@Q1; i*hQ]7T長いforループの代わりにを使用してを生成し777...7ます。
リーキー修道女

@LeakyNun提案とチャットルームのリンクに感謝します。また、修正しました。
マリア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.