Сімдесят сім сьомих


19

Дано число nі верхній лімітний lсписок, числа, які можна створити множенням двох або більше чисел, що складаються лише з сімки довжини 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(якщо ви не можете впоратися з таким високим рівнем, зверніть увагу, чому - мовні обмеження прийнятні, лінь - ні). Це обмеження полягає в тому, щоб перешкоджати тим, хто хоче створити весь суперсет у пам'яті.
  5. Якщо TIO не може запуститися n=77для вашого коду, поясніть, які саме характеристики потрібно було досягти n=77.
  6. Щоб продукт був дійсним, він повинен складатися щонайменше з 2 номерів.
  7. Цей найнижчим числом байтів вважатиметься переможним.
  8. Ви можете вибрати список, який містить елементи, менші lабо менші / рівні l.
  9. БОНУС : Якщо ваш код рівно 77 байт, кудо від мене; нічого не знаю, я знаю.

У мене виникають проблеми при розборі "перерахуйте числа, які можна створити множенням двох чи більше чисел, що складаються лише із сьомої довжини nабо менше, ніж менше l"
xnor

Чи прийнятно виводити деякі цифри не один раз?
математика наркоман

Правило 5 досить безглуздо, чи буде наданий будь-який код n=77і l=7**7**7, наприклад?
Джонатан Аллан

1
Чи можна вважати, що результат не буде порожнім?
Тит

@JonathanAllan правда.
Чарівний восьминіг Урна

Відповіді:


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 байт, не міг.
Чарівна восьминога урна

@carusocomputing: Так, я вважаю, що 6 байт - це занадто багато, але я дійсно не можу побачити коротший шлях. Я сподівався, що ви
навчите

Я думав .pчи .sтеж, але навіть ті здаються довшими. Я випадково потрапив 'refresh' на сторінку TIO моїм прикладом реалізації замість запуску, видалив його з існування. Я думаю, це було 26, хоча.
Чарівна восьминога урна

1
@carusocomputing: Тому завжди слід регулярно натискати кнопку посилання. Не втрачайте нічого, оновлюючи або перезавантажуючи комп'ютер. Хоча трохи дратує
розкуту

7

Желе , 21 20 19 18 байт

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

Зауважте, що вихід не відповідає виходу ОП. Я залишив коментар.

Спробуйте в Інтернеті!

Як це працює

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 байт

Здійснює введення в синтаксис 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)

Тестові справи

Останній тестовий випадок може зайняти кілька секунд.


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.=72-х байт, які я знайшов. Я спочатку замислююся над твоїми двома пропозиціями. Ви пропускаєте :цикл у той час
Йорг Гюльсерманн

Я попросив ОП уточнити. В описі він розповідає про результати that are less than l, у своїх прикладах вони are less than or equal. Залежно від уточнення, $c>$l||.../ $c>$l?:...або $c<$l&&...є найкоротшими.
Тит


3

Піт , 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 байти, збережені Джоргом, 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=343Зрозуміло, що lслід включити. Тому заощаджень немає при використанні $p>$z||$r[$p]=$pабо $p>$z?:$r[$p]=$p.
Крістоф

1
@Christoph Я попросив OP уточнити. Дякую, що нагадали про мене @; буде редагувати, коли відповідь ОП.
Тит

1
@Christoph, здається, все в порядку; і це насправді не має значення $p>$z||ні $p<$z&&. Я дотримуюся опису.
Тит

3

Брахілог , 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! Є багато ярликів, які можуть скоротити ваш код на багато байтів. Ви можете зайти до нашої чатової кімнати і пінг мені, якщо хочете дізнатися більше.
Leaky Nun

1
На жаль, ваша поточна програма не дає правильних результатів, а саме, що вона включає 7і 77для вашого поточного введення.
Leaky Nun

1
Способи скорочення байтів включають: використання mзамість Fабо Vт.п. (функціональне програмування проти контролю виконання); використання hQзамість @Q0; використання eQзамість @Q1; використовуючи i*hQ]7Tзамість довгого циклу для генерації777...7 .
Leaky Nun

@LeakyNun Дякую за пропозиції та посилання в чаті. Також я це виправив.
Марія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.