Семьдесят Семь Семерок


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 link выполняет 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слишком, но даже те, кажется, дольше. Я случайно нажал «обновить» на странице TIO с моей реализацией примера вместо запуска, удалил ее из существования. Я думаю, что было 26, хотя.
Волшебная урна осьминога

1
@carusocomputing: Вот почему вы всегда должны регулярно нажимать кнопку ссылки. Не теряйте ничего, обновляя или перезагружая компьютер. Немного раздражает потерять историю, хотя :)
Emigna

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

Принимает ввод в синтаксисе карри (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.=7и 2 дополнительных байта, которые я нашел. Сначала я подумываю над вашими двумя другими предложениями. Вы пропустите :время цикла
Йорг Хюльсерманн

Я попросил ОП уточнить. В описании он говорит о результатах 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];
Йорг Хюльсерманн

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
@ Кристоф Я попросил ОП уточнить. Спасибо, что напомнили мне о @; будет редактировать, когда OP отвечает.
Тит

1
@ Кристоф, кажется, оба в порядке; и это не имеет большого значения, $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! Есть много доступных ярлыков, которые могут сократить ваш код на много байтов. Вы можете прийти в наш чат и пинговать меня, если хотите узнать больше.
Утренняя монахиня

1
К сожалению, ваша текущая программа не дает правильных результатов, а именно, что она включает 7и 77для вашего текущего ввода.
Утренняя монахиня

1
Способы сокращения байтов включают: использование mвместо Fили Vи т. Д. (Функциональное программирование или контроль выполнения); используя hQвместо @Q0; используя eQвместо @Q1; используя i*hQ]7Tвместо длинного цикла for для генерации 777...7.
Утренняя монахиня

@LeakyNun Большое спасибо за предложения и ссылку на чат. Также я это исправил.
Мария,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.