Ich habe diese Frage gelesen und dachte, es wäre eine schöne Herausforderung.
Aufgabe
Geben Sie eine Eingabe ein und 0<n<10
generieren Sie eine Zufallszahl mit
- genau n Ziffern
- der erste nicht a
0
- so
f(n)>10**(n-1)-1
- so
- eindeutige Ziffern
Gewinnkriterien
Das ist Code-Golf, also gewinnt der kürzeste Code.
Zufällig
Ich meine gleichmäßig zufällig verteilt. Aus Sicht des Programms hat also jede mögliche Nummer die gleiche Chance. Wenn die Sprache, in der Sie schreiben, einen seltsamen Zufallszahlengenerator hat, ist es in Ordnung, diesen zu verwenden.
Beispiel
Die Liste der zufällig ausgewählten Werte für n=2
lautet:
[10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
code-golf
number
random
grid
game
king-of-the-hill
javascript
code-golf
arithmetic
statistics
code-golf
math
code-golf
math
code-golf
string
palindrome
code-golf
string
interactive
code-golf
quine
polyglot
code-golf
string
stack-exchange-api
code-golf
number-theory
decision-problem
code-golf
tips
code-golf
string
internet
code-golf
graphical-output
image-processing
fractal
code-golf
ascii-art
geometry
hexagonal-grid
code-golf
string
restricted-source
hello-world
code-golf
game
code-golf
cipher
code-golf
permutations
cops-and-robbers
permutations
cops-and-robbers
code-golf
internet
stack-exchange-api
code-golf
ascii-art
random
code-golf
tips
code-golf
ascii-art
code-golf
code-golf
kolmogorov-complexity
code-golf
string
unicode
code-golf
number
sequence
primes
palindrome
code-golf
game
decision-problem
code-golf
math
geometry
code-golf
graphical-output
interactive
code-golf
set-partitions
code-golf
number
arithmetic
restricted-source
code-golf
decision-problem
python
recursion
code-golf
ascii-art
code-golf
source-layout
code-golf
function
recursion
functional-programming
code-golf
game
combinatorics
permutations
code-golf
string
file-system
code-golf
string
hashing
code-golf
stack-exchange-api
code-golf
string
code-golf
math
number
arithmetic
polyglot
Roman Gräf
quelle
quelle
Antworten:
Python 2 , 77 Bytes
Probieren Sie es online!
Mischt die Liste der 10 Ziffern, bis sie nicht mehr mit 0 beginnt, und erstellt dann eine Zahl mit den ersten
n
aufgelisteten Ziffern.quelle
9
oder10
.[1::3]
Konvertieren von einer Liste in eine Zeichenfolge funktioniert? Das habe ich noch nie gesehen.[
.[1::3]
erhält den Charakter bei Index 1, dann bei jedem dritten. Denn[1, 2, 3]
das gibt123
, überspringen Sie die Klammern, Kommas und Leerzeichen.[1, 2, 3]
bereits ein String gesetzt wurde und dass Kommas und Leerzeichen übersprungen werden mussten. Vielen Dank!Brachylog ,
910 BytesProbieren Sie es online!
Wie bei Brachylog üblich, handelt es sich um eine Funktionsübermittlung. Der TIO-Link oben wurde mit einem Befehlszeilenargument versehen, um die Funktion in ein vollständiges Programm umzuwandeln.
Ich hatte ein zusätzliches Byte von der ersten Version dieses hinzuzufügen, zu ändern ,
ℕ
umℕ₁
die Ausgabe 0 (etwas , das jetzt ist geklärt worden) zu verbieten.Erläuterung
Ziemlich ineffizient, da der Interpreter eine Liste aller möglichen Werte generiert und dann nach dem Zufallsprinzip
ᶠṛ
auswählt (das bedeutet, Brachylog hatte zum Zeitpunkt der Beantwortung dieser Frage keine Option zum Auswählen einer zufälligen Lösung).Einige Kommentare zur Beschriftung hier: Wenn das
≜
weggelassen wird, erzeugt der Abschnitt innerhalb der geschweiften Klammern nur einen Wert, eine Einschränkung, die Zahlen mit der gewünschten Eigenschaft darstellt. Wenn Sie ein zufälliges Ergebnis auswählen, erhalten Sie die Einschränkung, und der Interpreter gibt den absoluten Mindestwert aus, der die Einschränkung erfüllt (1, 10, 102, 1023, 10234 usw.). Dies ist nicht das, was wir möchten. Wir müssen ihn daher zwingen, die Liste über eine explizite Beschriftung aufzubauen.Die meisten Prolog-Implementierungen, die ich gesehen habe, haben ein eingebautes Element, um ein zufälliges Ergebnis zu finden, das einer Einschränkung entspricht, aber normalerweise nicht mit einheitlicher Wahrscheinlichkeit. Brachylog hatte jedoch keine (eine wurde als Reaktion auf diese Herausforderung hinzugefügt, aber ich kann sie offensichtlich aufgrund von Regelungslücken nicht verwenden). Wenn dies der Fall wäre und es eine einheitliche Wahrscheinlichkeit für dieses Problem geben würde, würde diesem Programm nur
~lℕ₁≠
das eingebaute Programm für eine wahrscheinliche Länge von 6 Bytes folgen.Brachylog , 8 Bytes, in Zusammenarbeit mit @Fatalize
Probieren Sie es online!
Dies ist eine Art genialer Trick auf niedriger Ebene, der nur bei der Art und Weise, wie Prolog Dinge tut, Sinn ergibt und mathematisch nicht viel Sinn ergibt.
~lℕ₁≠
Bildet nach wie vor einen Wert, der eine Einschränkung beschreibt ("Länge gleich der Eingabe, natürliche Zahl, alle Elemente unterschiedlich"). Dann werden≜ᶠ
alle möglichen Werte generiert, die die Bedingung erfüllen. Der Punkt hier ist, dass mit der Bewertungssequenz von Brachylog erst dann eine tatsächliche Auswahl getroffen wird, wenn die≜
angezeigt wird. Die Operation "Alle Lösungen finden"ᶠ
muss also nur für die Operation "Spezifischer Wert, der eine Einschränkung erfüllt" gelten≜
. Das heißt, es ist nicht erforderlich, einen Bereich{…}
auszuwählen, wodurch 2 Byte eingespart werden.quelle
≜₁
bevor mir klar wurde, dass sie aufgrund dieser Herausforderung hinzugefügt wurdeGelee , 9 Bytes
Probieren Sie es online! (wird bei TIO für n> 6 aufgrund der Ineffizienz der Implementierungnicht funktionieren)
oder eine alternative Implementierung der gleichen Sache:
Wie?
Das ist ziemlich hinterhältig und sehr ineffizient! Jelly macht einige nützliche Dinge implizit, wenn ein Atom eine Liste erwartet, aber eine ganze Zahl empfängt (dies ist beabsichtigt).
In diesem Code werden einige dieser nützlichen impliziten Aktionen verwendet:
Ṗ
Wenn das monadische Atom "pop" mit einer Ganzzahleingabe aufgerufen wird, gibt es implizit einen Bereich an, aus dem herausgepoppt werden soll. Eine Eingabe von n ergibt also zuerst [1, 2, ..., n] und dann pop und ergibt [1, 2 , ..., n-1] .Das monadische Atom
Q
"de-duplicate" oder "unique" bewirkt, wenn es mit einer Ganzzahleingabe aufgerufen wird, implizit, dass eine Dezimalliste de-dupliziert wird, also eine Eingabe von n mit:n = d k-1 × 10 k-1 + d k-2 × 10 k-2 + ... + d 1 × 10 + d 0 ergibt
zuerst
[d k-1 , d k-2 , ..., d 1 , d 0 ]
und ergibt dann die eindeutigen Werte durch erster Eindruck.
So würde beispielsweise n = 5835518 [5, 8, 3, 1] ergeben .
Des Weiteren das monadische Atom
M
„maximale Element - Indizes“, die Indizes der maximalen Elemente aus einer Liste zurückgibt, das spart zwei Bytes über die weitaus offensichtliche Alternative der mit dem Eingang für Gleichheit zu testen und truthy Indizes zu finden,⁵*ṖQL$€=⁸TX
oder⁵*ṖðQL⁼ð€TX
Dies ist alles ziemlich ineffizient, sowohl in Bezug auf die Zeit als auch in Bezug auf den Speicher: Zuerst wird eine Liste von 10 n Ganzzahlen erstellt und eine wird verworfen, dann wird für jede dieser eine Liste von n Ganzzahlen (keine ausgefallenen 4-Bit-Objekte oder Aufzählungen) erstellt und dann de-dupliziert. Diese Deduplizierung ist vollständig listenbasiert implementiert (keine Mengen, sortierten Mengen oder Wörterbücher sind im Hintergrund enthalten, jede Ziffer wird in der Liste auf Existenz überprüft, die schließlich ausgegeben wird).
Offline n = 7 verwendet ~ 0,5 GB und dauert ~ 25 Sekunden, während n = 8 ~ 4 GB verwendet und ~ 5 Minuten dauert - ich habe mich nicht darum gekümmert, n = 9 auszuführen, da ich nur 16 GB RAM habe (ich denke, es würde ~ 45 Minuten dauern) ).
Bei der alternativen Implementierung wird nur die integrierte Funktion zum
ÐṀ
schnellen Filtern und Minimieren verwendet (die hier nur einen geringen Verwaltungsaufwand für die gleiche Byte-Anzahl verursacht).quelle
Jelly , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
72717069 ByteDies ist eine rekursive Funktion, die die Anzahl der Stellen x aufnimmt . Der zweite Parameter y , der anfänglich auf die leere Zeichenfolge gesetzt wurde, verfolgt die Zahl, während wir sie Ziffer für Ziffer generieren.
Zuerst erzeugen wir eine zufällige Ziffer z mit
Math.random()*10|0
. Nun wollen wir überprüfen, dass das y kein z enthält und dass y und z nicht beide 0 sind .Wir können die erste Bedingung mit berechnen
!y.match(z)
.y.match(z)
gibt ein Array zurück (immer wahr), wenn y z enthält , sonst null (falsch); Das!
konvertiert dies in einen Booleschen Wert und invertiert ihn.Die zweite Bedingung wird mit geprüft
y|z
. Obwohl y eine Zeichenfolge ist, konvertiert JS diese bei Verwendung implizit in eine Ganzzahl|
. Dies ist eine positive ganze Zahl, wenn y bereits Ziffern enthält, andernfalls 0 . Das Nettoergebnis ist , dassy|z
kehrt 0 iff y leer ist und z ist 0 oder eine positive ganze Zahl anders.Wenn beide Bedingungen erfüllt sind, hängen wir die Ziffer an y an , dekrementieren x und beginnen den Vorgang erneut. Ansonsten kehren wir einfach zum Anfang zurück und hoffen, dass die nächste zufällige Ziffer funktioniert. Wenn x 0 erreicht , geben wir einfach den leeren String zurück, um die Rekursion zu beenden.
Vorherige Version:
Dies ist eine rekursive Funktion, bei der die Anzahl der Stellen eingegeben wird. Der anfänglich undefinierte zweite Parameter, y , ist eine 10-Bit-Nachschlagetabelle, die uns anzeigt, welche Ziffern wir bereits haben, und die bequem als Ganzzahl gespeichert wird.
Zuerst erzeugen wir eine zufällige Ziffer z mit
Math.random()*10|0
. Nun wollen wir überprüfen, dass das z 'niedrigstwertige Bit von y nicht gesetzt ist und dass y und z nicht beide 0 sind .Wir können die erste Bedingung berechnen mit
~y>>z&1
; invertiere y , verschiebe es z Bits nach rechts und nimm nur das niedrigstwertige Bit. Dies ergibt 1, wenn die betreffende Ziffer noch nicht generiert wurde, oder 0, wenn dies nicht der Fall ist .Die zweite Bedingung war anfangs ziemlich schwierig herauszufinden (ich habe zuerst versucht
y/z
zu generieren,NaN
ob sie beide 0 sind), aber irgendwann wurde mir klar, dass dies einfachy|z
der Trick sein würde. Das Ergebnis ist 0 iff sowohl y und z sind 0 ; ansonsten eine positive ganze Zahl.Wenn diese beiden Bedingungen zutreffen (
~y>>z&1&&y|z
), erzeugen wir den Rest der Zahl und stellen z voran . Der Rest der Zahl wird durch erneutes Aufrufen der Funktion mitx-1
undy|1<<z
( y , aber mit dem auf 1 gesetzten Bit am Index z ) generiert . Wenn x 0 erreicht , geben wir einfach den leeren String zurück, um die Rekursion zu beenden.quelle
ClojureScript,
8179 BytesDies ist eine anonyme Funktion, daher müssen Sie sie folgendermaßen verwenden:
Wo Sie
{arguments}
mit Ihren Argumenten ersetzen .Sie können den Code hier ausprobieren (ClojureScript REPL).
Danke,
@cliffroot
dass du 2 Bytes gespart hast!Erweiterter Code:
Erläuterung:
Ich gehe die Zeilen nacheinander durch und verwende ein Beispiel für
8
.Ganz einfach, dies definiert die Funktion
random-digits
mit einem Argument, das aufgerufen wirdn
. In meiner Antwort habe ich eine anonyme Funktion (#(...)
) verwendet, um Bytes zu speichern.Lassen Sie uns
let
von innen nach außen untersuchen:In ClojureScript (und Clojure)
(range n)
ist es ähnlich wie in Pythonrange(n)
: Es gibt Ihnen eine Liste mit jeder Zahl von0
bisn - 1
(9
in diesem Fall).shuffle
Nimmt eine Liste und gibt einen Vektor zurück (der sich geringfügig von einer Liste unterscheidet), bei dem alle Elemente gemischt sind. Anhand unseres Beispiels erhalten wir also Folgendes:(subvec vector start end)
Nimmt einen Vektor (nur einen Vektor) und gibt einen Vektor zurück, der alle Elemente vom Indexstart
bis zum enthältend
. In diesem Fall nehmen wir Elemente vom0
th-Element zum Argument, das an gegeben wirdrandom-digits
. Wenn wir das auf unser Beispiel anwenden, erhalten wir:Diese
if
Anweisung prüft, ob das erste Element vonnum-vector
a0
.Wenn ja
0
, rufen wir die Funktion erneut mit dem Argumentn
using aufrecur
.Wenn es nicht ist
0
:(apply function list)
Nimmt eine Liste und spuckt sie als Argumente in die Funktion. Beispielsweise:Verwandelt sich in:
Welches ist gleich
9
.(str items)
verwandelt jedes Elementitems
in eine Zeichenfolge und verkettet sie dann.int
wandelt alles in eine ganze Zahl um. Wenn wir dies also auf unser Beispiel anwenden, erhalten wir:Welches ist unsere endgültige Antwort.
quelle
(int string)
anstatt(Integer/parseInt string)
:)read-string
in Clojure tun , aber es ist nicht viel besser ...#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))
verschiebtapply str
Teil an das Ende, ermöglicht den Vergleich mit0
statt\0
und verwendetsubvec
statttake
Vektor als Funktion zu verwenden und somit zu entfernenfirst
shuffle
die Sammlung in eine verwandeltvec
. Vielen Dank!Python 2,
898180 BytesProbieren Sie es online aus
quelle
99**n
, nur um sicherzugehen, dass ich sie alle bekomme. : Dif`set(`i`)`[5*n:]]
.R, 45 Bytes
quelle
k=0
da es ein impliziter Vektor der Länge eins ist, und Sie können i = scan () verwenden, um die Eingabe von stdin als Zahl zu übernehmen. Ich bin mir auch nicht sicher, ob eine Ziffernliste eine "richtige" Einreichung ist, aber ich bin nicht der Richter.while(!k[1])
funktionieren, um 2 Bytes zu sparen?Bash + GNU-Utils, 46
Probieren Sie es online aus .
Dies dauert für größere n sehr lange - etwa 30 Sekunden für n = 7 und zehnmal für jedes Inkrement, also wahrscheinlich 8 bis 9 Stunden für n = 10.
quelle
Java 7,
150147145134 Bytes-2 Bytes dank @TheLethalCoder
(alt) Erklärung:
Testcode:
Probieren Sie es hier aus.
Beispielausgabe:
quelle
n->...
oder ist das Java 8+?for(int l,x;(l=r.length())<n;)
und Sie sollten ein Byte speichern.n->...
ist Java 8. Ich persönlich bevorzuge das Codegolf in Java 7, obwohl 8 immer kürzer ist.Perl 6 , 44 Bytes
Versuch es
Erweitert:
quelle
PHP, 67 Bytes
Online Version
Alle Versionen von mischen die Ziffern von 0-9
71 Bytes
73 Bytes
quelle
MATL , 15 Bytes
Probieren Sie es bei MATL Online!
Erläuterung
quelle
Gelee , 12 Bytes
Momentan ein Byte hinter meiner anderen Jelly-Antwort, aber ich mag diese wirklich.
Probieren Sie es online!
Wie es funktioniert
quelle
APL (Dyalog) ,
27 -19 -17 BytesBenötigt,
⎕IO←0
was auf vielen Systemen Standard ist.Probieren Sie es online!
Mische die Ziffern, bis sie gültig sind:
10⊥
Dekodiere von 10-stelligen Zahlen zu regulären Zahlen,⊢
dann↑
erste Elemente von{
...}⍣{
...}
Wiederholen der Funktion ...?⍨10
die ersten zehn positive ganze Zahlen mischen ,bis ...
⊃⍺
die erste Ziffer des letzten Versuchs×
positiv istquelle
Python 2 ,
100939290 BytesVielen Dank an @ mbomb007 für das Abschneiden von 2 Bytes
Versucht die erforderlichen Nummern, bis eine mit eindeutigen Ziffern gefunden wird. Ich wette, es gibt einen viel saubereren Weg, aber mir fällt keiner ein.
quelle
return(n==len(set(`k`)))*k or f(n)
. Versuchen Sie es onlinePyth , 11 Bytes
Verwendet den gleichen Algorithmus wie Dennis 'Antwort .
Probieren Sie es online!
quelle
Perl, 48 Bytes
Erläuterung:
Generieren Sie wiederholt Zufallszahlen von 1 bis 10 ** $ n-1 und lehnen Sie sie ab, bis eine der richtigen Längen (also mindestens 10 ** ($ n-1)) ohne wiederholte Ziffern vorliegt.
quelle
Batch, 156 Bytes
x
pflegt eine Bitmaske der verwendeten Ziffern.f
zeigt die Anzahl der verfügbaren Ziffern an (Countdown von 9). Zufällige Ziffern werden generiert, bis eine nicht verwendete Ziffer gefunden wird.n=10
könnte für 165 Bytes unterstützt werden:(
r
Enthält eine zusätzliche führende Null, weil es so golfer ist.) Vorheriger Ansatz für 165 Bytes hat die erste Ziffer mit einem Sonderfall versehen und auch funktioniertn=10
(die numerische Version hat tatsächlich 166 Bytes gedauert!):Der ursprüngliche Ansatz für 170 Bytes funktionierte auch für
n=10
:Verwendet die Zeichenfolgenmanipulation, um doppelte Ziffern zu erkennen.
quelle
Bash , 66 Bytes
Probieren Sie es online!
Unkompliziert, verwendet shuf, xargs wird zum Verbinden von Zeilen verwendet und versucht es weiter, während die Kombination mit 0 beginnt.
Cant Beat 46 Zeichen von einer anderen Antwort, aber so ist schnell!
quelle
Pyth,
1528 BytesProbieren Sie es hier aus
quelle
0
, also denke ich, dass Sie^TttQ
zu^TtQ
(-1 Byte) wechseln möchten. Bonus!). 2) Alle Ziffern in der Ausgabe müssen eindeutig sein, daher müssen Sie dies irgendwie erzwingen.C #,
127132128126125 BytesProbieren Sie es online!
Entlehnte die Idee von @ KevinCruijssens Antwort , um den Zufall zu initialisieren
r
, in derif
Anweisung, 2 Bytes zu sparen.Ich bin mir ziemlich sicher, dass dies weiter verbessert werden kann, aber ich habe im Moment keine Zeit.
Alte Version mit einer
while
Schleife:quelle
0
, wäre es zunächst versuchen ,if(s.Length<1&r>0)
was falsch ist, aber dann wird es tun ,if(!s.Contains(r+""))
was wahr ist und immer noch append"0"
zus
als erste Ziffer..Next(10)
... nicht mit einem;
. Also keine weiteren Verbesserungen da, aber gute Idee.n=>{var s="";for(int l=0,r;l<n;l=s.Length)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))r+=x;return s;};
C (gcc) ,
123122100951041039997 BytesDieser generiert eine tatsächliche Zufallszahl
Probieren Sie es online!
C (GCC) ,
8785 BytesHier wird eine Ziffernfolge gedruckt.
Probieren Sie es online!
quelle
PHP,
6563 Bytesnimmt Eingaben von STDIN entgegen; renn mit
-nR
.Zufallszahl zwischen
1
und10^N
einschließlich erstellen ;Wiederholen, während die Anzahl der verschiedenen Zeichen <ist
N
.quelle
while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;
-2 BytesMathematica
6560 BytesHier ist eine schnellere Version, die jedoch 9 Bytes hinzufügt:
quelle
Java 9 JShell, 86 Byte
Probieren Sie es online!
Hinweis: Ich zähle die Importe nicht, da diese Pakete standardmäßig in JShell importiert werden. Für JShell ist jedoch kein Try-it-Online-Link bekannt. Daher habe ich einen für Java 9 mit Kopf- und Fußzeilencode für bereitgestellt Lass es in diesem Kontext funktionieren. In JShell können Sie einfach Folgendes tun:
Und dann:
Wie es funktioniert:
Wir definieren eine Funktion von Integer bis Long und erstellen einen unendlichen Strom zufälliger Longs im Bereich von 0 bis 9, begrenzen ihn auf die ersten n-1 Elemente und reduzieren ihn dann mit einem zufälligen int von 1 bis 9 als Anfangswert und Eine Funktion, die den Wert mit 10 multipliziert und den nächsten Wert aus dem Stream hinzufügt.
Ich habe longs verwendet, daher sollte dies für bis zu 18 Ziffern funktionieren (n = 18).
quelle
C,
9693 BytesFisher-Yates mischt die Initialisierung, bis die erste Ziffer nicht mehr Null ist.
Ist einheitlich, vorausgesetzt,
rand()%i
ist einheitlich. (Da ich für die meistenRAND_MAX/i
einen kleinen Rest übrig lasse, gibt es eine sehr kleine Verzerrung. Diese Verzerrung wird kleiner, wenn RAND_MAX größer wird.)Sehen Sie , wie es online funktioniert .
Sehen Sie , wie es die richtigen Zahlen erzeugt, wenn n gleich 2 ist, wie in der Frage gezeigt .
quelle
Axiom, 191 Bytes
ungolf es, Testergebnis
quelle
Qualle , 17 Bytes
Probieren Sie es online!
Antwort von Dennis 'Jelly .
quelle
Rubin,
5352 BytesMische, bis die erste Ziffer nicht mehr als 0 ist. Kombiniere dann die Ziffern und wandle sie in eine Ganzzahl um.
Probieren Sie es online!
quelle