Tujuh Puluh Tujuh Tujuh

19

Diberi nomor ndan ldaftar batas atas angka-angka yang dapat dibuat dengan mengalikan dua atau lebih angka yang terdiri dari hanya tujuh panjang natau kurang yang kurang dari l. A161145 dekat dengan tantangan ini, namun, Anda TIDAK akan menyertakan 7, 77, 777, 7777, 77777, dll.

Contohnya

n=anything, l<49 akan menghasilkan:

[]

n=1, l=49 akan menghasilkan:

7*7=49

f(1,49)=[49]

n=1, l=343 akan menghasilkan:

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

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

n=2,l=6000 akan menghasilkan:

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 akan menghasilkan:

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

Dll ...

Aturan

  1. Anda tidak perlu menampilkan langkah-langkah lanjutan, ini dilakukan untuk kejelasan.
  2. Output dapat berupa array atau dipisahkan oleh karakter apa pun (bahkan baris baru).
  3. Output harus dalam urutan numerik, terendah hingga tertinggi.
  4. Untuk membuat judul relevan, tertinggi nyang harus ditangani adalahn=77 (jika Anda tidak dapat menangani setinggi itu, perhatikan mengapa - pembatasan bahasa dapat diterima, kemalasan tidak). Keterbatasan ini untuk menghalangi mereka yang ingin membangun seluruh superset di memori.
  5. Jika TIO tidak dapat berjalan n=77untuk kode Anda, jelaskan spesifikasi apa yang diperlukan untuk mencapai n=77.
  6. Agar suatu produk valid, harus terdiri dari setidaknya 2 angka.
  7. Ini adalah byte-count terendah akan dianggap menang.
  8. Anda dapat memilih daftar yang berisi item kurang dari latau kurang dari / sama dengan l.
  9. BONUS : Jika kode Anda tepat 77 byte, pujian dari saya; tidak berharga, saya tahu.
Guci Gurita Ajaib
sumber
Saya mengalami masalah dalam menguraikan "daftar angka yang dapat dibuat dengan mengalikan dua atau lebih angka yang hanya terdiri dari tujuh kali panjang natau kurang yang kurang daril "
xnor
Apakah dapat diterima untuk menghasilkan beberapa angka lebih dari satu kali?
pecandu matematika
Aturan 5 tidak ada gunanya, apakah ada kode yang dijalankan n=77dan l=7**7**7, misalnya?
Jonathan Allan
1
Bisakah kita berasumsi bahwa hasilnya tidak akan kosong?
Titus
@ Jonathan. Semua benar.
Magic Gurita Guci

Jawaban:

1

05AB1E , 19 byte

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

Cobalah online!

Penjelasan

Sangat tidak efisien. TIO link berkinerjaceil(l^(1/7)) iterasi alih-alih literasi yang digunakan dalam versi golf untuk lebih mudah menguji testcases besar.

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
Emigna
sumber
$L7ׂ˜- Mencoba mendapatkan 5 byte, tidak bisa.
Magic Gurita Guci
@carusocomputing: Ya, saya merasa 6 byte terlalu banyak, tapi saya benar-benar tidak bisa melihat cara yang lebih pendek. Saya berharap Anda akan mengajari saya dengan cara yang lebih singkat;)
Emigna
Saya berpikir .patau .sterlalu, tetapi bahkan itu tampak lebih lama. Saya secara tidak sengaja menekan 'menyegarkan' pada halaman TIO dengan contoh implementasi saya alih-alih dijalankan, menghapusnya dari keberadaan. Saya pikir itu 26 tahun.
Magic Octopus Mmn
1
@carusocomputing: Itu sebabnya Anda harus selalu menekan tombol tautan secara teratur. Jangan kehilangan apa pun dengan menyegarkan atau menyalakan ulang komputer. Agak menjengkelkan untuk kehilangan sejarah :)
Emigna
7

Jelly , 21 20 19 18 byte

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

Perhatikan bahwa output tidak cocok dengan OP. Saya telah meninggalkan komentar.

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
6

Python 2 , 116 113 109 byte

n,l=input()
r=t={1}
exec't|={10**n/9*7};n-=n>1;r=r|{x*y for x in r for y in t if l/x/y};'*l
print sorted(r-t)

Perhatikan bahwa TIO tidak memiliki cukup memori untuk test case terakhir.

Cobalah online!

Dennis
sumber
4

JavaScript (ES6), 103 101 byte

Mengambil input dalam sintaks currying (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)

Uji kasus

Kasing uji terakhir mungkin membutuhkan beberapa detik untuk selesai.

Arnauld
sumber
4

PHP, 142 Bytes

$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 Bytes menghapus $r=[];dan mengganti sort($r);dengan@sort($r);

Versi Online

Diperluas

Fungsi rekursif membuat semua permutasi termasuk batas

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

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

Diperluas

satu loop sampai termasuk batas memeriksa setiap nilai yang dapat dibagi dengan 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);

Versi Online

beberapa byte lebih dan array asosiatif dapat dibuat kunci angka dan sebagai nilai array dari tujuh yang digunakan

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

Versi Online

Jörg Hülsermann
sumber
while($c=$t*$v[+$i++])$l<$c?f($c)&$r[$c]=$c;menghemat 3 byte; tapi seharusnya begitu $l<=$c. $r?sort($r)&print_r($r):0;bukannya $r=[];menyimpan satu.
Titus
1
$z.=7;lebih pendek 5 byte dari $z=$z*10+7;.
Titus
dan @lainnya 4 byte lebih pendek dari $r?...:0;. (Terima kasih @Christoph)
Titus
@Itus Mengapa harus begitu $l<=$c? Sepertinya kemarin bukan hari saya untuk $z.=7dan 2 Bytes tambahan yang saya temukan. Saya pertama-tama memikirkan dua saran Anda yang lain. Anda ketinggalan :dalam loop sementara
Jörg Hülsermann
Saya sudah meminta OP untuk mengklarifikasi. Dalam deskripsi dia berbicara tentang hasil that are less than l, dalam contohnya mereka are less than or equal. Bergantung pada klarifikasi, $c>$l||.../ $c>$l?:...atau $c<$l&&...yang terpendek.
Titus
4

Ruby, 89 86 byte

Solusi rekursif.

-3 byte dengan mengingat bahwa waktu apa pun 0 adalah 0.

f=->n,l,b=1{n*l>0?(f[n,l/k=eval(?7*n),b*k]+f[n-1,l,b]+(b>1&&l>=k ?[k*b]:[])).sort: []}

Cobalah online!

Nilai Tinta
sumber
3

Pyth , 22 byte

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

Cobalah online!

Spesifikasi

  • Memasukkan: l[newline]n
  • Keluaran: array containing the sorted result
Biarawati Bocor
sumber
3

PHP, 128 125 130 129 127 123 byte

akan bekerja hingga 22 7detik tetapi akan membulatkan nilai yang lebih besar (7 ** 23 adalah titik mengambang pada mesin 64 bit).

3 byte disimpan oleh Jörg, 3 oleh saya, 5 4 1 ditambahkan untuk menghindari peringatan untuk hasil kosong.

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

mengambil input dari argumen baris perintah; jalankan dengan -nratau coba online .

kerusakan

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
Titus
sumber
1
for([,$c,$z]=$argv,$n=1+$c;$c<$z;bukannyafor($n=1+$c=$argv[1];$c<$z=$argv[2];
Jörg Hülsermann
1
Gunakan @alih-alih $r&&untuk menekan peringatan? $p<$z&&$r[$p]=$p
Christoph
Saya hanya memperhatikan itu harus $p>$z?:$r[$p]=$pdari contoh n=1, l=343jelas bahwa lharus dimasukkan. Karenanya tidak ada penghematan saat menggunakan $p>$z||$r[$p]=$patau $p>$z?:$r[$p]=$p.
Christoph
1
@Christoph Saya meminta OP untuk mengklarifikasi. Terima kasih telah mengingatkan saya pada @; akan mengedit ketika OP membalas.
Titus
1
@Christoph keduanya tampaknya ok; dan itu tidak masalah apakah $p>$z||atau $p<$z&&. Saya akan tetap dengan deskripsi.
Titus
3

Brachylog , 28 byte

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

Ada banyak ruang untuk perbaikan dalam bahasa itu sendiri, di sini; beberapa hal yang saya tulis terlihat seperti mereka jelas akan diperbaiki dengan beberapa perubahan pada desain bahasa. Ini adalah cara terpendek yang saya temukan dengan versi saat ini. Saya mungkin membuat beberapa saran untuk Brachylog yang akan membuat program ini lebih efisien, lebih pendek, dan lebih mudah dibaca.

Sangat, sangat lambat; TIO mati bahkan pada jawaban nontrivial yang paling sederhana, jadi tidak ada gunanya menyediakan tautan TIO. Saya telah memverifikasi program ini dengan menjalankannya secara lokal.

Ini adalah fungsi (bukan program lengkap), yang outputnya adalah generator (bukan daftar). Tambahkan .w⊥ke akhir fungsi jika Anda ingin melihat semua output, bukan hanya yang pertama. (Perhatikan bahwa ini tidak terlalu penting dalam praktiknya, karena program ini terlalu lambat untuk TIO, Anda harus menjalankannya secara lokal, dan penerjemah Brachylog lokal beroperasi dalam REPL yang dapat menggambarkan generator dengan baik.)

Penjelasan

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.

sumber
2

Utilitas Bash + GNU, 108

seq -f3o%gp $2|dc|sed -r "/0|1{$1}/d;s/./&7/g;s/1//g;s/2/*/g;/[*]/!d;s/^/a=7/;s/$/;if(a<=$2)a;/"|bc|sort -un

Cobalah online . TIO membutuhkan waktu sekitar satu menit untuk testcase terakhir. Hasil saya cocok dengan @ Dennis.

Trauma Digital
sumber
1

Pyth - 57 51 49 42 byte

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

Cobalah

Maria
sumber
2
Selamat datang di PPCG! Ada banyak cara pintas yang tersedia, yang dapat mengurangi kode Anda dengan banyak byte. Anda dapat datang ke ruang obrolan kami dan menelepon saya jika Anda ingin tahu lebih banyak.
Leaky Nun
1
Sayangnya, program Anda saat ini tidak menghasilkan hasil yang benar, yaitu termasuk 7dan 77untuk input Anda saat ini.
Leaky Nun
1
Cara untuk mengurangi byte meliputi: menggunakan malih-alih Fatau Vdll. (Pemrograman fungsional vs. kontrol eksekusi); menggunakan hQbukannya @Q0; menggunakan eQbukannya @Q1; menggunakan i*hQ]7Talih-alih long-loop untuk menghasilkan 777...7.
Leaky Nun
@LeakyNun Terima kasih banyak atas saran dan tautan ruang obrolannya. Juga, saya memperbaikinya.
Maria