Alle Xenodrome


15

Einführung

Ein Xenodrom in der Basis n ist eine ganze Zahl, bei der alle Ziffern in der Basis n unterschiedlich sind. Hier sind einige OEIS-Sequenzen von Xenodromen.

Zum Beispiel in der Basis 16, FACE, 42und FEDCBA9876543210sind einige xenodromes (Welche sind 64206, 66und 18364758544493064720in der Basis 10), aber 11und DEFACEDsind es nicht.

Herausforderung

Bei gegebener Eingabebasis n werden alle Xenodrome für diese Basis in Basis 10 ausgegeben .

Die Ausgabe sollte in der Reihenfolge der kleinsten bis größten sein. Es sollte klar sein, wo ein Begriff in der Sequenz endet und ein neuer beginnt (z. B. [0, 1, 2]ist klar, wo 012nicht).

n wird eine ganze Zahl größer als 0 sein.

Klarstellungen

Diese Challenge führt IO speziell in Basis 10 aus, um zu vermeiden, dass Ganzzahlen und ihre Basis als Zeichenfolgen behandelt werden. Die Herausforderung besteht darin, mit jeder Basis abstrakt umzugehen. Als solches füge ich diese zusätzliche Regel hinzu:

Ganzzahlen können nicht als Zeichenfolgen in einer anderen Basis als Basis 10 gespeichert werden.

Ihr Programm sollte theoretisch in der Lage sein, einigermaßen hohes n zu verarbeiten, wenn bei der Implementierung einer Sprache keine Zeit-, Speicher-, Genauigkeits- oder sonstigen technischen Einschränkungen bestehen.

Das ist , also gewinnt das kürzeste Programm in Bytes.

Beispiel für Ein- und Ausgabe

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

1
Gibt es eine Grenze für n?
FlipTack

@ Flp.Tkc Nein. Es sollte in der Lage sein, einigermaßen hohes n zu verarbeiten. Ich möchte nicht, dass die Herausforderung dadurch begrenzt wird, wie hoch eine Basis ist, die die eingebaute Basiskonvertierung einer Sprache bewältigen kann.
Artyer

@Artyer Das hätte dann Teil des Herausforderungstextes sein sollen. Es scheint, dass einige Antworten das bereits tun
Luis Mendo

Ich weiß, dass die Basiskonvertierung in Pyth Werte größer als 36 verarbeiten kann , aber da dies alle Xenodrome erfordert, bricht das zugrunde liegende Python, wenn die Liste zu groß wird, und sagt, dass es keinen Wert in ein passen kann ssize_t. Ist es akzeptabel, auf diese Weise zu brechen?
FryAmTheEggman

2
Jemand scheint alle Antworten, die mit größeren Basen nicht umgehen können, wegen einer eingebauten Genauigkeitsbeschränkung zurückgestimmt zu haben, was auch eher wie eine Implementierung als ein Algorithmusproblem erscheint. Könnten Sie das klären?
Dennis

Antworten:


10

Pyth , 8 Bytes

f{IjTQU^

Filtert die Zahlen in [0, n ^ n - 1] so, dass die Basis n keine doppelten Elemente enthält . Die Basiskonvertierung in Pyth funktioniert mit jeder Basis, aber da es sich um eine sehr schnell wachsende Liste von Zahlen handelt, kann sie die Werte möglicherweise nicht im Speicher speichern.

Probieren Sie es online!

Erläuterung:

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

Wow, eine Lösung, die kürzer ist als die Lösung von Jelly, die Dennis gemacht hat! : 'P
HyperNeutrino

3
Niemand schlägt Jelly. ¶:
Roman Gräf

5

Python 2, 87 Bytes

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`

Druckt zusätzliche Leerzeilen für Nicht-Xenodrome:

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

5
6
7



11



15



19

21

5

Gelee , 9 8 Bytes

ð*ḶbQ€Qḅ

Vielen Dank an @JonathanAllan für das Abschlagen von 1 Byte!

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

ð*Ḷ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.

4

Gelee , 12 Bytes

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

TryItOnline!

Funktioniert für alle n, sofern genügend Speicherplatz vorhanden ist. Jellys Basiskonvertierung unterliegt keinen Einschränkungen.

Wie?

*`Ḷ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)

3

JavaScript (ES7), 86 Byte

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}

Schlägt 1[0]
fehl

Genau das, was ich hatte, aber das würde theoretisch scheitern, 37wenn Präzision kein Problem wäre, was es meiner Meinung nach ungültig macht ...
ETHproductions

@Artyer Ich habe meine Batch-Version portiert, daher funktioniert dies jetzt nvon 1bis, 13bevor die Gleitkommapräzision sie beendet.
Neil

Mir gefällt, wie die Lösungen sehr kurz anfangen und dann plötzlich um eine Größenordnung springen.
Nissa

2

Perl 6 , 47 Bytes

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

Liefert eine Seq . ( Seq ist ein grundlegender Iterations- Wrapper für Iteratoren. )

Bei einer Eingabe von 16dauert es 20 Sekunden, um das 53905. Element der Seq ( 87887) zu berechnen .

Erweitert:

{       # 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
  }
}

2

Batch, 204 200 Bytes

@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%

Funktioniert nicht für n> 9, da Batch nur 32-Bit-Arithmetik hat. Günstig bewertet Batch f &= b ^= f = 1 << j % nals f = 1 << j % n, b = b ^ f, f = f & bstatt f = f & (b = b ^ (f = 1 << j % n)).


2

Mathematica, 59 48 Bytes

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

Enthält das U + F4A1-Zeichen "Private Use"

Erläuterung

Range[#^#]-1

Generieren {1, 2, ..., n^n}. Subtrahiere 1. (Ausbeuten {0, 1, ..., n^n - 1})

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

Eine Boolesche Funktion: Truewenn jede Ziffer höchstens einmal in der Basis vorkommt n.

Select[ ... ]

Wählen Sie aus der Liste {0, 1, ..., n^n - 1}diejenigen aus, die angeben, Truewann die obige Boolesche Funktion angewendet wird.

59-Byte-Version

Select[Range[#^#]-1,xDuplicateFreeQ[x~IntegerDigits~#]]&

2

Mathematica, 48 55 Bytes

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

(Das dreifache Leerzeichen zwischen xs muss durch das 3-Byte-Zeichen \ uF4A1 ersetzt werden, damit der Code funktioniert.)

Unbenannte Funktion eines einzelnen Arguments. Anstatt Ganzzahlen auf Xenodromizität zu testen, werden einfach alle möglichen Permutationen von Teilmengen der zulässigen Ziffern generiert (wodurch Wiederholungen automatisch vermieden werden) und die entsprechenden Ganzzahlen in Basis 10 konvertiert. Jedes Xenodrom wird zweimal generiert, sowohl mit als auch ohne führende 0. UnionEntfernt die Duplikate und sortiert die zu startende Liste.


1
Scheitert für 2. Die Funktion gibt {0, 1}. Ich glaube du brauchst Permutations[Range@#-1, #]statt Subsets[Range@#-1].
JungHwan Min

Gah, was für ein blöder Fehler. Vielen Dank, dass Sie es beobachtet und die perfekte Lösung vorgeschlagen haben!
Greg Martin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.