Holen Sie sich eine zufällige n-stellige Zahl mit unterschiedlichen Ziffern und zunächst keine 0

22

Ich habe diese Frage gelesen und dachte, es wäre eine schöne Herausforderung.

Aufgabe

Geben Sie eine Eingabe ein und 0<n<10generieren Sie eine Zufallszahl mit

  • genau n Ziffern
  • der erste nicht a 0
    • so f(n)>10**(n-1)-1
  • eindeutige Ziffern

Gewinnkriterien

Das ist 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=2lautet:

[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]
Roman Gräf
quelle
4
Das Erfordernis der Zufälligkeit ohne Angabe einer Verteilung sollte vermieden werden.
Fehler
Rückgabe als Ganzzahl, keine Zeichenfolge, ja?
Giuseppe
@ Giuseppe erzeugen eine Zufallszahl
mbomb007
4
Ich denke , dies jedes einzelne Mal , wenn jemand eine Zufallszahl Frage macht xkcd.com/221
Thunda
1
@ ais523 "Gib eine Eingabe 0 <n <10
erzeuge

Antworten:

17

Python 2 , 77 Bytes

from random import*
r=range(10)
while[1]>r:shuffle(r)
print`r`[1:input()*3:3]

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 naufgelisteten Ziffern.

xnor
quelle
Läuft definitiv schneller und mit weniger Speicher für die Eingabe von 9oder 10.
mbomb007
Ordentliche Lösung! Können Sie erklären, wie das [1::3]Konvertieren von einer Liste in eine Zeichenfolge funktioniert? Das habe ich noch nie gesehen.
Julian Wolf
@JulianWolf Es funktioniert nur, wenn jedes Element der Liste dieselbe Länge hat. Tatsächlich wird die Zeichenfolgendarstellung der Liste verwendet, und nach dem Überspringen des ersten Zeichens wird jede dritte Stelle in Segmente unterteilt [.
mbomb007
@JulianWolf [1::3]erhält den Charakter bei Index 1, dann bei jedem dritten. Denn [1, 2, 3]das gibt 123, überspringen Sie die Klammern, Kommas und Leerzeichen.
Dennis
Schieß, okay - das macht Sinn. Ich vergaß, dass [1, 2, 3]bereits ein String gesetzt wurde und dass Kommas und Leerzeichen übersprungen werden mussten. Vielen Dank!
Julian Wolf
10

Brachylog , 9 10 Bytes

{~lℕ₁≜≠}ᶠṛ

Probieren 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

{~lℕ₁≜≠}ᶠṛ
{      }ᶠṛ  Pick a random value with these properties:
 ~l           it has length equal to the input;
   ℕ₁         it's a positive integer;
     ≜        it's a specific value (not a constraint);
      ≠       all its elements (digits in this case) are different.

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

~lℕ₁≠≜ᶠṛ

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
Ich wollte eine Lösung mit posten, ≜₁bevor mir klar wurde, dass sie aufgrund dieser Herausforderung hinzugefügt wurde
Unrelated String
8

Gelee , 9 Bytes

⁵*ṖQL$€MX

Probieren Sie es online! (wird bei TIO für n> 6 aufgrund der Ineffizienz der Implementierungnicht funktionieren)

oder eine alternative Implementierung der gleichen Sache:

⁵*ṖQL$ÐṀX

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$€=⁸TXoder⁵*ṖðQL⁼ð€TX

⁵*ṖQL$€MX - Main link: n                       e.g. 2
⁵         - literal 10
 *        - exponentiate: 10^n                      100
  Ṗ       - pop (make range 1 to 10^n, then pop)    [1  ,2  ,...,21   ,22 ,23   ,...,97   ,98   ,99]
     $€   - last two links as a monad for €ach:
   Q      -   unique (makes a decimal list first)   [[1],[2],...,[2,1],[2],[2,3],...,[9,7],[9,8],[9]]
    L     -   length                                [1  ,1  ,...,2    ,1  ,2    ,...,2    ,2    ,1  ]
       M  - indexes of maximal elements             [        ...,21       ,23,   ...,97   ,98       ]
          -                                         - i.e. all n-digit numbers with n-distinct digits.
        X - pick a random element from that list

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

Jonathan Allan
quelle
Oh wow. Ich habe etwas sehr Ähnliches versucht, habe aber den Trick übersehen, die Werte zu speichern, um sie in den Listenindizes zurückzugeben (durch geeignetes Auffüllen der Liste), anstatt zu versuchen, sie separat zu speichern. Dies ist ein Trick, der in Jelly ziemlich oft nützlich ist und ich scheine ihn immer zu vermissen.
7

Jelly , 11 Bytes

9Xœ|⁵ḶẊ¤ḣ¹Ḍ

Probieren Sie es online!

Wie es funktioniert

9Xœ|⁵ḶẊ¤ḣ¹Ḍ  Main link. Argument: n

9            Set the return value to 9.
 X           Pick; pseudo-randomly select an integer from [1, ..., 9].
       ¤     Combine the three preceding links into a niladic chain.
    ⁵          Yield 10.
     Ḷ         Unlength; yield [0, ..., 9].
      Ẋ        Shuffle; pseudo-randomly select a permutation of [0, ..., 9].
  œ|         Multiset OR; prepend the selected integer to the selected permutation
             and remove the second occurrence of the first element.
         ¹   Identity; yield n.
        ḣ    Head; keep the first n digits of the permutation.
          Ḍ  Undecimal; convert from base 10 to integer.
Dennis
quelle
Das ist eine sehr clevere Möglichkeit, das Duplikat zu entfernen ...
Undichte Nonne
7

JavaScript (ES6), 72 71 70 69 Byte

f=(x,y="")=>x?!y.match(z=Math.random()*10|0)&&y|z?f(x-1,y+z):f(x,y):y

Dies 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 , dass y|zkehrt 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:

f=(x,y)=>x?~y>>(z=Math.random()*10|0)&1&&y|z?z+f(x-1,y|1<<z):f(x,y):""

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/zzu generieren, NaNob sie beide 0 sind), aber irgendwann wurde mir klar, dass dies einfach y|zder 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 mit x-1und y|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.

ETHproductions
quelle
5

ClojureScript, 81 79 Bytes

#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))

Dies ist eine anonyme Funktion, daher müssen Sie sie folgendermaßen verwenden:

(#(...) {arguments})

Wo Sie {arguments}mit Ihren Argumenten ersetzen .

Sie können den Code hier ausprobieren (ClojureScript REPL).

Danke, @cliffrootdass du 2 Bytes gespart hast!


Erweiterter Code:

(defn random-digits [n]
  (let [num-vector
        (subvec
          (shuffle (range 10))
          0 n)]
    (if (= (num-vector 0) 0)
      (recur n)
      (int (apply str num-vector)))))

Erläuterung:

Ich gehe die Zeilen nacheinander durch und verwende ein Beispiel für 8.


(defn random-digits [n] ...)

Ganz einfach, dies definiert die Funktion random-digitsmit einem Argument, das aufgerufen wird n. In meiner Antwort habe ich eine anonyme Funktion ( #(...)) verwendet, um Bytes zu speichern.


(let [num-vector ...] ...)

Lassen Sie uns letvon innen nach außen untersuchen:

(shuffle (range 10))

In ClojureScript (und Clojure) (range n)ist es ähnlich wie in Python range(n): Es gibt Ihnen eine Liste mit jeder Zahl von 0bis n - 1( 9in diesem Fall).

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

[1 0 8 3 6 7 9 2 4 5]

(subvec {see above} 0 n)

(subvec vector start end)Nimmt einen Vektor (nur einen Vektor) und gibt einen Vektor zurück, der alle Elemente vom Index startbis zum enthält end. In diesem Fall nehmen wir Elemente vom 0th-Element zum Argument, das an gegeben wird random-digits. Wenn wir das auf unser Beispiel anwenden, erhalten wir:

[1 0 8 3 6 7 9 2]

(if (= (num-vector 0) 0)
  (recur n)
  (int (apply str num-vector)))

Diese ifAnweisung prüft, ob das erste Element von num-vectora 0.

Wenn ja 0, rufen wir die Funktion erneut mit dem Argument nusing auf recur.

Wenn es nicht ist 0:


(int (apply str num-vector))

(apply function list)Nimmt eine Liste und spuckt sie als Argumente in die Funktion. Beispielsweise:

(apply + [2 3 4])

Verwandelt sich in:

(+ 2 3 4)

Welches ist gleich 9.

(str items)verwandelt jedes Element itemsin eine Zeichenfolge und verkettet sie dann. intwandelt alles in eine ganze Zahl um. Wenn wir dies also auf unser Beispiel anwenden, erhalten wir:

   (int (apply str [1 0 8 3 6 7 9 2]))
=> (int (str 1 0 8 3 6 7 9 2))
=> (int "10836792")
=> 10836792

Welches ist unsere endgültige Antwort.

Clismique
quelle
2
Ich muss ClojureScript lieben, weil es erlaubt (int string)anstatt (Integer/parseInt string):)
Cliffroot
1
@ Cliffroot Ich meine, Sie können read-stringin Clojure tun , aber es ist nicht viel besser ...
Clismique
2 Bytes gespeichert #(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))verschiebt apply strTeil an das Ende, ermöglicht den Vergleich mit0 statt \0und verwendet subvecstatt takeVektor als Funktion zu verwenden und somit zu entfernenfirst
Cliffroot
@ Cliffroot Huh, wusste nicht, dass shuffledie Sammlung in eine verwandelt vec. Vielen Dank!
Müssen
5

Python 2, 89 81 80 Bytes

from random import*
lambda n:choice([i for i in range(10**n)if`set(`i`)`[5*n:]])

Probieren Sie es online aus

mbomb007
quelle
Ich glaube nicht, dass Sie einen Startwert für den Bereich benötigen.
Dennis
Nett! Das wird es verlangsamen. : D Schade, ich kann keinen Generator anstelle einer Liste verwenden.
mbomb007
Nur um 11%. Lassen Sie sich für Codegolf in einen Eimer fallen.
Dennis
Ja, ich sollte verwenden 99**n, nur um sicherzugehen, dass ich sie alle bekomme. : D
mbomb007
Ich wollte es auch so machen, bekam aber 80, indem ich benutzte if`set(`i`)`[5*n:]].
Jonathan Allan
5

R, 45 Bytes

k=0
i=scan()
while(!k[1])k=sample(0:9)[1:i]
k
Neil
quelle
Ich denke, Sie können einfach festlegen, k=0da 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.
Giuseppe
@ Giuseppe Danke für die Eingabe, beide Vorschläge aktualisiert (auf beiden Posts), danke.
Neil
Würde es while(!k[1])funktionieren, um 2 Bytes zu sparen?
BLT
@BLT Aktualisiert, danke.
Neil
3

Bash + GNU-Utils, 46

seq 1e$[$1-1] 1e$1|egrep -v '(.).*\1'|shuf -n1

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.

Digitales Trauma
quelle
laut
frage
3

Java 7, 150 147 145 134 Bytes

String c(int n){String r="";for(int l,x;(l=r.length())<n;)if(l<1&(x=(int)(Math.random()*10))>0|(l>0&!r.contains(""+x)))r+=x;return r;}

-2 Bytes dank @TheLethalCoder

(alt) Erklärung:

String c(int n){                           // Method with integer parameter and String return-type
  String r="";                             //  Result-String
  for(int l=0,x;l<n;l=r.length()){         //  Loop until the length of the result-String is equal to the parameter integer
    x=new java.util.Random().nextInt(10);  //   Random digit
    if((l<1&x>0)                           //   If the length is zero and the random digit is not zero
       |(l>0&!r.contains(""+x)))           //     or the length is at least 1, and the result-String does not contain this random digit yet
      r+=x;                                //    Append the random digit to the result-String
  }                                        //  End of for-loop
  return r;                                //  Return result-String
}                                          // End of method

Testcode:

Probieren Sie es hier aus.

class M{
  String c(int n){String r="";for(int l,x;(l=r.length())<n;)if(l<1&(x=(int)(Math.random()*10))>0|(l>0&!r.contains(""+x)))r+=x;return r;}

  public static void main(String[] a){
    M m = new M();
    System.out.println(m.c(4));
    System.out.println(m.c(10));
  }
}

Beispielausgabe:

7194
8672953041
Kevin Cruijssen
quelle
Können Sie hier keinen Lambda-Ausdruck verwenden ? dh n->...oder ist das Java 8+?
TheLethalCoder
1
Sie können auch den Trick ausleihen, den ich gerade in meiner Antwort verwendet habe, die Länge in der Vergleichsüberprüfung einstellen, dh for(int l,x;(l=r.length())<n;)und Sie sollten ein Byte speichern.
TheLethalCoder
1
@TheLethalCoder Ah natürlich danke. Tolle Teamarbeit! ;) Und ja, n->...ist Java 8. Ich persönlich bevorzuge das Codegolf in Java 7, obwohl 8 immer kürzer ist.
Kevin Cruijssen
2

Perl 6 , 44 Bytes

{(->{+[~] (^10).pick($_)}...*>9 x$_-1).tail}

Versuch es

Erweitert:

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

    ->{  # pointy block lambda with no parameters

      +                # turn the following into a numeric
      [~]              # concatenate the following

        (^10).pick($_) # grab $_ digits at random from 0..9
    }

    ...                # keep doing that until

    * > 9 x $_-1       # one of them is big enough

  ).tail # return the last one (only valid one)
}
Brad Gilbert b2gills
quelle
2

PHP, 67 Bytes

Online Version

Alle Versionen von mischen die Ziffern von 0-9

for($a=range(0,9);!$a[0];)shuffle($a);for(;$i<$argn;)echo$a[+$i++];

71 Bytes

for($s="0123456789";!$s[0];)$s=str_shuffle($s);echo substr($s,0,$argn);

73 Bytes

for($a=range(0,9);!$a[0];)shuffle($a);echo join(array_slice($a,0,$argn));
Jörg Hülsermann
quelle
2

MATL , 15 Bytes

`4Y2GZr1)48=]8M

Probieren Sie es bei MATL Online!

Erläuterung

`        % Do...while
  4Y2    %   Push predefined literal '0123456789'
  G      %   Push input n
  Zr     %   Random sample of n unique characters from that string
  1)     %   Pick the first
  48=    %   Is it 48? This is the loop condition
]        % End. If top of the stack evaluates to true: next iteration
8M       % Push the latest random sample. Implicitly display
Luis Mendo
quelle
2

Gelee , 12 Bytes

9×!X+!Œ?’ḣƓḌ

Momentan ein Byte hinter meiner anderen Jelly-Antwort, aber ich mag diese wirklich.

Probieren Sie es online!

Wie es funktioniert

9×!X+!Œ?’ḣƓḌ  Main link. No arguments.

9             Set the argument and the return value to 9.
  !           Yield 9!
 ×            Compute 9 × 9!.
   X          Pick; pseudo-randomly select an integer j from [1, ..., 9 × 9!].
     !        Yield 9!
    +         Compute k := j + 9!.
              The result will belong to [9! + 1, 10!].
      Œ?      Get the permutation P of R := [1, ..., r], with minimal r, such that
              P is the lexicographically k-th permutation of R.
              Since k belongs to [9! + 1, 10!], r = 10 and this generates a per-
              mutation between [2,1,3,4,5,6,7,8,9,10] and [10,9,8,7,6,5,4,3,2,1].
        ’     Subtract 1 from all integers in P.
          Ɠ   Read an integer n from STDIN and yield it.
         ḣ    Head; keep the first n digits of the permutation.
           Ḍ  Undecimal; convert from base 10 to integer.
Dennis
quelle
2

APL (Dyalog) , 27 - 19 - 17 Bytes

Benötigt, ⎕IO←0was auf vielen Systemen Standard ist.

10⊥⊢↑{?⍨10}⍣{×⊃⍺}

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 ist

Adam
quelle
1

Python 2 , 100 93 92 90 Bytes

Vielen Dank an @ mbomb007 für das Abschneiden von 2 Bytes

from random import*
def f(n):k=randint(10**~-n,10**n-1);return(n==len(set(`k`)))*k or f(n)

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.

Julian Wolf
quelle
return(n==len(set(`k`)))*k or f(n). Versuchen Sie es online
mbomb007
1

Pyth , 11 Bytes

jk<{+OS9.ST
jk<{+OS9.STQ implicit Q

       9     9
      S      [1,2,3,4,5,6,7,8,9]
     O       random element

          T  10
        .S   random permutation of [0,1,2,3,4,5,6,7,8,9]

    +        add the results from the previous two paragraphs together
   {         deduplicate
  <        Q first (input) elements
jk           join by empty string

Verwendet den gleichen Algorithmus wie Dennis 'Antwort .

Probieren Sie es online!

Undichte Nonne
quelle
1

Perl, 48 Bytes

1until$_=1+int rand 10**$n-1,/.{$n}/&&!/(.).*\1/

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.

ysth
quelle
1

Batch, 156 Bytes

@set/af=9,r=x=0
@for /l %%i in (1,1,%1)do @call:c
@echo %r%
@exit/b
:c
@set/a"d=9-%random%%%f,e=x>>d&1
@if %e%==1 goto c
@set/a"r=r*10+d,f=10,x|=1<<d

xpflegt eine Bitmaske der verwendeten Ziffern. fzeigt die Anzahl der verfügbaren Ziffern an (Countdown von 9). Zufällige Ziffern werden generiert, bis eine nicht verwendete Ziffer gefunden wird. n=10könnte für 165 Bytes unterstützt werden:

@set/af=9,r=x=0
@for /l %%i in (1,1,%1)do @call:c
@echo %r:~1%
@exit/b
:c
@set/a"d=9-%random%%%f,e=x>>d&1
@if %e%==1 goto c
@set r=%r%%d%
@set/a"f=10,x|=1<<d

( rEnthä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 funktioniert n=10(die numerische Version hat tatsächlich 166 Bytes gedauert!):

@set/ar=%random%%%9+1,x=0
@for /l %%i in (2,1,%1)do @set/a"x|=1<<d"&call:c
@echo %r%
@exit/b
:c
@set/a"d=%random%%%10,e=x>>d&1
@if %e%==1 goto c
@set r=%r%%d%

Der ursprüngliche Ansatz für 170 Bytes funktionierte auch für n=10:

@set/ar=%random%%%9+1
@for /l %%i in (2,1,%1)do @call:c
@echo %r%
@exit/b
:c
@set/ad=%random%%%10
@call set s=%%r:%d%=%%
@if not "%s%"=="%r%" goto c
@set r=%r%%d%

Verwendet die Zeichenfolgenmanipulation, um doppelte Ziffern zu erkennen.

Neil
quelle
1

Bash , 66 Bytes

a=0;while [[ $a == 0* ]];do a=`shuf -i0-9 -n$1|xargs`;done;echo $a

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!

marcosm
quelle
1

Pyth, 15 28 Bytes

=+YhO9VtQ#KOTI!hxYK=+YKB;jkY

Probieren Sie es hier aus

Maria
quelle
1
Willkommen bei PPCG und tolle Arbeit mit einer Golfsprache von Anfang an :-) Ich sehe 2 kleine Probleme: 1) Es scheint, dass die zweite Ziffer immer ist 0, also denke ich, dass Sie ^TttQzu ^TtQ(-1 Byte) wechseln möchten. Bonus!). 2) Alle Ziffern in der Ausgabe müssen eindeutig sein, daher müssen Sie dies irgendwie erzwingen.
ETHproductions
@ETHproductions Arg !! Vielen Dank für den Hinweis. Ich habe es behoben.
Maria
1

C #, 127 132 128 126 125 Bytes

n=>{var s="";for(int l,r;(l=s.Length)<n;)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))s+=r;return s;};

Probieren 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 whileSchleife:

n=>{var s="";while(s.Length<n){int r=new System.Random().Next(10);if(s.Length<1&r>0)s+=r;else if(!s.Contains(r+""))s+=r;}return s;};
TheLethalCoder
quelle
Das halte ich nicht für richtig. Lassen Sie uns sagen , dass die erste Zufallszahl ist 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"zu sals erste Ziffer.
Kevin Cruijssen
@ KevinCruijssen Fest und Golf weiter
TheLethalCoder
1
@ KevinCruijssen Ah, ich habe es herausgefunden, in deinem Beispiel beendest du das .Next(10)... nicht mit einem ;. Also keine weiteren Verbesserungen da, aber gute Idee.
TheLethalCoder
1
Ich habe es gerade gepostet. Und hoppla, du hast recht, ich habe das 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;};
Semikolon
1
@ KevinCruijssen Ich habe die Idee gerade aus Ihrer Antwort entlehnt, als Sie diesen Kommentar geschrieben haben! Nette Verbesserung danke
TheLethalCoder
1

C (gcc) , 123 122 100 95 104 103 99 97 Bytes

Dieser generiert eine tatsächliche Zufallszahl

j;f(n){for(int i,k=n,s[10]={j=0};n;s[i+=i?0:k==n]=!s[i]?j+=i*pow(10,--n):1)i=rand()%10;return j;}

Probieren Sie es online!

C (GCC) , 87 85 Bytes

Hier wird eine Ziffernfolge gedruckt.

f(n){for(int i,k=n,s[10]={0};n;s[i+=i?0:k==n]=!s[i]?--n,putchar(48+i):1)i=rand()%10;}

Probieren Sie es online!

Cleblanc
quelle
1

PHP, 65 63 Bytes

while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;

nimmt Eingaben von STDIN entgegen; renn mit-nR .

Zufallszahl zwischen 1und 10^Neinschließlich erstellen ;
Wiederholen, während die Anzahl der verschiedenen Zeichen <ist N.

Titus
quelle
1
while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;-2 Bytes
Jörg Hülsermann
0

Mathematica 65 60 Bytes

0For[a=11,Max@DigitCount@a>1,a=RandomInteger[10^{#-1,#}]]+a&

Hier ist eine schnellere Version, die jedoch 9 Bytes hinzufügt:

FromDigits@Join[f=(s=RandomSample)[r=Range@9,1],s[r/.f[[1]]->0,#-1]]&
Kelly Lowder
quelle
0

Java 9 JShell, 86 Byte

n->new Random().longs(0,10).limit(n-1).reduce(new Random().nextInt(9)+1,(a,b)->a*10+b)

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:

jshell> Function<Integer,Long> f =
   ...> n->new Random().longs(0,10).limit(n-1).reduce(new Random().nextInt(9)+1,(a,b)->a*10+b)
f ==> $Lambda$27/633070006@5702b3b1

Und dann:

jshell> f.apply(6)
$26 ==> 746202

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

David Conrad
quelle
0

C, 96 93 Bytes

f(n){char d[11],i=0,r;for(;i++^10;d[i-1]=d[r=rand()%i],d[r]=47+i);*d^48?d[n]=0,puts(d):f(n);}

Fisher-Yates mischt die Initialisierung, bis die erste Ziffer nicht mehr Null ist.

Ist einheitlich, vorausgesetzt, rand()%iist einheitlich. (Da ich für die meisten RAND_MAX/ieinen 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 .

2501
quelle
0

Axiom, 191 Bytes

g(a:NNI):Complex INT==(a<1 or a>9=>%i;r:List NNI:=[];b:=a;repeat(a=0=>break;d:=random()$INT rem 10;a=b and d=0=>0;~member?(d,r)=>(a:=a-1;r:=cons(d,r)));reduce(+,[r.i*10^(i-1)for i in 1..#r]))

ungolf es, Testergebnis

-- Return one number of 'a' different random digits if 0<a<10
f(a:NNI):Complex INT==
    a<1 or a>9=>%i
    r:List NNI:=[];b:=a
    repeat
       a=0=>break
       d:=random()$INT rem 10
       a=b and d=0  =>0
       ~member?(d,r)=>(a:=a-1;r:=cons(d,r))
    reduce(+,[r.i*10^(i-1)for i in 1..#r])

(4) -> [[i,g(i)] for i in 0..10]
   (4)
   [[0,%i], [1,9], [2,76], [3,135], [4,6810], [5,48675], [6,415768],
    [7,7461539], [8,98421537], [9,825046739], [10,%i]]
                                          Type: List List Complex Integer
(5) -> [[i,g(i)] for i in [3,3,3,3,3,3,3,3,3]]
   (5)
   [[3,653],[3,128],[3,254],[3,268],[3,914],[3,594],[3,276],[3,240],[3,398]]
RosLuP
quelle
0

Rubin, 53 52 Bytes

Mische, bis die erste Ziffer nicht mehr als 0 ist. Kombiniere dann die Ziffern und wandle sie in eine Ganzzahl um.

->n{a=*0..9;a.shuffle!while a[0]==0;eval a[0,n]*''}

Probieren Sie es online!

Wert Tinte
quelle