เจ็ดสิบเจ็ดเซเว่น


19

รับจำนวนnและขีด จำกัด บนlรายการตัวเลขที่สามารถสร้างขึ้นได้โดยการคูณสองหรือมากกว่าตัวเลขประกอบด้วยสามัคคีเท่านั้นที่มีความยาวหรือน้อยกว่าที่น้อยกว่าn A161145อยู่ใกล้กับความท้าทายนี้อย่างไรก็ตามคุณจะไม่รวม 7, 77, 777, 7777, 77777, ฯลฯl

ตัวอย่าง

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(ถ้าคุณไม่สามารถจัดการเรื่องนั้นได้สูงให้สังเกตว่าเหตุใด - ข้อ จำกัด ทางภาษานั้นยอมรับได้ความขี้เกียจไม่ได้) ข้อ จำกัด นี้คือการขัดขวางผู้ที่ต้องการสร้าง superset ทั้งหมดในหน่วยความจำ
  5. หาก TIO ไม่สามารถเรียกใช้รหัสของคุณอธิบายรายละเอียดสิ่งที่ถูกต้องเพื่อให้บรรลุn=77n=77
  6. เพื่อให้ผลิตภัณฑ์มีผลใช้ได้ต้องประกอบด้วยตัวเลขอย่างน้อย 2 ตัว
  7. นี่คือการนับจำนวนไบต์ของต่ำที่สุดจะถือเป็นชัยชนะ
  8. คุณสามารถเลือกรายการที่จะมีรายการน้อยกว่าlหรือน้อยกว่า / lเท่ากับ
  9. โบนัส : หากรหัสของคุณคือ 77 ไบต์ขอชื่นชมจากฉัน ฉันรู้ว่าไร้ค่า

ฉันกำลังมีปัญหาในการแยกวิเคราะห์ "รายการตัวเลขที่สามารถสร้างขึ้นได้โดยการคูณสองหรือมากกว่านั้นซึ่งประกอบด้วยความยาวเพียงเจ็ดnหรือน้อยกว่านั้นน้อยกว่าl"
xnor

เป็นที่ยอมรับได้ไหมที่จะส่งออกตัวเลขมากกว่าหนึ่งครั้ง?
คณิตศาสตร์ junkie

กฎข้อที่ 5 นั้นไม่มีประโยชน์อะไรเลยรหัสใดจะถูกเรียกใช้n=77และl=7**7**7ตัวอย่างเช่น
Jonathan Allan

1
เราสามารถสันนิษฐานได้ว่าผลลัพธ์จะไม่ว่างเปล่า?
ติตัส

@JanathanAllan จริง
Magic Octopus Urn

คำตอบ:


1

05AB1E , 19 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ไม่มีประสิทธิภาพมาก ลิงก์ TIO ดำเนินการceil(l^(1/7))ทำซ้ำแทนการlทำซ้ำที่ใช้ในเวอร์ชัน golfed เพื่อทดสอบ testcase ขนาดใหญ่ได้ง่ายขึ้น

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 ไบต์ไม่ได้
Magic Octopus Urn

@carusocomputing: ใช่ฉันรู้สึกว่า 6 ไบต์มากเกินไป แต่ฉันไม่เห็นวิธีที่สั้นกว่านี้ ฉันหวังว่าคุณจะได้เรียนฉันด้วยวิธีที่สั้นกว่า;)
Emigna

ฉันกำลังคิด.pหรือ.sเกินไป แต่ก็ดูเหมือนนานกว่านั้น ฉันกด 'รีเฟรช' บนหน้า TIO โดยบังเอิญกับการใช้งานตัวอย่างแทนการใช้งานให้ลบออกจากการมีอยู่ ฉันคิดว่ามันเป็น 26
Magic Octopus Urn

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)จะเข้าในไวยากรณ์ currying

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 ไบต์ที่ฉันได้พบ ฉันกำลังคิดข้อเสนอแนะอีกสองข้อของคุณก่อน คุณคิดถึง:ห่วงในขณะที่
JörgHülsermann

ฉันขอให้ 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 บิต)

3 ไบต์บันทึกโดยJörg, 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];
JörgHülsermann

1
ใช้@แทนที่จะ$r&&ระงับคำเตือน? $p<$z&&$r[$p]=$p
Christoph

ฉันเพิ่งสังเกตเห็นว่ามันควรจะ$p>$z?:$r[$p]=$pมาจากตัวอย่างn=1, l=343เป็นที่ชัดเจนว่าlควรรวม ดังนั้นจึงไม่มีเงินฝากออมทรัพย์มีเมื่อใช้หรือ$p>$z||$r[$p]=$p $p>$z?:$r[$p]=$p
Christoph

1
@ Christoph ฉันขอให้ OP ชี้แจง ขอขอบคุณสำหรับการเตือนฉัน@; จะแก้ไขเมื่อ OP ตอบกลับ
ติตัส

1
@Christoph ทั้งคู่ดูเหมือนจะโอเค และมัน doesn't เรื่องจริงๆอากาศหรือ$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.

2

ยูทิลิตี 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

ลองมันออนไลน์ TIO ใช้เวลาประมาณหนึ่งนาทีสำหรับการทดสอบครั้งสุดท้าย ผลลัพธ์ของฉันตรงกับ @ Dennis


1

Pyth - 57 51 49 42 ไบต์

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

ลองมัน


2
ยินดีต้อนรับสู่ PPCG! มีทางลัดให้เลือกมากมายซึ่งสามารถลดรหัสของคุณลงได้เป็นจำนวนมาก คุณสามารถมาที่ห้องแชทของเราและ ping ฉันถ้าคุณต้องการทราบข้อมูลเพิ่มเติม
Leun Nun

1
น่าเสียดายที่โปรแกรมปัจจุบันของคุณไม่ได้สร้างผลลัพธ์ที่ถูกต้องนั่นคือมันมี7และ77สำหรับอินพุตปัจจุบันของคุณ
Leun Nun

1
วิธีในการลดจำนวนไบต์รวมถึง: การใช้mแทนFหรือVอื่น ๆ (การเขียนโปรแกรมการทำงานกับการควบคุมการดำเนินการ); ใช้hQแทน@Q0; ใช้eQแทน@Q1; ใช้แทนนานสำหรับวงที่จะสร้างi*hQ]7T777...7
Leun Nun

@LeakyNun ขอบคุณมากสำหรับคำแนะนำและลิงค์แชท นอกจากนี้ฉันแก้ไขมัน
มาเรีย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.