Biorąc pod uwagę liczbę n (0 <= n <= 2642245), sprawdź, czy n i n 3 mają ten sam zestaw cyfr, i odpowiednio wypisz wartość prawdy lub fałszu.
Na przykład sprawdźmy liczbę 100.
100 3 to 1000000.
Zestaw cyfr w 100 to {0, 1}.
Zestaw cyfr w 1000000 to {0, 1}.
Dlatego 100 powinno dać prawdziwą wartość.
Przypadki testowe
0 -> True
1 -> True
10 -> True
107624 -> True
251894 -> True
251895 -> False
102343 -> False
Pamiętaj, to jest kodowanie w golfa , więc wygrywa kod z najmniejszą liczbą bajtów.
code-golf
number
decision-problem
Oliver Ni
źródło
źródło
2103869 -> True
. Ten (lub większy) jest niezbędny do przetestowania języka zlong
typem danych.Odpowiedzi:
Python 3,
3632 bajtówMyślę, że działa to tylko w Pythonie 3.5 i nowszych. Cztery bajty zniknęły dzięki Copper.
źródło
set(`x`)
2097152
(sys.maxint**(1/3.)
) i mniejsze niżsys.maxint+1
zostaną zwrócone,False
jeśli użyjeszrepr()
. repl.it/EXs2/1 . Długie mająL
na końcu.lambda x:{*str(x)}=={*str(x**3)}
w Python 3.5+.==
przez^
. Dwa równe zestawy prowadzą do{}
fałszu.05AB1E , 6 bajtów
05AB1E wykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
źródło
C, 73 bajty
Tworzy zestaw za pomocą bitów. Zwraca ten
0
sam zestaw, wszystko inne dla różnych zestawów.Nie golfowany:
źródło
1 <<
Podczas ustawiania bitów brakuje kodu bez golfak |= 1 << i % 10
. Świetne rozwiązanie!0
za prawdę? Myślę, żestrcmp
działa w ten sposób, więc wydaje się rozsądne w C.int
większe niż 64-bit. (Nawet podpisany 64-bitowy nie wystarczy, ale niepodpisany 64-bitowy jest). Więc nie ma żadnych rzeczywistych implementacji języka C, o których wiem, że spełnia to wymagania pytania. (Działa poprawnie zunsigned long long
lub tylkounsigned long
w implementacjach, w których jest to typ 64-bitowy). GNU C definiuje__int128_t
na komputerach 64-bitowych (bez żadnych nagłówków) ...Perl, 31 + 2 (
-pl
flaga) =2521183433 bajtówZa pomocą:
Wyjście:
1\n
lub0\n
.Dzięki za @Dada za 3 bajty, Gabriel Benamy za 1 bajt i @Zaid za zgłoszenia błędów.
źródło
perl -pe '$_=$_**3!~/[^$_]/'
10
:(-l
potrzebna flaga.&&
a,*
aby zapisać bajtMathematica, 34 bajty
Implementacja bezpośrednia (nienazwana funkcja jednego argumentu całkowitego).
źródło
Galaretka , 8 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
CJam, 8 bajtów
Zestaw testowy.
Wyjaśnienie
źródło
JavaScript ES6,
5551 bajtówDzięki Downgoat za 3 bajty! Możesz zapisać bajt, konwertując na ES7 i używając
n**3
zamiastn*n*n
.Wystarczająco proste.
źródło
==
nie działa nawet na tablicach.n*n*n
nan**3
, ale myślę, że może to być ES7, a nie ES6.2103869
, a problem wyraźnie wymaga rozwiązania2642245
.C #,
241208205201193233222220212203177159 bajtów (109 na przemian)Lambda muszą w szczególności używać
ulong
typu:Dzięki @Corak i @Dennis_E za zapisanie niektórych bajtów oraz @TimmyD za znalezienie problemu z moim oryginalnym rozwiązaniem. Dzięki @SaxxonPike za wskazanie problemu długiego / długiego / dziesiętnego / etc (który faktycznie zaoszczędził mi również trochę bajtów).
Istnieje również 109-bajtowe rozwiązanie wykorzystujące HashSets, podobne do odpowiedzi w Javie tutaj, ale zamierzam trzymać się mojego oryginalnego rozwiązania dla mojego wyniku.
źródło
p<0
zamiastp==1
?n=>{Func<string,int[]>x=s=>{var a=new int[10];foreach(var c in s)a[int.Parse(c+"")]++;return a;};var i=x(n);var j=x((long)Math.Pow(int.Parse(n),3)+"");for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};
int.Parse(c+"")
przezc-'0'
long
zamiast,ulong
a ten przypadek testowy korzysta z MSB.)Java 8, 154 znaków
Nazywany tak:
Wyjścia:
Bardzo 8-letnia odpowiedź w języku Java, wykorzystująca zarówno lambda, jak i strumienie, w tym niektóre fantazyjne konwersje liczb na ciągi.
Niestety musimy użyć
BigInteger.pow(3)
zamiastMath.pow(a,3)
Math.pow z użyciem nieprecyzyjnych podwójnych, które zwracają niepoprawne wartości z dużymi liczbami (zaczynając od2103869
).źródło
static Y y
dziwna składnia inicjalizacyjna, czy automatycznie się do niej przypisuje,y.n
ponieważ interfejs ma dokładnie jednego członka?@FunctionalInterface
adnotację (interfejs z tylko jedną metodą, patrz javadoc), która sprawia, że lambdas działa zamiast zwykłej instancji typu anonimowego.Y y = new Y() { @Override public boolean n(int x) { return Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray()); } }
astatic
modyfikator jest tylko tam, aby umożliwić wywołaniey.n(int)
ze statycznej metody głównej.GRZMOTNĄĆ,
69, 59 bajtówAKTUALIZACJA
Innym dobrym sposobem na zrobienie tego w bashu jest użycie tr (62 bajtów, ale prawdopodobnie może być ściśnięty nieco więcej)
EDYCJA: Jeszcze więcej optymalizacji (Thx! @Manatwork)
Grał w golfa
Test
0 - dla sukcesu (kod wyjścia) 1 - dla niepowodzenia (kod wyjścia)
źródło
T <<< 11
. Powie, że zestawy cyfr są takie same tylko dlatego, że 11 ** 3 == 1331 zawiera cyfry nieobecne w oryginalnym numerze dwa razy.-w
wyraźnie to dodałeśfold
. Jeśliuniq
jest używany bez opcji,sort -u
może go zastąpić. I nakarm drugie wezwanie S. ciągiem tutaj. I myślę, że nie ma potrzeby cytowania przekazanej formułybc
.cmp
zamiastdiff
i zapisać 1 bajt.funkcja kodu maszynowego x86-64, 40 bajtów.
Lub 37 bajtów, jeśli 0 kontra niezerowe jest dozwolone jako „prawda”, np. Strcmp.
Dzięki odpowiedzi C Karla Napfa na pomysł na mapę bitową, który x86 może bardzo skutecznie zrobić z BTS .
Podpis funkcji:
_Bool cube_digits_same(uint64_t n);
przy użyciu ABI x86-64 System V. (n
w RDI: logiczna wartość zwracana (0 lub 1) w AL)._Bool
jest zdefiniowany przez ISO C11 i jest zwykle używany#include <stdbool.h>
do definiowaniabool
przy użyciu tej samej semantyki co C ++bool
.Potencjalne oszczędności:
Wszystkie te są możliwe, jeśli byłby to fragment wbudowanego asm zamiast funkcji, co dałoby 35 bajtów dla wbudowanego asm .
PĘTLA wydaje się najmniejszym sposobem powtórzenia raz. Patrzyłem również na powtórzenie pętli (bez prefiksów REX i innego rejestru bitmap), ale to nieco większe. Próbowałem także użyć PUSH RSI i użyć
test spl, 0xf
/jz
do zapętlenia raz (ponieważ ABI wymaga, aby RSP był wyrównany 16B przed CALL, więc jeden push wyrównuje go, a drugi ponownie wyrównuje). Nie matest r32, imm8
kodowania, więc najmniejszym sposobem była instrukcja 4B TEST (w tym prefiks REX), aby przetestować tylko niski bajt RSP na imm8. Taki sam rozmiar jak LEA + PĘTLA, ale wymagane są dodatkowe instrukcje PUSH / POP.Przetestowano dla wszystkich nw zakresie testowym vs. implementacja C steadyboksa (ponieważ używa innego algorytmu). W dwóch przypadkach różnych wyników, na które patrzyłem, mój kod był poprawny, a kod steadyboksa był niepoprawny. Myślę, że mój kod jest poprawny dla wszystkich n.
Jedyne drukowane linie mają c = 1 asm = 0: fałszywie dodatnie dla algorytmu C.
Przetestowano również pod kątem
uint64_t
implementacji tego samego algorytmu w wersji C Karla, a wyniki są zgodne dla wszystkich danych wejściowych.źródło
objdump -drwC -Mintel
pliku obiektowego i skopiowania komentarzy). Jest to język, w którym optymalizacja pod kątem rozmiaru kodu jest w rzeczywistości przydatna w prawdziwym życiu. (Ale nawet wtedy, tylko w rzadkich przypadkach, takich jak programy ładujące lub wersje demonstracyjne. Zwykle warto oszczędzać rozmiar kodu, gdy nie wpływa to negatywnie na wydajność w już buforowanej skrzynce, ale wtedy przydatne jest unikanie wąskich gardeł dekodowania + brakujących pamięci podręcznej)Haskell, 47 bajtów
Bardzo wolno. Przetestuj za pomocą
c<-['0'..'9']
.Testuje każdy znak pod kątem włączenia do reprezentacji ciągu
n
i tworzy listę tych zawartych. Podobnien^3
sprawdza i sprawdza, czy listy są równe.źródło
nub
(zdobądź unikalne elementy) isort
, ale oba wymagają długiego importuimport Data.List
. Nawet tak, chodzi bardzo blisko po 48 bajtów:import Data.List;q=sort.nub.show;f n=q n==q(n^3)
.nub
zachowuje porządek przy pierwszym pojawieniu się, tjnub [3,1,3,2,1,2] == [3,1,2]
. Nie jest konwertowany na typ zestawu (nie ma żadnego), ale podaje listę.Dyalog APL , 10 bajtów
⍕≡
to reprezentacja tekstowa argumentu identyczna z⍕∪
związek reprezentacji tekstu argumentu i(⍕*∘3)
tekstowa reprezentacja argumentu w kostce?Wypróbuj APL online!
Uwaga: W przypadku dużych liczb ustaw
⎕PP←34 ⋄ ⎕FR←1287
(34 cyfry znaczące, 128-bitowe zmiennoprzecinkowe)źródło
Clojure, 35 bajtów
źródło
Java 7,
185178 znakówZadzwoń jako:
Wynik:
(Nigdy nie jestem pewien, czy muszę liczyć również import i definicje metod ... Widziałem obie strony. Sam kod miałby jednak tylko 141 bajtów).
źródło
static
.static
.Galaretka , 8 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
*3ṢQ⁼ṢQ$
działa zgodnie z przeznaczeniem, ponieważ szybkie$
grupuje dwa atomy po jego lewej stronie w monadyczny łańcuch.Pyth, 10 bajtów
Ponieważ nie mamy wystarczającej różnorodności z pytaniami, dodajmy nie jedną, ale dwie kolejne! Oba mają 10 bajtów i zostały przetestowane
106239
jako przykładowe dane wejściowe (których niektóre inne odpowiedzi zawiodły).Wyjaśnienie:
Wypróbuj pierwszą odpowiedź za pomocą internetowego zestawu testów.
Druga odpowiedź:
Wyjaśnienie:
Wypróbuj drugą odpowiedź, korzystając z internetowego zestawu testów.
źródło
Kotlin: 46/88/96 bajtów
Pytanie nie określa, skąd pochodzi dane wejściowe, więc oto typowe 3 źródła danych wejściowych.
Funkcja: 46 bajtów
main () przy użyciu argumentu pierwszego programu: 88 bajtów
fun main(a:Array<String>){val i=a[0].toLong();println("$i".toSet()=="${i*i*i}".toSet())}
main () przy użyciu standardowego wejścia: 96 bajtów
fun main(a:Array<String>){val i=readLine()!!.toLong();println("$i".toSet()=="${i*i*i}".toSet())}
źródło
Haskell,
5452 bajtyDzięki @Laikoni za zapisanie dwóch bajtów.
źródło
a%b=all(
elema)b
jako funkcji, a następnie wywołanie za pomocąb%a&&a%b
powinno zaoszczędzić dwa bajty.JavaScript (ES6), 44 bajty
Port doskonałej odpowiedzi C w KarlNapf. ES7 zapisuje bajt przez
n**3
. Działa tylko do 208063 z powodu ograniczonej precyzji liczbowej JavaScript; jeśli potrzebujesz go tylko do pracy do 1290, możesz zapisać kolejny bajt.źródło
Perl 6 , 22 bajtów
Rozszerzony:
Różnica Symetryczny Zestaw 「⊖」 zwraca pusty Zestaw, jeśli obie strony są równoważnymi Zestawami (automatycznie zamienia listę w Zestaw). W tym momencie pozostaje tylko odwrócić to logicznie.
źródło
$_
just.
C ++, 82 bajty
Funkcja t (a) zwraca odpowiedź. Używa int jako zestawu. Ładnie wydrukowane:
źródło
#include<set>
iusing namespace std;
w golfed kodu bajtowego i liczenia#include<set>
zamiastalgorithm
R,
657970 bajtówBierze
n
ze standardowego wejścia, rozdzielan
in^3
do jednej cyfry i porównuje dwa zestawy. Używagmp
pakietu do obsługi dużych liczb całkowitych (dzięki Billywob za wskazanie tej wady). Teraz używasubstring
cięcian
in^3
dzięki @MickyT za sugestię. (Poprzednie wersje używanescan
igsub
hacky).źródło
n
), chyba że użyjesz jakiegoś pakietu BigInt. Zobacz?.Machine
szczegóły na temat największej liczby całkowitej i zmiennoprzecinkowej itp. Aby zobaczyć to porównanie, np.2600001^3
W R do wolframalphagmp
pakiet może rozwiązać ten problem.gmp::as.bigz()
do obsługi dużych liczb całkowitych.s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
substring
można tego używać (tylko kiedykolwiek korzystałemsubstr
). Odpowiedź została zredagowana, aby uwzględnić Twoją sugestię.C ++ 14, 93 bajty
Port mojej odpowiedzi C działa dla dużych liczb (połączenie z
L
sufiksem).źródło
Haskell, 47 bajtów
Przykład użycia:
f 102343
->False
.Wykorzystuje zestawy z
Data.Set
modułu. Funkcja pomocnikas
zamienia liczbę w jej ciąg znaków, a następnie tworzy zestaw znaków.źródło
s$n^3
?(s n==s) (n^3)
na błąd typu.Brachylog , 11 bajtów
Wypróbuj online!
Dzięki @DestructibleWatermelon za wskazanie problemu z moją pierwotną odpowiedzią.
Wyjaśnienie
źródło
PowerShell v2 +,
9493 bajty(Nowa linia dla przejrzystości, nieuwzględniona w bajtecount)
Pierwszy wiersz definiuje się
f
jakofilter
(wystarczająco podobna do funkcji dla naszych celów, aby nie wchodzić w szczegóły), który pobiera dane wejściowe$n
i wykonuje następujące czynności:Druga linia zajmuje wejście
$args
, wykonujef
na nim, i sprawdza, czy jest to-eq
seksualnego, abyf
przeprowadzić na$x
sześcienny. Zwróć uwagę na jawną[bigint]
obsadę, wymaganą w przeciwnym razie uzyskamy wynik w notacji naukowej, co oczywiście nie zadziała.Wynik boolowski jest pozostawiany w potoku, a dane wyjściowe są niejawne.
Zapisano bajt dzięki @ConnorLSW
źródło
"$n"[0..99]
zamiast[char[]]"$n"
zaoszczędzić jeden bajt, ponieważ największa liczba, z którą musisz sobie poradzić, to tylko około 20 znaków.char[]
konwersji, reszta twojego kodu jest tak dobra, jak tylko mogłem go zdobyć, jeśli istnieje skrócony sposób porównywania tablic, możesz użyj czegoś takiego,("$n"[0..99]|group).Name
aby zaoszczędzić ładunki, alecompare
nie jest to szybkie i łatwe do gry w golfa.Groovy, 35
51znaków / bajtówSmutno mi było nie widzieć Groovy, więc oto moja oryginalna 51-bajtowa próba:
def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}
Przepisany jako 35-bajtowe anonimowe zamknięcie i
**
do potęgowania, dzięki manatwork:{"$it".toSet()=="${it**3}".toSet()}
Niektóre przypadki testowe dla oryginalnej funkcji:
Nazwany zamknięcie
c
można nazwać tak:println c.call(107624)
. Anonimowe 35-bajtowe zamknięcie można nazwać tak:println ({"$it".toSet()=="${it**3}".toSet()}(107624))
Wyjścia:
Uwaga: dowiedziałem się, że istnieje coś takiego jak golf golfowy, więc mam nadzieję, że dobrze to zrozumiałem!
źródło
def c={"$it".toSet()=="${it.power(3)}".toSet()}
**
operatora do potęgowania.x(107624)
przezc.call(107624)
**
sprowadza go do pięknych 35 znaków / bajtów:{"$it".toSet()=="${it**3}".toSet()}
Rubinowy, 48 bajtów
źródło