Golfscript - 26 Bytes
{:i.)+.,{;10*i%.}%i>|,}:f;
Bearbeiten: aktualisiert, um auszugeben, 1
wenn die Dezimalstelle endet, anstatt die Länge der Dezimalstellendarstellung.
Eine ziemlich effiziente Version. Der Wert 67890 wird in ungefähr 10 Sekunden und 99991 in ungefähr 20 Sekunden ausgeführt. Es ist etwas langsamer als zuvor (ungefähr halb so schnell), da der Bereich, der iteriert wird, verdoppelt wurde, wobei die erste Hälfte ignoriert wird.
Alternativ auch 26 Bytes
{:i.)+.n*{*i%.}%i>)^^,}:f;
Dieser durchläuft die Zeichenfolge "\n"*(2*i+1)
, wobei i
der Wert an die Funktion übergeben wird. Der Wert an den Block jedes Mal vergangen ist , der Ordnungswert "\n"
, das ist 10 .
Das )^^
ist ein bisschen ein Workaround. Wenn Sie Uncons ein Zeichen aus einer Zeichenkette, ist das Ergebnis der Ordnungswert des Zeichens entfernt, wie oben erwähnt. Wenn Sie diesen Wert jedoch wieder anhängen, wird die Zeichenfolgendarstellung dieser Zahl angehängt und nicht das Zeichen - ziemlich unsymmetrisches Verhalten - und meiner Meinung nach ein Konstruktionsfehler. Wenn Sie das tatsächlich tun wollten, würde das erste Zeichenfolgen nur ein Byte kosten.
Eine zusätzliche Kopie des endgültigen Werts befindet sich bereits auf dem Stapel. )
Daher entferne ich den endgültigen Wert erneut , xoder mit der Zeichenfolge und xoder erneut, sodass alle Zeichen, die vom ersten xoder hinzugefügt oder entfernt wurden, wiederhergestellt werden. Wenn int op string
als Zeichen statt als Zeichenfolgendarstellung behandelt würde, )^^
könnte dies durch ersetzt werden |
.
Beachten Sie, dass während Strings (die in Golfscript als Array von Ints gespeichert sind) den Wert jedes Zeichens mod 256 anzeigen , die Werte jedes Zeichens selbst möglicherweise außerhalb dieses Bereichs liegen. Beim Testen auf Eindeutigkeit (über festgelegte Operationen) oder Eindeutigkeit (über) ?
wird der tatsächliche Wert verglichen und nicht der Anzeigewert.
Eine Patch-Datei für den aktuellen Golfscript-Interpreter :
61c61
< to_gs
---
> Gstring.new([self])
Das Obige wirkt sich nur auf das Verhalten von string op int
(und umgekehrt) aus, wo op
eines davon ist
+-|&^
. Alles andere bleibt unberührt, auch das Verhalten von Gint`
.
Die folgende 24-Byte- Lösung wird dann gültig:
{:i.)+.n*{*i%.}%i>|,}:f;
Und das behebt auch viele andere wirklich hässliche Workarounds .
Python - 48 Bytes
f=lambda n:len(set(10**-~i%n for i in range(n)))
Nicht die effizienteste Lösung, aber für Werte unter 100000 angemessen .
FWIW, das Kernelement ist identisch mit meiner Lösung zum Generieren zyklischer Zahlen in Dezimalzahl .
Eine effizientere Version desselben Codes ( 70 Byte ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Der Wert 99991 dauert weniger als eine Sekunde.