Wszystkie ksenodromy

15

Wprowadzenie

Ksenodrom w podstawie n jest liczbą całkowitą, w której wszystkie jego cyfry w podstawie n są różne. Oto niektóre sekwencje ksenodromów OEIS.

Na przykład, w bazie 16 FACE, 42i FEDCBA9876543210są pewne xenodromes (które są 64206, 66a 18364758544493064720w bazie 10), ale 11i DEFACEDnie są.

Wyzwanie

Biorąc pod uwagę podstawę wejściową, n , wyprowadza wszystkie ksenodromy dla tej podstawy w podstawie 10 .

Wyjście powinno być w kolejności od najmniejszej do największej. Powinno być jasne, gdzie kończy się termin w sekwencji, a zaczyna nowy (np. [0, 1, 2]Jest jasne, gdzie 012nie ma).

n będzie liczbą całkowitą większą niż 0.

Wyjaśnienia

To wyzwanie wykonuje operacje wejścia / wyjścia szczególnie w bazie 10, aby uniknąć obsługi liczb całkowitych i ich bazy jako ciągów. Wyzwanie polega na abstrakcyjnym postępowaniu z każdą bazą. W związku z tym dodam tę dodatkową zasadę:

Liczby całkowite nie mogą być przechowywane jako ciągi znaków w bazie innej niż baza 10.

Twój program powinien być w stanie teoretycznie poradzić sobie z rozsądnie wysokim n, jeśli nie byłoby czasu, pamięci, precyzji lub innych technicznych ograniczeń we wdrażaniu języka.

To jest , więc wygrywa najkrótszy program w bajtach.

Przykład wejścia i wyjścia

1  # Input
0  # Output
2
0, 1, 2
3
0, 1, 2, 3, 5, 6, 7, 11, 15, 19, 21
4
0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 18, 19, 24, 27, 28, 30, 33, 35, 36, 39, 44, 45, 49, 50, 52, 54, 56, 57, 75, 78, 99, 108, 114, 120, 135, 141, 147, 156, 177, 180, 198, 201, 210, 216, 225, 228
Artyer
źródło
1
czy istnieje limit n?
FlipTack,
@ Flp.Tkc Nie. Powinien być w stanie obsłużyć odpowiednio wysoki n. Nie chcę, aby wyzwanie było ograniczone przez to, jak wysoka baza może poradzić sobie z wbudowaną konwersją języka.
Artyer
@Artyer To powinno być częścią tekstu wyzwania. Wygląda na to, że niektóre odpowiedzi już to robią
Luis Mendo
Wiem, że podstawowa konwersja w Pyth może obsłużyć wartości większe niż 36 , ale ponieważ wymaga to wszystkich ksenodromów, podstawowy python pęka, gdy lista staje się zbyt duża, mówiąc, że nie może zmieścić się w wartości ssize_t. Czy łamanie w ten sposób jest dopuszczalne?
FryAmTheEggman
2
Wydaje się, że ktoś zanegował wszystkie odpowiedzi, które nie mogą obsłużyć większych baz z powodu wbudowanego limitu precyzji, który również wydaje się być implementacją, a nie problemem algorytmicznym. Czy możesz to wyjaśnić?
Dennis

Odpowiedzi:

10

Pyth , 8 bajtów

f{IjTQU^

Filtruje liczby w [0, n ^ n - 1], gdy nie ma zduplikowanych elementów w podstawie n . Podstawowa konwersja w Pyth będzie działać z dowolną bazą, ale ponieważ patrzy ona na bardzo szybko rosnącą listę liczb, ostatecznie nie będzie w stanie przechowywać wartości w pamięci.

Wypróbuj online!

Wyjaśnienie:

f{IjTQU^QQ    - Auto-fill variables
      U^QQ    - [0, n^n-1]
f             - keep only those that ...
 {I           - do not change when deduplicated
   jTQ        - are converted into base n
FryAmTheEggman
źródło
Wow, rozwiązanie krótsze niż rozwiązanie Jelly wykonane przez Dennisa! : „P
HyperNeutrino
3
Nikt nie przebije Galaretki. ¶:
Roman Gräf
5

Python 2, 87 bajtów

n=input()
for x in range(n**n):
 s={n};a=x
 while{a%n}|s>s:s|={a%n};a/=n
 print-~-a*`x`

Drukuje dodatkowe puste linie dla nie-ksenodromów:

golf % python2.7 xenodromes.py <<<3
0
1
2
3

5
6
7



11



15



19

21
Lynn
źródło
5

Galaretka , 9 8 bajtów

ð*ḶbQ€Qḅ

Dzięki @JonathanAllan za grę w golfa na 1 bajcie!

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ð*ḶbQ€Qḅ  Main link. Argument: n

ð         Make the chain dyadic, setting both left and right argument to n.
          This prevents us from having to reference n explicitly in the chain.
 *        Compute nⁿ.
  Ḷ       Unlength; yield A := [0, ..., nⁿ - 1].
   b      Convert each k in A to base n.
    Q€    Unique each; remove duplicate digits.
      Q   Unique; remove duplicate digit lists.
       ḅ  Convert each digit list from base n to integer.
Dennis
źródło
4

Galaretka , 12 bajtów

*`ḶbµQ⁼$Ðfḅ³

TryItOnline!

Będzie działać dla każdego n, biorąc pod uwagę wystarczającą ilość pamięci, podstawowa konwersja Jelly nie jest ograniczająca.

W jaki sposób?

*`ḶbµQ⁼$Ðfḅ³ - Main link: n
    µ        - monadic chain separation
*            - exponentiation with
 `           - repeated argument, i.e. n^n
  Ḷ          - lowered range, i.e. [0,1,2,...,n^n-1]
   b         - covert to base n (vectorises)
        Ðf   - filter keep:
       $     -     last two links as a monad
     Q       -         unique elements
      ⁼      -         equals input (no vectorisation)
           ³ - first program argument (n)
          ḅ  - convert from base (vectorises)
Jonathan Allan
źródło
3

JavaScript (ES7), 86 bajtów

n=>{a=[];for(i=n**n;i--;j||a.unshift(i))for(j=i,b=0;(b^=f=1<<j%n)&f;j=j/n|0);return a}
Neil
źródło
Nie powiedzie się 1(Powinien wyjść [0], ale RangeErrors.)
Artyer
Dokładnie to, co miałem, ale teoretycznie by się 37to nie
udawało,
@Artyer Przeniesiłem moją wersję Batch, więc teraz będzie to działać nod 1do, 13zanim precyzja zmiennoprzecinkowa ją zabije.
Neil
Podoba mi się, jak rozwiązania zaczynają się naprawdę krótko, a potem nagle skaczą o rząd wielkości.
Nissa
2

Perl 6 , 47 bajtów

{(0..$_**$_).grep: !*.polymod($_ xx*).repeated}

Zwraca Seq . ( Seq to podstawowe owijalne opakowanie dla Iteratora )

Po jego wprowadzeniu 16obliczenie 53905th elementu Seq ( 87887) zajmuje 20 sekund .

Rozszerzony:

{       # bare block lambda with implicit parameter 「$_」

  ( 0 .. ($_ ** $_) )    # Range of values to be tested

  .grep:                 # return only those values

    !\                   # Where the following isn't true
    *\                   # the value
    .polymod( $_ xx * )  # when put into the base being tested
    .repeated            # has repeated values
  }
}
Brad Gilbert b2gills
źródło
2

Partia, 204 200 bajtów

@set/an=%1,m=1
@for /l %%i in (1,1,%1)do @set/am*=n
@for /l %%i in (0,1,%m%)do @set/ab=0,j=i=%%i&call:l
@exit/b
:l
@set/a"f&=b^=f=1<<j%%n,j/=n"
@if %f%==0 exit/b
@if %j% gtr 0 goto l
@echo %i%

Nie będzie działać dla n> 9, ponieważ Batch ma tylko 32-bitową arytmetykę. Wygodnie, Batch ocenia f &= b ^= f = 1 << j % njako f = 1 << j % n, b = b ^ f, f = f & braczej niż f = f & (b = b ^ (f = 1 << j % n)).

Neil
źródło
2

Mathematica, 59 48 bajtów

Select[Range[#^#]-1,xMax[x~DigitCount~#]==1]&

Zawiera znak „Użycie prywatne” U + F4A1

Wyjaśnienie

Range[#^#]-1

Generują {1, 2, ..., n^n}. Odejmij 1. (wydajność {0, 1, ..., n^n - 1})

xMax[x~DigitCount~#]==1

Funkcja boolowska: Truejeśli każda cyfra występuje co najwyżej raz w bazie n.

Select[ ... ]

Z listy {0, 1, ..., n^n - 1}wybierz te, które dają, Truegdy zastosowana zostanie powyższa funkcja boolowska.

Wersja 59-bajtowa

Select[Range[#^#]-1,xDuplicateFreeQ[x~IntegerDigits~#]]&
JungHwan Min
źródło
2

Mathematica, 48 55 bajtów

Union[(x   x~FromDigits~#)/@Permutations[Range@#-1,#]]&

(Potrójna spacja między xs musi zostać zastąpiona 3-bajtowym znakiem \ uF4A1, aby kod działał.)

Nienazwana funkcja pojedynczego argumentu. Zamiast testować liczby całkowite pod kątem ksenodromowości, po prostu generuje wszystkie możliwe permutacje podzbiorów dozwolonych cyfr (co automatycznie unika powtórzeń) i konwertuje odpowiednie liczby całkowite na bazę 10. Każdy ksenodrom jest generowany dwukrotnie, zarówno z wiodącym 0, jak i bez wiodącego 0;Unionusuwa duplikaty i sortuje listę do uruchomienia.

Greg Martin
źródło
1
Nie działa na 2. Funkcja daje {0, 1}. Wierzę, że potrzebujesz Permutations[Range@#-1, #]zamiast Subsets[Range@#-1].
JungHwan Min
Gah, co za zgryźliwy błąd. Dziękujemy za obserwację i idealną poprawkę!
Greg Martin