Siedemdziesiąt siedem siódemek


19

Biorąc pod uwagę liczbę ni llistę górnego limitu, liczby, które można utworzyć, mnożąc dwie lub więcej liczb składających się wyłącznie z siódemek o długości nlub mniejszej, które są mniejsze niż l. A161145 jest bliski temu wyzwaniu, jednak NIE będzie zawierać 7, 77, 777, 7777, 77777 itp.

Przykłady

n=anything, l<49 spowodowałoby:

[]

n=1, l=49 spowodowałoby:

7*7=49

f(1,49)=[49]

n=1, l=343 spowodowałoby:

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

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

n=2,l=6000 spowodowałoby:

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 spowodowałoby:

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

Itp...

Zasady

  1. Ci nie muszą wyjściowych etapów pośrednich, zrobiono to dla jasności.
  2. Dane wyjściowe mogą być w postaci tablicy lub być oddzielone dowolnym znakiem (nawet znakiem nowej linii).
  3. Dane wyjściowe muszą być uporządkowane numerycznie, od najniższej do najwyższej.
  4. Aby tytuł był odpowiedni, najwyższy, z nktórym trzeba sobie poradzić, ton=77 poradzić, (jeśli nie możesz sobie z tym poradzić, zauważ, dlaczego - ograniczenia językowe są dopuszczalne, lenistwo nie). Ograniczenie to ma utrudnić tym, którzy chcą zbudować cały superset w pamięci.
  5. Jeśli TIO nie może działać n=77dla Twojego kodu, wyjaśnij, jakie specyfikacje były wymagane do osiągnięcia n=77.
  6. Aby produkt był ważny, musi składać się z co najmniej 2 cyfr.
  7. To jest najniższa liczba bajtów zostanie uznana za zwycięską.
  8. Możesz wybrać listę, aby zawierała pozycje mniejsze llub mniejsze niż / równe l.
  9. BONUS : Jeśli twój kod ma dokładnie 77 bajtów, ode mnie odznaczenia; bezwartościowe, wiem.

Mam problem z analizą składni „wymień liczby, które można utworzyć, mnożąc dwie lub więcej liczb składających się wyłącznie z siódemek o długości nlub mniejszej, które są mniejsze niż l
xnor

Czy dopuszczalne jest wyświetlanie niektórych liczb więcej niż jeden raz?
ćpun matematyki

Zasada 5 jest całkiem pozbawione sensu, każdy bieg będzie podany kod n=77i l=7**7**7, na przykład?
Jonathan Allan,

1
Czy możemy założyć, że wynik nie będzie pusty?
Tytus

@JonathanAllan true.
Magic Octopus Urn

Odpowiedzi:


1

05AB1E , 19 bajtów

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

Wypróbuj online!

Wyjaśnienie

Bardzo nieefektywne. Łącze TIO wykonuje ceil(l^(1/7))iteracje zamiast literacji używanych w wersji golfowej, aby łatwiej testować duże przypadki testowe.

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ׂ˜- próbował uzyskać 5 bajtów, nie mógł.
Magic Octopus Urn

@carusocomputing: Tak, wydaje mi się, że 6 bajtów to za dużo, ale naprawdę nie widzę krótszej drogi. Miałem nadzieję, że uczysz mnie krótszą drogą;)
Emigna,

Myślałam .plub .steż, ale nawet te wydają się dłuższe. Przypadkowo włączyłem „odświeżanie” na stronie TIO moją przykładową implementacją zamiast uruchomić, usunąłem ją z istnienia. Myślę, że było 26.
Magic Octopus Urn

1
@carusocomputing: Dlatego zawsze powinieneś regularnie naciskać przycisk linku. Nie trać niczego, odświeżając lub ponownie uruchamiając komputer. Trochę denerwująca jest jednak
utrata

7

Galaretka , 21 20 19 18 bajtów

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

Zauważ, że wyjście nie pasuje do OP. Zostawiłem komentarz.

Wypróbuj online!

Jak to działa

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 bajtów

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)

Zauważ, że TIO nie ma wystarczającej ilości pamięci dla ostatniego przypadku testowego.

Wypróbuj online!


4

JavaScript (ES6), 103 101 bajtów

Pobiera dane wejściowe w składni curry (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)

Przypadki testowe

Wykonanie ostatniego przypadku testowego może potrwać kilka sekund.


4

PHP, 142 bajtów

$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 Usuwanie $r=[];i zastępowanie bajtówsort($r); z@sort($r);

Wersja online

Rozszerzony

Funkcja rekurencyjna wykonuje wszystkie permutacje, w tym limit

$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 bajtów

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

Rozszerzony

pętla do momentu włączenia limitu sprawdza każdą wartość podzielną przez 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);

Wersja online

kilka bajtów więcej i można utworzyć tablicę asocjacyjną, kluczując liczbę i jako wartość tablicę używanych siódemek

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

Wersja online


while($c=$t*$v[+$i++])$l<$c?f($c)&$r[$c]=$c;oszczędza 3 bajty; ale powinno być $l<=$c. $r?sort($r)&print_r($r):0;zamiast $r=[];ratuje jeden.
Tytus

1
$z.=7;jest o 5 bajtów krótszy niż $z=$z*10+7;.
Tytus

i @jest o kolejne 4 bajty krótszy niż $r?...:0;. (Dzięki @Christoph)
Tytus

@Titus Dlaczego tak powinno być $l<=$c? Wydaje się, że wczoraj nie był mój dzień dla $z.=7dodatkowych 2 bajtów, które znalazłem. Zastanawiam się nad twoimi dwoma pozostałymi sugestiami. Brakuje Ci :pętli while
Jörg Hülsermann

Poprosiłem PO o wyjaśnienie. W opisie mówi o wynikach that are less than l, w swoich przykładach one are less than or equal. W zależności od wyjaśnienia, $c>$l||.../ $c>$l?:...lub $c<$l&&...są najkrótsze.
Tytus

4

Rubin, 89 86 bajtów

Rozwiązanie rekurencyjne.

-3 bajty, pamiętając, że cokolwiek razy 0 to 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: []}

Wypróbuj online!


3

Pyth , 22 bajty

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

Wypróbuj online!

Okular

  • Wejście: l[newline]n
  • Wynik: array containing the sorted result

3

PHP, 128 125 130 129 127 123 bajtów

będzie działać do 22 7sekund, ale zaokrągli większe wartości (7 ** 23 jest zmiennoprzecinkowe na komputerze 64-bitowym).

3 bajty zapisane przez Jörga, 3 przeze mnie, 5 4 1 dodane, aby uniknąć ostrzeżenia o pustych wynikach.

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

pobiera dane wejściowe z argumentów wiersza poleceń; uruchom -nrlub wypróbuj online .

awaria

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

1
Używać @zamiast $r&&tłumić ostrzeżenie? $p<$z&&$r[$p]=$p
Christoph

Właśnie zauważyłem, że powinno to wynikać $p>$z?:$r[$p]=$pz przykładu, n=1, l=343który jasno lnależy uwzględnić. Dlatego nie ma tam żadnych oszczędności podczas używania $p>$z||$r[$p]=$plub $p>$z?:$r[$p]=$p.
Christoph

1
@Christoph Poprosiłem OP o wyjaśnienie. Dziękuję za przypomnienie @; będzie edytować, gdy OP odpowie.
Tytus

1
@Christoph wydaje się być w porządku; i to naprawdę nie ma znaczenia, $p>$z||czy $p<$z&&. Pozostanę przy opisie.
Tytus

3

Brachylog , 28 bajtów

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

Tutaj jest wiele możliwości ulepszenia samego języka; całkiem sporo rzeczy, które napisałem, wyglądają, jakby można je było poprawić po wprowadzeniu pewnych zmian w projekcie języka. To najkrótszy sposób, jaki znalazłem w obecnej wersji. Mogę przedstawić kilka sugestii dotyczących Brachylog, dzięki którym ten program byłby bardziej wydajny, krótszy i bardziej czytelny.

Bardzo, bardzo wolny; TIO przekracza limit czasu nawet na najprostszą możliwą nietrywialną odpowiedź, więc nie ma sensu udostępniać łącza TIO. Ten program zweryfikowałem, uruchamiając go lokalnie.

Jest to funkcja (nie pełny program), której wyjściem jest generator (w przeciwieństwie do listy). Dodaj .w⊥na końcu funkcji, jeśli chcesz zobaczyć wszystkie wyjścia, a nie tylko pierwsze. (Zauważ, że tak naprawdę nie ma to znaczenia w praktyce, ponieważ ponieważ program i tak jest zbyt wolny dla TIO, musisz uruchomić go lokalnie, a lokalny interpreter Brachylog działa w REPL, co może dobrze opisać generator).

Wyjaśnienie

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 bajtów

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

Spróbuj


2
Witamy w PPCG! Dostępnych jest wiele skrótów, które mogą zmniejszyć kod o wiele bajtów. Możesz przyjść do naszego pokoju rozmów i pingować mnie, jeśli chcesz dowiedzieć się więcej.
Leaky Nun

1
Niestety, twój obecny program nie generuje poprawnych wyników, a mianowicie, że zawiera 7i 77dla twoich bieżących danych wejściowych.
Leaky Nun

1
Sposoby na zmniejszenie bajtów obejmują: używanie mzamiast Flub Vitp. (Programowanie funkcjonalne vs. kontrola wykonania); za pomocą hQzamiast @Q0; za pomocą eQzamiast @Q1; stosując i*hQ]7Tzamiast długiej pętli for prowadzą do wytworzenia 777...7.
Leaky Nun

@LeakyNun Dziękuję bardzo za sugestie i link do pokoju czatu. Naprawiłem to.
Maria
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.