Czy dwie liczby zawierają unikalne silnie?

11

Podziel dwie liczby na ich silniki; jeśli są takie same, zwróć wartość falsey. W przeciwnym razie zwróć prawdziwą wartość. (zainspirowany tym ostatnim pytaniem )

Innymi słowy, zapisz każdą liczbę wejściową jako sumę silni (dodatnich liczb całkowitych) w najbardziej zachłanny sposób; zwracają wartość prawdy, jeśli w obu reprezentacjach nie występuje czynnik, w przeciwnym razie wartość falsey.

Przykład

Biorąc pod uwagę 20 i 49:

20 = 3! + 3! + 3! + 2!
49 = 4! + 4! + 1!

W obu reprezentacjach nie występuje silnia, więc zwróć prawdziwą wartość.

Biorąc pod uwagę 32 i 132:

132 = 5! + 3! + 3!
 32 = 4! + 3! + 2!

3! pojawia się w obu reprezentacjach, więc zwróć wartość falsey.

I / O

Wejście i wyjście może odbywać się dowolnymi standardowymi środkami .

Dane wejściowe zawsze będą dwie nieujemne liczby całkowite; żadna górna granica na tych liczbach całkowitych inna niż wymagana przez Twój język.

Dane wyjściowe powinny być zgodne z prawdą lub falsey . Wartości te niekoniecznie muszą być spójne dla różnych danych wejściowych, o ile każde dane wyjściowe są poprawnie zgodne z prawdą / falsey.

Przypadki testowe

Jeśli jedno wejście jest 0, odpowiedź zawsze będzie zgodna z prawdą. Inne prawdziwe przypadki testowe:

{6, 3}, {4, 61}, {73, 2}, {12, 1}, {240, 2}, {5, 264}, {2, 91}, {673, 18},
 {3, 12}, {72, 10}, {121, 26}, {127, 746}

Jeśli oba wejścia są nieparzystymi liczbami całkowitymi lub jeśli oba wejścia są tą samą dodatnią liczbą całkowitą, wówczas wyjście zawsze będzie falsey. Inne przypadki testowe Falsey:

{8, 5}, {7, 5}, {27, 47}, {53, 11}, {13, 123}, {75, 77}, {163, 160}, {148, 53},
 {225, 178}, {285, 169}, {39, 51}, {207, 334}, {153, 21}, {390, 128}, {506, 584},
 {626, 370}, {819, 354}

To jest , więc wygrywa najmniej bajtów!

Greg Martin
źródło
„zapisz każdą liczbę wejściową jako sumę silni (dodatnich liczb całkowitych) w możliwie najbardziej zachłanny”, czy nie masz na myśli najbardziej leniwego możliwego sposobu ?
user41805
4
@KritixiLithos no. Odnosi się do klasy algorytmów znanych jako algorytmy zachłanne, które działają poprzez maksymalizację niektórych parametrów po każdym kroku. Jak zawsze, zawsze biorąc tyle, ile mogą.
John Dvorak,

Odpowiedzi:

9

Galaretka , 7 bajtów

Æ!ṠḄ&/¬

Wypróbuj online!

Jak to działa

Æ!ṠḄ&/¬  Main link. Argument: (x, y) (pair of integers)

Æ!       Convert x and y to factorial base.
  Ṡ      Apply the sign function to each digit.
   Ḅ     Unbinary; convert each resulting Boolean array from base 2 to integer.
    &/   Reduce the resulting pair of integers by bitwise AND.
      ¬  Take the logical NOT of the result.
Dennis
źródło
Æ!wydaje się niesamowicie przydatny w niektórych scenariuszach.
Magic Octopus Urn
Czy można coś zyskać, próbując bezpośrednio pomnożyć elementarne listy bazowe bez przyjmowania znaków?
Greg Martin
@GregMartin Nie sądzę. Tablice cyfr musiałyby być wypełnione lub obcięte do tej samej długości, co prawdopodobnie będzie kosztować więcej bajtów niż oszczędza.
Dennis
3

Python 3 , 93 91 bajtów

lambda a,b:k(a)&k(b)=={0}
k=lambda t,n=1,a=1:{t}&{0}or a*n>t and{a-1}|k(t-n)or k(t,n*a,a+1)

Wypróbuj online!

ovs
źródło
3

Python 2 , 47 bajtów

h=lambda a,b,d=2:a<1or a%d*(b%d)<h(a/d,b/d,d+1)

Wypróbuj online!

xnor
źródło
Uwielbiam to rozwiązanie. Czy mógłbyś dodać adnotację przy odrobinie myślenia?
Chas Brown,
2

JavaScript (ES6), 71 bajtów

(a,b,g=(n,e=1,f=1)=>n>=f&&g(n,++e,f*e)+((n/f|0)%e&&1<<e))=>!(g(a)&g(b))

Liczby całkowite JavaScript są ograniczone do 53 bitów precyzji, co wystarcza na około 18 !; oznacza to, że mogę użyć maski 18 bitów, aby śledzić, które silnie są potrzebne.

Neil
źródło
2

PHP, 109 bajtów

for(;$a?:$a=$argv[++$i];$a-=$r[$i][]=$f,$i<2?:$t+=in_array($f,$r[1]))for($c=$f=1;($a/$f*=$c)>=++$c;);echo!$t;

Wypróbuj online!

Jörg Hülsermann
źródło
0

Mathematica, 73 bajty

F[x_]:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[F@#,F@#2]&

formularz wejściowy

[x1, x2]

J42161217
źródło
Dostaję kilka błędów testujących to ...
Scott Milner,
Po prostu wpisz na końcu [x1, x2]
J42161217
Ach Wprowadzałem listę zamiast dwóch oddzielnych liczb całkowitych. Możesz dalej grać w golfa ±x_:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[±#,±#2]&[4,61](69 bajtów). W kodowaniu ISO 8859-1 ±jest to jeden bajt.
Scott Milner,
0

C, 122 119 bajtów

G(q,i){return gamma(q+1)>i?gamma(q):G(q+1,i);}
Q(a,b,u,v){while(a&&b){a-=u=G(1,a);b-=v=G(1,b);if(a==b)exit();}exit(0);}

Qjest główną funkcją. Należy wywoływać z dokładnie dwiema dodatnimi liczbami całkowitymi. Nastąpi wyjście z przewozem z kodem wyjścia z 0za truthy i 1dla falsy.

Chociaż wydaje się, że to nie działa na TIO, działa w moim systemie z dostarczonym Homebrewgcc 7.1.0 .

Od Cdłuższego czasu nie grałem w golfa , więc wskazówki dotyczące gry w golfa są bardzo mile widziane!

R. Kap
źródło