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


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.