Die einzigartige PIN-Liste für Vorhängeschlösser!

16

Einführung

In einem privaten Chat ist ein Freund von mir anscheinend kürzlich auf ein Sicherheitssystem gestoßen, das die folgenden zwei Einschränkungen für seine gültigen Pins aufweist:

  • Jede Ziffer muss eindeutig sein (dh "1" darf nur einmal vorkommen)
  • Die Reihenfolge der Ziffern spielt keine Rolle ("1234" = "4321")

Um zu veranschaulichen, wie schlecht dieses Vorhängeschlosssystem ist, listen wir alle gültigen PINs auf!

Eingang

Ihre Eingabe besteht aus einer einzelnen positiven Ganzzahl, die die Länge der PIN angibt.

Ausgabe

Ihre Ausgabe besteht aus einer Liste nicht negativer Ganzzahlen oder Zeichenfolgen *, die alle gültigen PINs der angegebenen Länge auflisten.

* Genauer gesagt, etwas, mit dem ein Mensch alle Kombinationen ausprobieren kann, wenn Sie es für sie drucken würden. Dies bedeutet, dass ein Satz von Ziffernsätzen und Arrays von Ziffernarrays in Ordnung sind.

Wer gewinnt?

Das ist also gewinnt die kürzeste Antwort in Bytes! Standardregeln und Lücken gelten.

Eckkoffer

  • Das Ausgabeverhalten ist undefiniert, wenn eine Ganzzahl größer als 10 eingegeben wird.
  • Die Reihenfolge der Ziffern in jedem Ausgabeeintrag ist undefiniert, da Einträge mit einer Null tatsächlich diese Null enthalten. Das heißt, Sie dürfen nicht "0123" bis "123" streifen, sondern "1230", "1203" und "1023" sind alle gültig wie ist "0123".

Testfälle

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

2
[10,20,30,40,50,60,70,80,90,21,31,41,51,61,71,81,91,32,42,52,62,72,82,92,43,53,63,73,83,93,54,64,74,84,94,65,75,85,95,76,86,96,87,97,98]

3
[210,310,410,510,610,710,810,910,320,420,520,620,720,820,920,430,530,630,730,830,930,540,640,740,840,940,650,750,850,950,760,860,960,870,970,980,321,421,521,621,721,821,921,431,531,631,731,831,931,541,641,741,841,941,651,751,851,951,761,861,961,871,971,981,432,532,632,732,832,932,542,642,742,842,942,652,752,852,952,762,862,962,872,972,982,543,643,743,843,943,653,753,853,953,763,863,963,873,973,983,654,754,854,954,764,864,964,874,974,984,765,865,965,875,975,985,876,976,986,987]

4
[3210,4210,5210,6210,7210,8210,9210,4310,5310,6310,7310,8310,9310,5410,6410,7410,8410,9410,6510,7510,8510,9510,7610,8610,9610,8710,9710,9810,4320,5320,6320,7320,8320,9320,5420,6420,7420,8420,9420,6520,7520,8520,9520,7620,8620,9620,8720,9720,9820,5430,6430,7430,8430,9430,6530,7530,8530,9530,7630,8630,9630,8730,9730,9830,6540,7540,8540,9540,7640,8640,9640,8740,9740,9840,7650,8650,9650,8750,9750,9850,8760,9760,9860,9870,4321,5321,6321,7321,8321,9321,5421,6421,7421,8421,9421,6521,7521,8521,9521,7621,8621,9621,8721,9721,9821,5431,6431,7431,8431,9431,6531,7531,8531,9531,7631,8631,9631,8731,9731,9831,6541,7541,8541,9541,7641,8641,9641,8741,9741,9841,7651,8651,9651,8751,9751,9851,8761,9761,9861,9871,5432,6432,7432,8432,9432,6532,7532,8532,9532,7632,8632,9632,8732,9732,9832,6542,7542,8542,9542,7642,8642,9642,8742,9742,9842,7652,8652,9652,8752,9752,9852,8762,9762,9862,9872,6543,7543,8543,9543,7643,8643,9643,8743,9743,9843,7653,8653,9653,8753,9753,9853,8763,9763,9863,9873,7654,8654,9654,8754,9754,9854,8764,9764,9864,9874,8765,9765,9865,9875,9876]
SEJPM
quelle
1
Die Eingabe ist nicht negativ - bei Eingabe Null sollte das Programm eine Liste mit einem Wert sein, die leere Zeichenfolge?
Aschepler
@taschepler in der Tat ist der Null-Fall ungefähr so ​​sinnvoll wie der 11-Fall, also habe ich ihn in "positive ganze Zahl" geändert.
SEJPM

Antworten:

7

Gelee , 4 Bytes

ØDœc

Probieren Sie es online!

Erläuterung

ØDœc  Double-builtin; main link
  œc  Number of combinations of          of length
ØD                              [digits]
                                                   <right argument>

Verhalten für n > 10ist leere Liste.

HyperNeutrino
quelle
Wie funktioniert es nicht mit Eingaben größer als 10 (habe es ausprobiert und kam mir komisch vor)?
Windmill Cookies
2
@ gnu-nobody gibt es die leere Liste, weil Sie keine Kombination von 11 Elementen mit 10 Auswahlmöglichkeiten haben können.
HyperNeutrino
oh, der ØD ist der "0123456789". Vielen Dank.
Windmill Cookies
6

05AB1E , 5 Bytes

žhæsù

Probieren Sie es online!

Erläuterung

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789
Emigna
quelle
Wusste nicht, ùwar eine Sache. Ich bin mir ziemlich sicher, dass ich vorher Filter verwendet habe. Wie neu ist das?
Magic Octopus Urn
1
@MagicOctopusUrn: Ziemlich alt.
Schon
Mir ist klar, dass ich den Befehl nicht vor dem Jetzt sehe. Ich bin kein Hirn schlau.
Magic Octopus Urn
Ist mir schon ein paar Mal passiert. Mehr als einmal auf einige Befehle, die ist ...
Emigna
... akzeptabel für einen Gott-Tier-05AB1Er (05AB1E-ite? 05AB1E-an?) wie Sie.
Magic Octopus Urn
6

JavaScript (ES7), 89 Byte

Gibt eine Liste mit Ziffernlisten (als Zeichen) oder eine leere Liste zurück, wenn n> 10 ist .

n=>[...2**29+'4'].reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).filter(a=>a.length==n)

Probieren Sie es online!

Wie?

Wir generieren zunächst eine Liste aller Dezimalstellen als Zeichen , indem wir 2 29 = 536870912 berechnen , die fehlende '4' hinzufügen und aufteilen :

[...2**29+'4']  [ '5', '3', '6', '8', '7', '0', '9', '1', '2', '4' ]

Wir berechnen dann das Powerset:

.reduce(                                   ,[[]]) // starting with a[] holding an empty list
        (a,x)=>[                          ]       // for each decimal digit x:
                ...a,                             //   copy all previous entries in a[]
                     ...a.map(y=>        )        //   and duplicate each previous entry y
                                 [x,...y]         //   with x prepended at the beginning

Schließlich filtern wir die Ergebnisse nach ihrer Länge:

.filter(a=>a.length==n)
Arnauld
quelle
4

Python 3 , 57 Bytes

lambda l:combinations(range(10),l)
from itertools import*

Probieren Sie es online!

Findet alle Kombinationen 0 .. 9von Längen l.

Verhalten für n > 10ist leere Liste.

HyperNeutrino
quelle
4

Python 2 , 62 Bytes

f=lambda n:{d+s for d in`5**19`*n for s in f(n-1)if d>s}or{''}

Gibt eine Reihe von Zeichenfolgen zurück.

Probieren Sie es online!

Dennis
quelle
3

R , 17 Bytes

combn(0:9,scan())

Probieren Sie es online!

Fehler bei der Eingabe größer als 10.

Gibt a zurück, matrixwobei jede Spalte eine PIN ist.

Giuseppe
quelle
2

MATL , 6 Bytes

4Y2wXN

Probieren Sie es online!

Gibt nichts (leeres Array) für zurück k>10.

          % implicit input k
4Y2       % push '0':'9'
   w      % swap top two elements of stack
    XN    % nchoosek, select all k-combinations of '0':'9' as a char array
          % implicit output
Giuseppe
quelle
2

Java (JDK 10) , 105 Byte

n->{var s="";for(int i=1024,j;i-->0;s+=" ")for(j=10;n.bitCount(i)==n&j-->0;)s+=(1<<j&i)>0?j:"";return s;}

Probieren Sie es online!

Olivier Grégoire
quelle
2

Haskell , 47 Bytes

f 0=[[]]
f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]

Probieren Sie es online!

Erläuterung

Wenn die Anzahl der Ziffern Null ist, gibt es nur eine Kombination, nämlich die leere:

f 0=[[]]

Wenn die Anzahl der Ziffern nund n/=0die Kombinationen alle Möglichkeiten sind, Ziffern zu Kombinationen hinzuzufügen, f$n-1so dass zu einer Kombination, die diese bereits enthält, keine Ziffer hinzugefügt wird.

f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]
Weizen-Assistent
quelle
2

Gaia ,  4  3 Bytes

₸…K

Probieren Sie es online!

Es ist schon eine Weile her, dass ich eine Antwort in Gaia gepostet habe! Vielen Dank an Herrn Xcoder für das Speichern eines Bytes!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly
Giuseppe
quelle
Das brauchst du nicht @.
Mr. Xcoder
@ Mr.Xcoder danke. Ich habe das nicht bemerkt. es scheint nicht sehr klar dokumentiert zu sein.
Giuseppe
2

Netzhaut , 51 36 Bytes

.+
10*
"$+"{%`^.
*_$&
L$v`_+
$.%`$%'

Probieren Sie es online! Gibt nichts aus für n>10. Erläuterung:

.+
10*

Ersetzen Sie den Eingang durch 10 _s.

"$+"{

Wiederholen Sie den Rest der Programmzeiten n.

%`^.
*_$&

Stellen Sie jeder Zahl ein _Wiederholungszeichen entsprechend ihrer ersten Ziffer voran.

L$v`_+

Alle _s abgleichen, aber auch alle folgenden _s in das Match aufnehmen, für die wir überlappende Matches aktivieren müssen.

$.%`$%'

Stellen _Sie für jedes gefundene Zeichen der Zahl die Anzahl _s links davon voran.

Dies ist ein bisschen knifflig, daher wäre ein tatsächlicher Fall vielleicht besser. Angenommen, wir haben die Schleife bereits zweimal durchlaufen, sodass alle zweistelligen PINs generiert wurden, und wir arbeiten derzeit daran, dreistellige PINs zu erstellen. Wir werden uns ansehen, was passiert 36: Die erste Ziffer ist 3, also drei _s voranzustellen ___36. Dies erzeugt dann die folgenden Übereinstimmungen, die hier mit `'s markiert sind :

Match   $%` $.%`
`___'36     0
_`__'36 _   1
__`_'36 __  2

$%'auswertet , um 36in allen drei Fällen in den 3-stelligen PINs resultierenden 036, 136und 236.

Wenn wir dann fortfahren 036würden, vierstellige PINs zu erstellen, hätten wir kein _Präfix und würden daher in der endgültigen Ausgabe überhaupt keine Übereinstimmungen ergeben.

Neil
quelle
Die Frage besagt, dass die Eingabe nicht negativ ist. Bei Eingabe von Null werden zehn Unterstriche ausgegeben.
Aschepler
@ Taschepler In der Tat; Ich sehe, das OP hat beschlossen, diesen Fall auszuschließen, aber für den Fall, dass Sie sich wundern, wäre die Korrektur das Voranstellen ^0und zu einem Preis von 5 Bytes.
Neil
1

Proton , 43 Bytes

(0..9)&__import__("itertools").combinations

Probieren Sie es online!

Proton übertrifft schließlich Python: DI dachte, er (import itertools)würde den Wert zurückgeben, aber anscheinend bin ich dabei gescheitert. Auch das anschließende Importieren *funktioniert nicht, da es sich nicht um ein Lambda handelt, sondern um einen Ausdruck der obersten Ebene.

HyperNeutrino
quelle
1

Japt, 5 Bytes

Gibt ein Array von Ziffern-Arrays aus. Gibt alle Kombinationen aus, wenn input 0oder ein leeres Array ist, wenn input <0oder ist >10.

Ao àU

Versuch es


Erläuterung

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U
Zottelig
quelle
Ich denke nicht, dass der Ausgang für Eingang 0 korrekt ist. Die Ausgabe sollte eine Liste sein, die ein Element enthält, das leer ist.
Aschepler
@taschepler, woher holst du das?
Zottelig
1

Stax , 4 Bytes

Vd,S

Probieren Sie es online!

Vdist "0123456789". ,schiebt die Eingabe in den Hauptstapel. SRuft Kombinationen der angegebenen Größe ab.

In der tio Link, m in der Fußzeile zum Drucken der einzelnen Ausgaben verwendet.

rekursiv
quelle
1

Standard ML , 124 122 121 Bytes

open List;fun f(s:: &)m=(if exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!0=[[]]| !n=concat(tabulate(10,f(!(n-1))))

Probieren Sie es online!Anwendungsbeispiel: !2Erträge [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Ungolfed:

open List;

(* int list list -> int -> int list list *)
fun f (s::r) m =
    if exists (fn x => x=m) s 
    then f r m
    else (m::s) :: f r m
  | f [] m = []

(* int -> int list list *)
fun g 0 = [[]]
  | g n = concat(tabulate(10, f(g(n-1))))

Einige Alternativen:

125 123 Bytes

fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!m 0=[[]]| !10n=[]| !m n=f(!0(n-1))m@ !(m+1)n;!0;

Probieren Sie es online! Definiert eine anonyme Funktion, an die gebunden istit .

127 124 Bytes

fun!0=[[]]| !n=let fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&9=[]|f&m=f(!(n-1))(m+1)in f(!(n-1))0end

Probieren Sie es online!

Laikoni
quelle
1

Oracle 18 SQL, 169 Byte

Keine Golfsprache, aber:

WITH t(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1,2,3,4,5,6,7,8,9)),n(a,b,c)AS(SELECT a,-1,''FROM i UNION ALL SELECT a-1,v,v||c FROM n,t WHERE v>b)SELECT c FROM n WHERE a=0

Erwartete, dass sich die Eingabe in einer Tabelle imit Spalte befindet a:

CREATE TABLE i (a INT);
INSERT INTO i VALUES ( 3 );

Probieren Sie es online bei Oracle Live SQL (eine kostenlose Anmeldung ist erforderlich, dann kopieren Sie die Lösung in ein Arbeitsblatt) oder SQLFiddle (keine Anmeldung, erfordert jedoch +7 Bytes für die Arbeit mit der niedrigeren Oracle-Version).

MT0
quelle
1

CJam , 13 11 Bytes

{Ae!f<:$_|}

Probieren Sie es online!

Läuft technisch nicht auf tio.run, da der Heap-Speicherplatz knapp wird. Es funktioniert jedoch ordnungsgemäß für bis zu 9-stellige Tastaturen und sollte mit mehr RAM problemlos funktionieren.

2 Bytes gespart dank Dennis

maxb
quelle
0

Bash , 113 99 Bytes

p()(r $1 0 $[10-$1])
r()for i in `seq $2 $3`;{ (($1>1))&&r $[$1-1] $[i+1] $[$3+1] $4$i||echo $4$i;}

Probieren Sie es online!

Glenn Jackman
quelle
r 0funktioniert nicht
Aschepler
rist die rekursive Funktion: Sie soll nicht mit nur einem Parameter gestartet werden. p 0Verhalten ist in der Frage nicht spezifiziert.
Glenn Jackman
0

JavaScript (Firefox 30-57), 67 Byte

n=>n?[for(x of f(n-1))for(y of Array(x?+x[0]:10).keys())y+x]:['']

Port meiner Retina-Antwort, funktioniert aber n=0auch (Rückgabe einer Liste mit einer leeren Zeichenfolge im Gegensatz zu einer leeren Liste für n>10).

Neil
quelle
0

Holzkohle , 21 Bytes

⊞υωFχ≔⁺υEυ⁺κIιυΦυ⁼θLι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

⊞υω

Schieben Sie die leere Zeichenfolge in die vordefinierte Liste.

Fχ

Schleife über jede Ziffer.

Eυ⁺κIι

Fügen Sie die Ziffer an jede Zeichenfolge in der Liste an.

≔⁺υ...υ

Hänge das Ergebnis an die ursprüngliche Liste an.

Φυ⁼θLι

Drucken Sie alle Zeichenfolgen mit der richtigen Anzahl von Ziffern.

Neil
quelle
0

J , 32 Bytes

.. frustrierend länger als Mathematica und R f=:{[:(#@>"0]/.])[:<@I.@#:@i.2^] TIO

Jayprich
quelle