Biorąc pod uwagę wartość x, znajdź najmniejszą wartość liczbową większą niż y, którą można pomnożyć i podzielić przez x , zachowując wszystkie oryginalne cyfry.
- Nowe liczby nie tracą cyfr.
- Nowe liczby nie zyskują cyfr.
Na przykład:
Dane wejściowe: x = 2, y = 250000
- Oryginał: 285714
- Rejon: 142857
- Mnożenie: 571428
To prawda, ponieważ 285714 jest większy niż y ; następnie podzielony przez x daje wynik w 142857 i pomnożony przez x daje wynik w 571428 . W obu testach obecne są wszystkie oryginalne cyfry z 285714 i nie dodano żadnych dodatkowych cyfr.
Zasady
- X powinno wynosić 2 lub 3, ponieważ obliczenie czegoś wyższego zajmuje zbyt dużo czasu.
- Y musi być liczbą całkowitą większą od zera .
- Najkrótszy kod wygrywa.
Przypadki testowe
Są to moje najczęstsze przypadki testowe, ponieważ są najszybsze do przetestowania.
- x = 2, y = 250000 = 285714
- x = 2, y = 290000 = 2589714
- x = 2, y = 3000000 = 20978514
- x = 3, y = 31000000 = 31046895
- x = 3, y = 290000000 = 301046895
Wyjaśnienia
- Rodzaj podziału nie ma znaczenia. Jeśli w jakiś sposób zdobędziesz 2,05, 0,25 i 5,20, poczuj się swobodnie.
Powodzenia wszystkim!
Odpowiedzi:
Łuska , 14 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
-
co było nie tak.Brachylog v2, 15 bajtów
Wypróbuj online!
Pobiera dane wejściowe w formularzu
[x,y]
.Wyjaśnienie
Komentarz
Pojawia się tutaj słabość Brachyloga w wielokrotnym wykorzystywaniu wielu wartości; ten program to prawie cała hydraulika i bardzo mało algorytmu.
Jako takie, może wydawać się wygodniejsze po prostu zakodować wartość y (w tym pytaniu jest komentarz, który zakłada, że 2 jest jedyną możliwą wartością). Istnieją jednak rozwiązania dla y = 3, co oznacza, że niestety hydraulika musi również obsługiwać wartość y . Najmniejszy, o którym wiem, to:
(Technika, której użyłem do znalezienia tej liczby, nie jest w pełni ogólna, więc możliwe jest, że istnieje mniejsze rozwiązanie wykorzystujące inne podejście.)
Jednak jest mało prawdopodobne, aby to sprawdzić w tym programie. Brachylog
p
jest napisany w bardzo ogólny sposób, który nie ma optymalizacji dla specjalnych przypadków (takich jak przypadek, w którym zarówno dane wejściowe, jak i wyjściowe są już znane, co oznacza, że można dokonać weryfikacji w O ( n log n ) poprzez sortowanie, a raczej niż O ( n !) dla podejścia opartego na brutalnej sile, którego, jak podejrzewam, używa). W związku z tym bardzo długo zajmuje sprawdzenie, czy 105263157894736842 jest permutacją 315789473684210526 (pozostawiłem ją uruchomioną od kilku minut bez wyraźnego postępu).(EDYCJA: Z tego powodu sprawdziłem źródło Brachylog. Okazuje się, że jeśli używasz
p
dwóch znanych liczb całkowitych, zastosowany algorytm generuje wszystkie możliwe kombinacje danej liczby całkowitej, dopóki nie znajdzie takiej, która jest równa wyjściowej liczbie całkowitej, jak algorytm to „wejście → pobudzane, permute pobudzone → przestarzałe, przestarzałe → wyjście”. Bardziej wydajnym algorytmem byłoby ustawienie relacji przestarzałe / wyjściowe w pierwszej kolejności , tak aby powrót do wewnątrz permutacji mógł wziąć pod uwagę, które cyfry były dostępne.)źródło
p
nie działapermutation/2
z dwiema znanymi listami, nawet jeśli podano dwie znane liczby całkowite jako argumenty; generuje wszystkie permutacje najbliższej liczby całkowitej (przy użyciupermutation/2
z jednej znanej listy), a następnie porównuje je na drugą liczbę całkowitą.Perl 6 , 56
54bajtówWypróbuj online!
Ciekawa alternatywa, obliczanie n * x k dla k = -1,0,1:
źródło
Czysty , 92 bajty
Wypróbuj online!
Dość proste. Wyjaśnienie już za chwilę.
źródło
q, 65 bajtów
Podziel liczbę na podstawie 10, posortuj rosnąco i sprawdź, czy jest równa. Jeśli nie, zwiększ y i idź ponownie
źródło
JavaScript (ES6),
767369 bajtówZaoszczędzono 3 bajty
eval()
, zgodnie z sugestią @ShieruAsakotoPobiera dane wejściowe jako
(x)(y)
.Wypróbuj online!
Wersja rekurencyjna miałaby 62 bajty , ale nie nadaje się tutaj dobrze ze względu na dużą liczbę wymaganych iteracji.
W jaki sposób?
Przykład:
Podczas dodawania dwóch tablic razem, każda z nich jest domyślnie przymuszana do łańcucha rozdzielanego przecinkami. Ostatnia cyfra pierwszej tablicy będzie bezpośrednio powiązana z pierwszą cyfrą drugiej tablicy bez przecinków, co czyni ten format jednoznacznym.
Przykład:
Ale:
Skomentował
źródło
x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):y
Może powodować przepełnienie stosu, jeśli y jest dalekie od rozwiązania.eval
:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
eval()
pomysł. Moja pierwsza próba była rzeczywiście rekurencyjna, ale poddałem się z powodu dużej liczby wymaganych iteracji.Haskell,
7674 bajtówDwa bajty wygolono dzięki komentarzowi Lynn
źródło
f
możesz być,f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0
ale następnie zdefiniowanie odpowiedzi jako operatora zapisuje dwa bajty:x!y=…
a następnie twoja odpowiedź brzmi(!)
:)Japt, 24 bajty
Dość naiwne rozwiązanie na kilka piw; Jestem pewien, że jest lepszy sposób.
Spróbuj
źródło
315789473684210526
to pierwsze rozwiązaniex=3
, JavaScript lub Japt nie mogą go poprawnie obliczyć, ponieważ nie mieszczą się w podwójnej precyzji.Python 2 , 69 bajtów
Wypróbuj online!
źródło
f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)
powinien działać, ale dość szybko osiąga limit rekurencji i nie wiem, co o tym mówią zasady PPCG.Galaretka ,
1413 bajtów-1 dzięki Erik the Outgolfer (`` używa make_digits, więc
D
nie było to wymagane)+2 naprawiając błąd (ponownie dzięki Erik the Outgolfer za zwrócenie uwagi na jeden problem)
Pełny program wypisujący wynik (jako diadadowy link powstaje lista o długości 1).
Wypróbuj online!
W jaki sposób?
Zauważ, że gdy podział nie jest dokładny, niejawna instrukcja dziesiętna (równoważna a
D
) zastosowana przed sortowaniem daje część ułamkową,np .:
1800÷3D
->[6,0,0]
while
1801÷3D
->[6.0,0.0,0.33333333333337123]
źródło
D
.>=
, zupełnie za tym tęskniłem! NieṢ
miałem pojęcia, że ustawiłem make_digits - dzięki. Będę musiał to naprawić i zaktualizować później ...Mathematica,
8274 bajty-8 bajtów dzięki tsh
Funkcja, która przyjmuje argumenty jako
[x,y]
. Skutecznie brute force wyszukiwania, która sprawdza czy posortowanej listy cyfry
,y/x
ixy
są takie same.Wypróbuj online!
źródło
x=3
, ale nie jestem pewien, czy to prawdax=2
.v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n]
,u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]
. Au-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])
ponieważ10^x-10^y=0 (mod 9)
zawsze ma.u-v=0 (mod 9)
zawsze trzyma. Jeśli jest zła odpowiedźw
, ponieważw*x-w=0 (mod 9)
iw-floor(w/x)=0 (mod 9)
: mamyfloor(w/x)=0 (mod 9)
. jeślifloor(w/x)*x <> w
,w-floor(w/x)*x>=9
ale ten konflikt z tym, żew-floor(w/x)*x<x
chociaż x może wynosić 2 lub 3.w=0 (mod 9)
wynika z tego,w*x-w=0 (mod 9)
żex-1
nie można go podzielić przez 3.IntegerQ
test, spowoduje to kilka błędów przy próbie wykonaniaIntegerDigits
ułamków, ale Mathematica nadal mija je i daje poprawną odpowiedź. Nie jestem pewien, czy błędy uwzględnione podczas obliczeń byłyby dozwolone, nawet jeśli ostateczna odpowiedź jest poprawna.APL (NARS), 490 znaków, 980 bajtów
test
Pomyślałem, że problemem jest ra dogodna liczba, która może się różnić, więc jedna ma 3 liczby r, r * x, r * x * x w ten sposób, że r zaczyna się od wartości, że r * x jest bliskie y (gdzie x i y są wejściami problemu przy użyciu tych samych liter, co główny post). Wykorzystałem spostrzeżenie, że jeśli pierwsza cyfra r jest d, to in r musi się też pojawić cyfry d * x i d * x * x, aby uczynić r (lub lepiej r * x) jednym rozwiązaniem.
źródło
05AB1E , 16 bajtów
Wypróbuj online. (UWAGA: Bardzo nieefektywne rozwiązanie, więc używaj danych wejściowych zbliżonych do wyniku. Działa to również w przypadku większych danych wejściowych, ale w przypadku TIO upłynie limit czasu po 60 sekundach).
Wyjaśnienie:
źródło