Bảy mươi bảy Sevens


19

Cho một số nvà một ldanh sách giới hạn trên, các số có thể được tạo bằng cách nhân hai hoặc nhiều số chỉ gồm bảy phần dài nhoặc nhỏ hơn số nhỏ hơn l. A161145 gần với thử thách này, tuy nhiên, bạn sẽ KHÔNG bao gồm 7, 77, 777, 7777, 77777, v.v.

Ví dụ

n=anything, l<49 sẽ dẫn đến:

[]

n=1, l=49 sẽ dẫn đến:

7*7=49

f(1,49)=[49]

n=1, l=343 sẽ dẫn đến:

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

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

n=2,l=6000 sẽ dẫn đến:

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 sẽ dẫn đến:

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

V.v ...

Quy tắc

  1. Bạn không phải xuất các bước trung gian, điều này đã được thực hiện cho rõ ràng.
  2. Đầu ra có thể là một mảng hoặc được phân tách bằng bất kỳ ký tự nào (thậm chí là dòng mới).
  3. Đầu ra phải theo thứ tự số, thấp nhất đến cao nhất.
  4. Để làm cho tiêu đề có liên quan, mức cao nhất nphải được xử lý là n=77(nếu bạn không thể xử lý mức cao đó, hãy lưu ý tại sao - giới hạn ngôn ngữ có thể chấp nhận được, sự lười biếng thì không). Hạn chế này là để cản trở những người đang tìm cách xây dựng toàn bộ superset trong bộ nhớ.
  5. Nếu TIO không thể chạy n=77cho mã của bạn, hãy giải thích những thông số kỹ thuật cần thiết để đạt được n=77.
  6. Để một sản phẩm có hiệu lực, nó phải bao gồm ít nhất 2 số.
  7. Đây là byte thấp nhất trong sẽ được coi là chiến thắng.
  8. Bạn có thể chọn danh sách để chứa các mục nhỏ hơn lhoặc nhỏ hơn / bằng l.
  9. THƯỞNG : Nếu mã của bạn chính xác là 77 byte, danh tiếng từ tôi; vô giá trị, tôi biết.

Tôi gặp sự cố khi phân tích cú pháp "liệt kê các số có thể được tạo bằng cách nhân hai hoặc nhiều số chỉ gồm bảy phần dài nhoặc nhỏ hơn l"
xnor

Có thể chấp nhận để có một số số đầu ra nhiều hơn một lần?
nghiện toán học

Quy tắc 5 là khá vô nghĩa, liệu có mã nào được chạy không , n=77l=7**7**7chẳng hạn?
Jonathan Allan

1
Chúng ta có thể cho rằng kết quả sẽ không trống?
Tít

@Jonathan Allan đúng.
Bạch tuộc ma thuật Urn

Câu trả lời:


1

05AB1E , 19 byte

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

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

Giải trình

Rất kém hiệu quả. Liên kết TIO thực hiện các ceil(l^(1/7))lần lặp thay vì các llần lặp được sử dụng trong phiên bản được đánh gôn để kiểm tra các bản thử nghiệm lớn dễ dàng hơn.

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ׂ˜- đã cố gắng để có được 5 byte, không thể.
Bạch tuộc ma thuật Urn

@carusocomputing: Vâng, tôi cảm thấy như 6 byte là quá nhiều, nhưng tôi thực sự không thể thấy một cách ngắn hơn. Tôi đã hy vọng bạn học tôi với một cách ngắn hơn;)
Emigna

Tôi đã suy nghĩ .phoặc .squá, nhưng ngay cả những người có vẻ lâu hơn. Tôi vô tình nhấn 'refresh' trên trang TIO với triển khai ví dụ của tôi thay vì chạy, xóa nó khỏi sự tồn tại. Tôi nghĩ rằng đó là 26 mặc dù.
Bạch tuộc ma thuật Urn

1
@carusocomputing: Đó là lý do tại sao bạn phải luôn nhấn nút liên kết thường xuyên. Đừng mất bất cứ thứ gì bằng cách làm mới hoặc khởi động lại máy tính. Một chút khó chịu để mất lịch sử mặc dù :)
Emigna

7

Thạch , 21 20 19 18 byte

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

Lưu ý rằng đầu ra không khớp với OP. Tôi đã để lại một bình luận.

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

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

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.

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)

Lưu ý rằng TIO không có đủ bộ nhớ cho trường hợp thử nghiệm cuối cùng.

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


4

JavaScript (ES6), 103 101 byte

Đưa đầu vào theo cú pháp 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)

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

Trường hợp thử nghiệm cuối cùng có thể mất vài giây để hoàn thành.


4

PHP, 142 byte

$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 Byte loại bỏ $r=[];và thay thế sort($r);bằng@sort($r);

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

Mở rộng

Hàm đệ quy làm cho tất cả các hoán vị bao gồm cả giới hạn

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

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

Mở rộng

một vòng lặp cho đến khi bao gồm giới hạn kiểm tra mọi giá trị chia hết cho 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);

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

thêm một vài byte và một mảng kết hợp có thể được tạo khóa số và như một giá trị của một mảng của bảy mươi được sử dụng

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

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


while($c=$t*$v[+$i++])$l<$c?f($c)&$r[$c]=$c;tiết kiệm 3 byte; nhưng nó phải là $l<=$c. $r?sort($r)&print_r($r):0;thay vì $r=[];tiết kiệm một.
Tít

1
$z.=7;ngắn hơn 5 byte $z=$z*10+7;.
Tít

@là 4 byte khác ngắn hơn $r?...:0;. (Cảm ơn @Christoph)
Tít

@Titus Tại sao phải như $l<=$cvậy? Có vẻ như ngày hôm qua không phải là ngày của tôi $z.=7và 2 byte bổ sung mà tôi đã tìm thấy. Tôi đang suy nghĩ đầu tiên về hai đề nghị khác của bạn. Bạn bỏ lỡ :vòng lặp while
Jörg Hülsermann

Tôi đã yêu cầu OP làm rõ. Trong phần mô tả, ông nói về kết quả that are less than l, trong ví dụ của họ, họ are less than or equal. Tùy thuộc vào sự làm rõ, $c>$l||.../ $c>$l?:...hoặc $c<$l&&...là ngắn nhất.
Tít

4

Ruby, 89 86 byte

Một giải pháp đệ quy.

-3 byte bằng cách nhớ rằng bất cứ điều gì lần 0 là 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: []}

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


3

Bình thường , 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

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

Thông số kỹ thuật

  • Đầu vào: l[newline]n
  • Đầu ra: array containing the sorted result

3

PHP, 128 125 130 129 127 123 byte

sẽ hoạt động tối đa 22 7giây nhưng sẽ làm tròn các giá trị lớn hơn (7 ** 23 là điểm nổi trên máy 64 bit).

3 byte được lưu bởi Jörg, 3 bởi tôi, 5 4 1 được thêm vào để tránh cảnh báo cho kết quả trống.

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

lấy đầu vào từ các đối số dòng lệnh; chạy với -nrhoặc thử trực tuyến .

phá vỡ

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;thay vìfor($n=1+$c=$argv[1];$c<$z=$argv[2];
Jörg Hülsermann

1
Sử dụng @thay vì $r&&để đàn áp cảnh báo? $p<$z&&$r[$p]=$p
Christoph

Tôi chỉ nhận thấy nó nên $p>$z?:$r[$p]=$ptừ ví dụ n=1, l=343rõ ràng là lnên được đưa vào. Do đó không có tiết kiệm ở đó khi sử dụng $p>$z||$r[$p]=$phoặc $p>$z?:$r[$p]=$p.
Christoph

1
@Christoph Mình nhờ OP làm rõ. Cảm ơn đã nhắc nhở tôi về @; sẽ chỉnh sửa khi OP trả lời.
Tít

1
@Christoph cả hai đều ổn; và nó không thực sự quan trọng với thời tiết $p>$z||hay $p<$z&&. Tôi gắn bó với mô tả.
Tít

3

Brachylog , 28 byte

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

Ở đây có rất nhiều phạm vi để cải thiện ngôn ngữ; một vài điều tôi đã viết trông giống như chúng rõ ràng là có thể ứng biến được với một số thay đổi trong thiết kế của ngôn ngữ. Đây là cách ngắn nhất tôi tìm thấy với phiên bản hiện tại. Tôi cũng có thể đưa ra một số gợi ý cho Brachylog để chương trình này hiệu quả hơn, ngắn hơn và dễ đọc hơn.

Rất, rất chậm; TIO loại bỏ ngay cả câu trả lời không cần thiết đơn giản nhất có thể, do đó không có nhiều điểm trong việc cung cấp liên kết TIO. Tôi đã xác minh chương trình này bằng cách chạy nó cục bộ.

Đây là một chức năng (không phải là một chương trình đầy đủ), có đầu ra là một trình tạo (trái ngược với danh sách). Thêm .w⊥vào cuối chức năng nếu bạn muốn xem tất cả các đầu ra, thay vì chỉ đầu tiên. (Lưu ý rằng điều này không thực sự quan trọng trong thực tế, vì dù sao chương trình quá chậm đối với TIO, bạn phải chạy nó cục bộ và trình thông dịch Brachylog cục bộ chạy trong REPL có thể mô tả một trình tạo tốt.)

Giải trình

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 byte

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

Thử nó


2
Chào mừng đến với PPCG! Có rất nhiều phím tắt có sẵn, có thể cắt giảm mã của bạn bằng rất nhiều byte. Bạn có thể đến phòng chat của chúng tôi và ping tôi nếu bạn muốn biết thêm.
Leaky Nun

1
Thật không may, chương trình hiện tại của bạn không tạo ra kết quả chính xác, cụ thể là nó bao gồm 777cho đầu vào hiện tại của bạn.
Leaky Nun

1
Các cách để cắt giảm byte bao gồm: sử dụng mthay vì Fhoặc Vvv (lập trình chức năng so với điều khiển thực thi); sử dụng hQthay vì @Q0; sử dụng eQthay vì @Q1; sử dụng i*hQ]7Tthay vì vòng lặp for dài để tạo 777...7.
Leaky Nun

@LeakyNun Cảm ơn rất nhiều về các đề xuất và liên kết phòng chat. Ngoài ra, tôi đã sửa nó.
Maria
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.