Czy n i n ^ 3 mają ten sam zestaw cyfr?


52

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 , więc wygrywa kod z najmniejszą liczbą bajtów.

OEIS A029795


28
Proponowany przypadek testowy: 106239
Dennis

8
Przypadek testowy: 2103869 -> True. Ten (lub większy) jest niezbędny do przetestowania języka z longtypem danych.
mbomb007

5
Szkoda, że ​​maks. Jest zbyt duży dla języka bez 64-bitowej liczby całkowitej.
edc65

17
Myślę, że powinieneś wyraźnie mówić o bazie ... w wersji binarnej to trochę dobra zabawa :-D
The Vee

7
@ ZoltánSchmidt 106239 jest najmniejsza dodatnia n , tak że - 1199090390129919 - nie zawiera wszystkich cyfr n . Niektóre odpowiedzi sprawdzały tylko, czy n zawiera wszystkie cyfry n³, a zatem otrzymano zły wynik dla 106239 .
Dennis

Odpowiedzi:


28

Python 3, 36 32 bajtów

lambda x:{*str(x)}=={*str(x**3)}

Myślę, że działa to tylko w Pythonie 3.5 i nowszych. Cztery bajty zniknęły dzięki Copper.


8
W Pythonie 2 możesz używać znaków backtics jako skrótu do repr (), oszczędzając 6 bajtów. set(`x`)
DenDenDo

9
@DenDenDo Wszelkie dane większe niż 2097152( sys.maxint**(1/3.)) i mniejsze niż sys.maxint+1zostaną zwrócone, Falsejeśli użyjesz repr(). repl.it/EXs2/1 . Długie mają Lna końcu.
mbomb007

9
Nie przetestowano, ale prawdopodobnie można to zrobić lambda x:{*str(x)}=={*str(x**3)}w Python 3.5+.
Miedź

1
@BenHoyt To bardziej zwięzłe niż używanie print (...) i input (). Uaktywnienie tej funkcji jest krótsze niż wykonanie pełnego programu.
0WJYxW9FMN

1
Ponieważ pytanie mówi powrocie wartość truthy lub falsy wystarcza, można zastąpić ==przez ^. Dwa równe zestawy prowadzą do {}fałszu.
RemcoGerlich,

19

05AB1E , 6 bajtów

05AB1E wykorzystuje kodowanie CP-1252 .

3mê¹êQ

Wypróbuj online!

Wyjaśnienie

3m       # input^3
  ê      # sorted with duplicates removed
     Q   # is equal to
   ¹ê    # input sorted with duplicates removed

1
@PuzomorCroatia: 05AB1E używa kodowania CP-1252 , więc wszystkie te znaki mają 1 bajt. Języki gry w golfa często używają stron kodowych zawierających więcej znaków do wydrukowania niż UTF-8 lub alternatywnie tworzą własną stronę kodową.
Emigna

7
Dziękuję za odpowiedź. Niestety, próbując edytować mój komentarz, usunąłem go. Aby wyjaśnić to wszystkim, zapytałem o kodowanie znaków w
kodowanych

14

C, 73 bajty

k;b(i){k=0;while(i)k|=1<<i%10,i/=10;return k;}f(n){return b(n)-b(n*n*n);}

Tworzy zestaw za pomocą bitów. Zwraca ten 0sam zestaw, wszystko inne dla różnych zestawów.

Nie golfowany:

k;
b(i){
  k=0;
  while(i)
    k|=1<<i%10,
    i/=10;
  return k;
}

f(n){
  return b(n)-b(n*n*n);
}

1 <<Podczas ustawiania bitów brakuje kodu bez golfa k |= 1 << i % 10. Świetne rozwiązanie!
1Darco1,

1
Użyłem tego pomysłu do bitmapy, aby stworzyć 39-bajtową funkcję kodu maszynowego x86-64 :)
Peter Cordes,

Czy wolno nam uważać 0za prawdę? Myślę, że strcmpdziała w ten sposób, więc wydaje się rozsądne w C.
Peter Cordes,

1
Działa to tylko dla całego zakresu danych wejściowych wymaganych przez pytanie, jeśli jest ono intwię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 z unsigned long longlub tylko unsigned longw implementacjach, w których jest to typ 64-bitowy). GNU C definiuje __int128_tna komputerach 64-bitowych (bez żadnych nagłówków) ...
Peter Cordes,

8

Perl, 31 + 2 ( -plflaga) = 25 21 18 34 33 bajtów

$_=($==$_**3)!~/[^$_]/*!/[^$=]/

Za pomocą:

perl -ple '$_=($==$_**3)!~/[^$_]/*!/[^$=]/' <<< 251894

Wyjście: 1\nlub 0\n.

Dzięki za @Dada za 3 bajty, Gabriel Benamy za 1 bajt i @Zaid za zgłoszenia błędów.


1
Niezła odpowiedź! Nadal możesz zapisać kilka (3) bajtów:perl -pe '$_=$_**3!~/[^$_]/'
Dada

@Zaid Thanx. Naprawiony.
Denis Ibaev,

Teraz wyświetla wartość false dla 10:(
Zaid

@Zaid Yep. -lpotrzebna flaga.
Denis Ibaev,

2
Zmień na &&a, *aby zapisać bajt
Gabriel Benamy

7

Mathematica, 34 bajty

f=Union@*IntegerDigits;f@#==f[#^3]&

Implementacja bezpośrednia (nienazwana funkcja jednego argumentu całkowitego).


7

Galaretka , 8 bajtów

,3*\D‘ṬE

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

,3*\D‘ṬE  Main link. Argument: n

,3        Pair; yield [n, 3].
  *\      Cumulative reduce by exponentation. Yields [n, n³].
    D     Decimal; yield the digit arrays of n and n³.
     ‘    Increment, mapping 0 ... 9 to 1 ... 10.
      Ṭ   Untruth (vectorizes); map digit array [a, b, c, ...] to the smallest
          of zeroes with ones at indices a, b, c, ...
       E  Test the results for equality.

6

CJam, 8 bajtów

l_~3#s^!

Zestaw testowy.

Wyjaśnienie

l   e# Read input.
_~  e# Duplicate and evaluate.
3#  e# Raise to third power.
s   e# Convert back to string.
^   e# Symmetric set difference. Gives an empty list iff the two sets
    e# are equal.
!   e# Logical NOT.

6

JavaScript ES6, 55 51 bajtów

Dzięki Downgoat za 3 bajty! Możesz zapisać bajt, konwertując na ES7 i używając n**3zamiast n*n*n.

n=>(f=s=>[...new Set(s+[])].sort()+[])(n)==f(n*n*n)

Wystarczająco proste.


to okropne, że nie ma lepszego sposobu na porównanie zestawów pod kątem równoważności
njzk2

1
@ njzk2 Cóż, powiedziałbym, że większą tragedią jest to, że ==nie działa nawet na tablicach.
Conor O'Brien

Możesz zapisać bajt, zmieniając n*n*nna n**3, ale myślę, że może to być ES7, a nie ES6.
Robert Hickman

1
@Downgoat Dzięki, zainspirowało mnie to do zaoszczędzenia kilku bajtów!
Conor O'Brien

3
To się nie udaje 2103869, a problem wyraźnie wymaga rozwiązania 2642245.
user5090812

6

C #, 241 208 205 201 193 233 222 220 212 203 177 159 bajtów (109 na przemian)

I=>{x=s=>{var a=new int[10];foreach(var h in s+"")a[h-'0']++;return a;};var i=x(I);var j=x(I*I*I);for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};

Lambda muszą w szczególności używać ulongtypu:

System.Func<ulong, bool> b; // = I=>{...};
System.Func<ulong, int[]> x; // inner lambda

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.

using System.Collections.Generic;I=>{return new HashSet<char>(I+"").SetEquals(new HashSet<char>(I*I*I+""));};

Czy możesz to sprawdzić p<0zamiast p==1?
Yytsi

@TuukkaX Zrobiłbym to, ale sposób, w jaki teraz ustalam zestawy, wykorzystuje tę samą tablicę liczb całkowitych, zwiększając odpowiedni indeks dla obu łańcuchów, więc wartość 0 lub 2 jest w porządku, ale jeśli jakieś są 1, powinien zwrócić false.
Yodle

Zaoszczędź bardzo mało, wyodrębniając tworzenie i wypełnianie tablic w osobną lambda: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;};
Corak

Możesz zastąpić int.Parse(c+"")przezc-'0'
Dennis_E

Nieudana próba 2103869. Natknąłem się na ten sam problem. (Nieważne, dowiedziałem się, dlaczego. Użyłem longzamiast, ulonga ten przypadek testowy korzysta z MSB.)
SaxxonPike

6

Java 8, 154 znaków

a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

Nazywany tak:

interface Y {
    boolean n(int x);
}

static Y y = a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

public static void main(String[] args) {
    System.out.println(y.n(0));
    System.out.println(y.n(1));
    System.out.println(y.n(10));
    System.out.println(y.n(107624));
    System.out.println(y.n(251894));
    System.out.println(y.n(251895));
    System.out.println(y.n(102343));
}

Wyjścia:

true
true
true
true
true
false
false

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)zamiast Math.pow(a,3)Math.pow z użyciem nieprecyzyjnych podwójnych, które zwracają niepoprawne wartości z dużymi liczbami (zaczynając od 2103869).


To static Y ydziwna składnia inicjalizacyjna, czy automatycznie się do niej przypisuje, y.nponieważ interfejs ma dokładnie jednego członka?
kot

Tak mi się wydaje, tak. Szczerze mówiąc, jestem nowicjuszem w Javie 8, ponieważ moje miejsce pracy jest wciąż na 7, ale tak postrzegam to jako działające.
Hypino,

Kompilator automatycznie dodaje @FunctionalInterfaceadnotację (interfejs z tylko jedną metodą, patrz javadoc), która sprawia, że ​​lambdas działa zamiast zwykłej instancji typu anonimowego.
1Darco1

Jest to zasadniczo równe, 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()); } }a staticmodyfikator jest tylko tam, aby umożliwić wywołanie y.n(int)ze statycznej metody głównej.
1Darco1,

1
Nieważne, po prostu przeczytaj meta post na ten temat i wydaje się, że społeczność się z tym zgadza. Chyba rozumiem dlaczego. Zaktualizuję.
Hypino,

6

GRZMOTNĄĆ, 69, 59 bajtów

AKTUALIZACJA

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)

T() { m=`bc<<<$1^3`;[ -z "`tr -d $m <<<$1;tr -d $1 <<<$m`" ];}

EDYCJA: Jeszcze więcej optymalizacji (Thx! @Manatwork)

Grał w golfa

T() { S(){ fold -1|sort -u;};bc<<<$1^3|S|diff - <(S<<<$1);}

Test

TEST() {
 T $1 >/dev/null; echo $?
}

TEST 0
0
TEST 1
0
TEST 11
1
TEST 10
0
TEST 107624
0
TEST 251894
0
TEST 251895
1
TEST 102343
1
TEST 106239
1

0 - dla sukcesu (kod wyjścia) 1 - dla niepowodzenia (kod wyjścia)


Obawiam się, że podstawowa teoria jest całkowicie błędna. Spróbować T <<< 11. Powie, że zestawy cyfr są takie same tylko dlatego, że 11 ** 3 == 1331 zawiera cyfry nieobecne w oryginalnym numerze dwa razy.
manatwork

Tak, masz rację, naprawiono! Dziękuję Ci !
zeppelin

Ok, ale teraz w kodzie pozostały dodatkowe spacje. Nie jestem pewien, dlaczego -wwyraźnie to dodałeś fold. Jeśli uniqjest używany bez opcji, sort -umoże go zastąpić. I nakarm drugie wezwanie S. ciągiem tutaj. I myślę, że nie ma potrzeby cytowania przekazanej formuły bc.
manatwork

@manatwork, dzięki, naprawiłem argument fold, usunąłem spacje i sprawiłem, że drugi argument diff używał tutaj doc. Teraz przesyłam też pierwszy argument do diff i usunąłem zbędne cudzysłowy wokół wyrażenia bc . > uniq jest używany bez opcji, sort -u może go zastąpić. To tylko resztki poprzedniej wersji (był uniq -u )). Dziękuję Ci !
zeppelin

1
@zeppelin: możesz użyć cmpzamiast diffi zapisać 1 bajt.
Ipor Sircer,

6

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. ( nw RDI: logiczna wartość zwracana (0 lub 1) w AL).

_Booljest zdefiniowany przez ISO C11 i jest zwykle używany #include <stdbool.h>do definiowania boolprzy użyciu tej samej semantyki co C ++ bool.

Potencjalne oszczędności:

  • 3 bajty: Zwracanie warunku odwrotnego (niezerowego, jeśli występuje różnica). Lub z wbudowanego asm: zwracanie warunku flagi (co jest możliwe w gcc6)
  • 1 bajt: Gdybyśmy mogli zablokować EBX (zrobienie tego nadałoby tej funkcji niestandardową konwencję wywoływania). (może to zrobić z wbudowanego asm)
  • 1 bajt: instrukcja RET (z wbudowanego asm)

Wszystkie te są możliwe, jeśli byłby to fragment wbudowanego asm zamiast funkcji, co dałoby 35 bajtów dla wbudowanego asm .

0000000000000000 <cube_digits_same>:
   0:   89 f8           mov    eax,edi
   2:   48 f7 e7        mul    rdi          # can't avoid a REX prefix: 2642245^2 doesn't fit in 32 bits
   5:   48 f7 e7        mul    rdi          # rax = n^3, rdx=0
   8:   44 8d 52 0a     lea    r10d,[rdx+0xa]  # EBX would save a REX prefix, but it's call-preserved in this ABI.
   c:   8d 4a 02        lea    ecx,[rdx+0x2]

000000000000000f <cube_digits_same.repeat>:
   f:   31 f6           xor    esi,esi

0000000000000011 <cube_digits_same.cube_digits>:
  11:   31 d2           xor    edx,edx
  13:   49 f7 f2        div    r10         ; rax = quotient.  rdx=LSB digit
  16:   0f ab d6        bts    esi,edx     ; esi |= 1<<edx
  19:   48 85 c0        test   rax,rax     ; Can't skip the REX: (2^16 * 10)^3 / 10 has all-zero in the low 32.
  1c:   75 f3           jne    11 <cube_digits_same.cube_digits>

                                         ; 1st iter:                 2nd iter:                both:
  1e:   96              xchg   esi,eax   ; eax=n^3 bitmap            eax=n bitmap             esi=0
  1f:   97              xchg   edi,eax   ; edi=n^3 bitmap, eax=n     edi=n bmp, eax=n^3 bmp
  20:   e2 ed           loop   f <cube_digits_same.repeat>

  22:   39 f8           cmp    eax,edi
  24:   0f 94 d0        sete   al
                  ;; The ABI says it's legal to leave garbage in the high bytes of RAX for narrow return values
                  ;; so leaving the high 2 bits of the bitmap in AH is fine.
  27:   c3              ret    
0x28: end of function.

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/ jzdo 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 ma test r32, imm8kodowania, 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.

_Bool cube_digits_same(unsigned long long n);

#include <stdio.h>
#include <stdbool.h>
int main()
{
    for(unsigned n=0 ; n<= 2642245 ; n++) {
        bool c = f(n);
        bool asm_result = cube_digits_same(n);
        if (c!=asm_result)
            printf("%u problem: c=%d asm=%d\n", n, (int)c, (int)asm_result);
    }
}

Jedyne drukowane linie mają c = 1 asm = 0: fałszywie dodatnie dla algorytmu C.

Przetestowano również pod kątem uint64_timplementacji tego samego algorytmu w wersji C Karla, a wyniki są zgodne dla wszystkich danych wejściowych.


Kod golfa w kodzie maszynowym ? To prawdziwe mistrzostwo!
chx

@chx: Naprawdę jest w języku asemblera, optymalizując rozmiar kodu. Nie zapisuję bajtów szesnastkowych bezpośrednio, po prostu wiem (lub sprawdzam), jaki rozmiar ma każda instrukcja. (To, co opublikowałem, pochodzi z asemblera z yasm, a następnie uruchomienia objdump -drwC -Mintelpliku 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)
Peter Cordes

@chx: ale tak, gra w golfa w asm sprawia, że ​​czuję się jak badass, dzięki za zauważenie :) Zobacz moje inne odpowiedzi, tutaj i na SO :)
Peter Cordes

Jestem bardzo starym kapeluszem w asemblerze (1987, Z80 był pierwszy), ale nigdy bym nie pomyślał o tym, aby wejść w grę w golfa. Myślałbym, że to niemożliwe.
chx

@chx: Gram tylko sporadycznie, zwykle tylko wtedy, gdy widzę jedno w Hot Network Questions, które wygląda rozsądnie jak na asm. Zwykle są to liczby, a nie ciągi znaków. Jednak kilka innych osób gra w golfa w asm. Sam nie pomyślałem o tym, dopóki nie zobaczyłem odpowiedzi golfa na kod maszynowy. Być może właśnie ten przykuł mnie do faktu, że można liczyć bajty kodu maszynowego zamiast znaków źródłowych asm dla odpowiedzi asm. anatolyg napisał kilka, w tym na to pytanie.
Peter Cordes,

5

Haskell, 47 bajtów

n%p=[c|c<-['0'..],elem c$show$n^p]
f n=n%1==n%3

Bardzo wolno. Przetestuj za pomocą c<-['0'..'9'].

Testuje każdy znak pod kątem włączenia do reprezentacji ciągu ni tworzy listę tych zawartych. Podobnie n^3sprawdza i sprawdza, czy listy są równe.


Czy Haskell nie ma ustawionych literałów lub funkcji, która zwraca unikalne elementy z listy?
kot

2
@ cat No. Haskell ma nub(zdobądź unikalne elementy) i sort, ale oba wymagają długiego importu import 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).
xnor

Dlaczego trzeba sortować ...?
kot

1
@cat nubzachowuje porządek przy pierwszym pojawieniu się, tj nub [3,1,3,2,1,2] == [3,1,2]. Nie jest konwertowany na typ zestawu (nie ma żadnego), ale podaje listę.
xnor

Och, nigdy nie zrealizowane Haskell nie posiada prymitywny typ nieuporządkowana kolekcja, to ma sens
kot

5

Dyalog APL , 10 bajtów

⍕≡⍕∪(⍕*∘3)

⍕≡ 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)


1
Zakładasz, że unikalne cyfry w n ^ 3 nie mogą być mniejsze niż cyfry w n?
ngn

Czy możesz udowodnić istnienie kontrprzykładu?
Adám,

1
106239, patrz komentarze na górze
ngn


5

Java 7, 185 178 znaków

import java.util.*;
boolean a(int n){return new HashSet(Arrays.asList((n+"").split(""))).equals(new HashSet(Arrays.asList((new java.math.BigInteger(n+"").pow(3)+"").split(""))));}

Zadzwoń jako:

public static void main(String [] args) {
    System.out.println(0 + " -> " + a(0));
    System.out.println(1 + " -> " + a(1));
    System.out.println(10 + " -> " + a(10));
    System.out.println(107624 + " -> " + a(107624));
    System.out.println(2103869 + " -> " + a(2103869));
    System.out.println(251894 + " -> " + a(251894));
    System.out.println(251895 + " -> " + a(251895));
    System.out.println(102343 + " -> " + a(102343));
    System.out.println(106239 + " -> " + a(106239));
}

Wynik:

0 -> true
1 -> true
10 -> true
107624 -> true
2103869 -> true
251894 -> true
251895 -> false
102343 -> false
106239 -> false

(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).


Przywóz / użycie jest rzeczywiście częścią liczby bajtów. Możesz jednak usunąć static .
Kevin Cruijssen

Ok, dzięki. Usunięte static.
QBrute

4

Galaretka , 8 bajtów

*3ṢQ⁼ṢQ$

Wypróbuj online!

Wyjaśnienie:

       $    # As a monadic (single argument) link:
    ⁼       # Return true if the following are equal
     ṢQ     # The unique sorted elements of 'n'
  ṢQ        # and The unique sorted elements
*3          # of 'n^3'

To nie działa z wejściem 100 .
Dennis

Rozumiem, dlaczego tak nie jest, ale dlaczego to nie działa ?
DJMcMayhem

1
Ponieważ galaretka jest ściśle analizowana od lewej do prawej, bez pierwszeństwa operatora. *3ṢQ⁼ṢQ$działa zgodnie z przeznaczeniem, ponieważ szybkie $grupuje dwa atomy po jego lewej stronie w monadyczny łańcuch.
Dennis

4

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 106239jako przykładowe dane wejściowe (których niektóre inne odpowiedzi zawiodły).

!s.++Q,`**

Wyjaśnienie:

!s.++Q,`**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       `         repr(Q^3)
      ,      Q   [repr(Q^3),Q]
    +Q           [Q,repr(Q^3),Q]
  .+             Deltas ([Digits in Q but not in Q^3, digits in Q^3 but not in Q])
!s               Are both empty?

Wypróbuj pierwszą odpowiedź za pomocą internetowego zestawu testów.

Druga odpowiedź:

qFmS{`d,**

Wyjaśnienie:

qFmS{`d,**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       ,     Q   [Q^3, Q]
  m              map over each element d of [Q^3, Q]:
     `d           the element's string representation
    {             with duplicates removed
   S              and sorted
qF               Fold over equality (are the two the same?)

Wypróbuj drugą odpowiedź, korzystając z internetowego zestawu testów.


4

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

fun f(i:Long)="$i".toSet()=="${i*i*i}".toSet()

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())}


1
Witamy w PPCG! Dane wejściowe / wyjściowe są domyślnie określone ze względu na golf-code . Możesz zobaczyć standardy konsensusu społeczności tutaj . Twoja liczba funkcji powinna być wystarczająca.
AdmBorkBork,

4

Haskell, 54 52 bajty

Dzięki @Laikoni za zapisanie dwóch bajtów.

(%)=all.flip elem
k n|[a,b]<-show<$>[n,n^3]=b%a&&a%b

1
Zadeklarowanie a%b=all(elem a)bjako funkcji, a następnie wywołanie za pomocą b%a&&a%bpowinno zaoszczędzić dwa bajty.
Laikoni

4

JavaScript (ES6), 44 bajty

g=n=>n<1?0:g(n/10)|1<<n%10
n=>g(n)==g(n*n*n)

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.


4

Perl 6 , 22 bajtów

{!(.comb$_³.comb)}

Rozszerzony:

{ # bare block lambda with implicit parameter 「$_」
  !(
    .comb # get a list of the graphemes ( digits )

     # Symmetric Set difference

    $_³.comb # cube and get a list of the graphemes
  )
}

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.


Możesz wymienić na $_just.
Jo King

4

C ++, 82 bajty

t(int a){int b=a*a*a,c,d;while(a|b)c|=1<<a%10,a/=10,d|=1<<b%10,b/=10;return c==d;}

Funkcja t (a) zwraca odpowiedź. Używa int jako zestawu. Ładnie wydrukowane:

t(int a)
{
    int b = a*a*a, c, d;
    while(a|b) c|=1 << a%10, a/=10, d|=1 << b%10, b/=10;
    return c==d;
}

Trzeba to #include<set>i using namespace std;w golfed kodu bajtowego i liczenia
kot

@cat #include<set>zamiastalgorithm
Karl Napf

@KarlNapf oh, myślałem, że wszystkie kontenery stdlib są dostępne przez algorytm - pokazuje to, co wiem o C ++ :)
cat

Wydaje mi się, że zmienna lokalna dla funkcji „c” nie została zainicjowana, ale została użyta c | = 1 ...
RosLuP

4

R, 65 79 70 bajtów

Bierze nze standardowego wejścia, rozdziela ni n^3do jednej cyfry i porównuje dwa zestawy. Używa gmppakietu do obsługi dużych liczb całkowitych (dzięki Billywob za wskazanie tej wady). Teraz używa substringcięcia ni n^3dzięki @MickyT za sugestię. (Poprzednie wersje używane scani gsubhacky).

s=substring
setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e2,p),s(n^3,p,p))

Niestety, to nie zadziała (dla dużych n), chyba że użyjesz jakiegoś pakietu BigInt. Zobacz ?.Machineszczegóły na temat największej liczby całkowitej i zmiennoprzecinkowej itp. Aby zobaczyć to porównanie, np. 2600001^3W R do wolframalpha
Billywob

Nigdy nie musiałem go używać sam, ale wygląda na to, że gmppakiet może rozwiązać ten problem.
Billywob

Ach, dobry chwyt! Zaktualizowałem odpowiedź, teraz używa gmp::as.bigz()do obsługi dużych liczb całkowitych.
rturnbull

możesz skorzystać z faktu, że podciąg przekształca się w znak, aby podzielić liczbę, np.s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
MickyT

@MickyT Fantastyczna sugestia! Nie wiedziałem, że substringmożna tego używać (tylko kiedykolwiek korzystałem substr). Odpowiedź została zredagowana, aby uwzględnić Twoją sugestię.
rturnbull

4

C ++ 14, 93 bajty

int b(auto i){int k=0;while(i)k|=1<<i%10,i/=10;return k;}int f(auto n){return b(n)-b(n*n*n);}

Port mojej odpowiedzi C działa dla dużych liczb (połączenie z Lsufiksem).


3

Haskell, 47 bajtów

import Data.Set
s=fromList.show
f n=s n==s(n^3)

Przykład użycia: f 102343-> False.

Wykorzystuje zestawy z Data.Setmodułu. Funkcja pomocnika szamienia liczbę w jej ciąg znaków, a następnie tworzy zestaw znaków.


Nie możesz tutaj zapisać bajtu s$n^3?

@ ais523: Nie, ponieważ tłumaczy to (s n==s) (n^3)na błąd typu.
nimi

3

Brachylog , 11 bajtów

doI,?:3^doI

Wypróbuj online!

Dzięki @DestructibleWatermelon za wskazanie problemu z moją pierwotną odpowiedzią.

Wyjaśnienie

(?)doI,           I is the Input sorted with no duplicates
       ?:3^       Compute Input^3
           doI    Input^3 sorted with no duplicates is I

Podoba mi się buźka kota w tym: 3
QBrute

3

PowerShell v2 +, 94 93 bajty

filter f($n){-join("$n"[0..99]|sort|select -u)}
(f($x=$args[0]))-eq(f("[bigint]$x*$x*$x"|iex))

(Nowa linia dla przejrzystości, nieuwzględniona w bajtecount)

Pierwszy wiersz definiuje się fjako filter(wystarczająco podobna do funkcji dla naszych celów, aby nie wchodzić w szczegóły), który pobiera dane wejściowe $ni wykonuje następujące czynności:

filter f($n){-join("$n"[0..99]|sort|select -u)}
       f($n)                                    # Input
                   "$n"                         # Cast as string
                       [0..99]                  # Index as char-array
                              |sort             # Sorted alphabetically
                                   |select -u   # Only select the -Unique elements
             -join(                          )  # Join those back together into a string
                                                 # Implicit return

Druga linia zajmuje wejście $args, wykonuje fna nim, i sprawdza, czy jest to -eqseksualnego, aby fprzeprowadzić na $xsześ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.

PS C:\Tools\Scripts\golfing> 0,1,10,107624,251894,251895,102343,106239,2103869|%{"$_ --> "+(.\do-n-n3-same-digits.ps1 $_)}
0 --> True
1 --> True
10 --> True
107624 --> True
251894 --> True
251895 --> False
102343 --> False
106239 --> False
2103869 --> True

Zapisano bajt dzięki @ConnorLSW


możesz użyć "$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.
colsw

@ConnorLSW Znów jest ta sztuczka indeksowania. Będę musiał to pamiętać.
AdmBorkBork,

tak długo, jak masz gwarancję, że używasz mniej niż 100 znaków, jest to dość łatwe zapisanie w porównaniu do normalnej 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).Nameaby zaoszczędzić ładunki, ale comparenie jest to szybkie i łatwe do gry w golfa.
colsw

To właśnie dostaję za rozwiązanie go bez patrzenia na odpowiedzi ... Prawie ta sama odpowiedź ;-). Ale przeoczyłeś kilka bardzo oczywistych optymalizacji ;-)
Joey,

3

Groovy, 35 51 znaków / bajtów

Smutno 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:

println x(0)
println x(1)
println x(10)
println x(107624)
println x(251894)
println x(251895)
println x(102343)

Nazwany zamknięcie cmoż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:

true
true
true
true
true
false
false

Uwaga: dowiedziałem się, że istnieje coś takiego jak golf golfowy, więc mam nadzieję, że dobrze to zrozumiałem!


Witaj Rado i witaj w PPCG! To świetna pierwsza odpowiedź, +1!
NoOneIsHere

Udało mi się wycisnąć go jeszcze bardziej do 47 znaków / bajtów za pomocą zamknięcia, ale nie mogę edytować mojej poprzedniej odpowiedzi ze względu na to, że jestem tu nowy, więc oto:def c={"$it".toSet()=="${it.power(3)}".toSet()}
Rado,

1
Funkcje anonimowe są dopuszczalne. I użyj **operatora do potęgowania.
manatwork

Dzięki @NoOneIsHere! Również wezwanie do zamknięcia przypadków testowych wymagałoby zastąpienia x(107624)przezc.call(107624)
Rado,

Dziękuję @manatwork! Korzystanie z anonimowego zamknięcia i **sprowadza go do pięknych 35 znaków / bajtów:{"$it".toSet()=="${it**3}".toSet()}
Rado,

2

Rubinowy, 48 bajtów

->n{(f=->x{x.to_s.chars.uniq.sort})[n]==f[n**3]}
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.