Уникальный список PIN-кодов для замка!

16

Вступление

В приватном чате мой друг, по-видимому, недавно наткнулся на систему безопасности, которая имеет следующие два ограничения на действительные контакты:

  • Каждая цифра должна быть уникальной (то есть «1» может появляться только один раз)
  • Порядок цифр не имеет значения ("1234" = "4321")

Итак, чтобы проиллюстрировать, насколько плоха эта система блокировки, давайте на самом деле перечислим все действующие ПИН-коды!

вход

Ваш ввод будет состоять из единственного положительного целого числа, которое обозначает длину PIN-кода.

Выход

Ваш вывод состоит из списка неотрицательных целых чисел или строк *, которые перечисляют все действительные PIN-коды заданной длины.

* Точнее, то, что человек может использовать, чтобы попробовать все комбинации, если бы вы напечатали это для них. Это означает, что набор наборов цифр и массивов массивов цифр в порядке.

Кто выигрывает?

Это поэтому выигрывает самый короткий ответ в байтах! Применяются стандартные правила и лазейки .

Угловые чехлы

  • Поведение вывода не определено, если введено целое число больше 10.
  • Порядок цифр в каждой выходной записи не определен, так как записи с нулем на самом деле содержат указанный ноль, то есть вы не можете разделять «0123» до «123», но «1230», «1203» и «1023» действительны как это "0123".

Тестовые случаи

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
источник
1
Входные данные неотрицательны - поэтому при вводе ноль программа должна представлять собой список, содержащий одно значение, пустую строку?
aschepler
@aschepler, действительно, нулевой случай примерно такой же чувственный, как случай 11, поэтому я изменил его на «положительное целое число».
SEJPM

Ответы:

7

Желе , 4 байта

ØDœc

Попробуйте онлайн!

объяснение

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

Поведение для n > 10пустого списка.

HyperNeutrino
источник
как это не работает при вводе больше 10 (попробовал, и мне показалось странным)?
Печенье ветряной мельницы
2
@ gnu-nobody - пустой список, потому что у вас не может быть комбинации из 11 элементов с 10 вариантами выбора.
HyperNeutrino
о, ØD это "0123456789". Благодарю.
Печенье ветряной мельницы
6

05AB1E , 5 байтов

žhæsù

Попробуйте онлайн!

объяснение

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789
Emigna
источник
Не знал, ùбыла вещь. Я уверен, что раньше использовал фильтр. Насколько новый это?
Волшебная урна осьминога
1
@MagicOctopusUrn: Довольно старый. Давно был там: P
Emigna
Мой мозг не вижу команду до настоящего времени. Я мозг не умный.
Волшебная Урна Осьминога
Случалось со мной пару раз. Не один раз и по некоторым командам, что ...
Эминья
... приемлемый уровень бога 05AB1Er (05AB1E-ite? 05AB1E-an?), такой как вы.
Волшебная Урна Осьминога
6

JavaScript (ES7), 89 байт

Возвращает список списков цифр (в виде символов) или пустой список, если n> 10 .

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

Попробуйте онлайн!

Как?

Сначала мы генерируем список всех десятичных цифр в виде символов, вычисляя 2 29 = 536870912 , добавляя пропущенное «4» и разделяя:

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

Затем мы вычисляем 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

Наконец, мы фильтруем результаты по их длине:

.filter(a=>a.length==n)
Arnauld
источник
2

MATL , 6 байтов

4Y2wXN

Попробуйте онлайн!

Ничего не возвращает (пустой массив) для 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
источник
2

Haskell , 47 байтов

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

Попробуйте онлайн!

объяснение

Когда количество цифр равно нулю, существует только одна комбинация - пустая:

f 0=[[]]

Когда количество цифр равно, nа n/=0комбинации - это все способы добавить цифры к комбинациям f$n-1, чтобы ни одна цифра не добавлялась к комбинации, которая уже содержит ее.

f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]
Пост Рок Гарф Хантер
источник
2

Gaia ,  4  3 байта

₸…K

Попробуйте онлайн!

Прошло много времени с тех пор, как я опубликовал ответ в Gaia! Спасибо мистеру Xcoder за сохранение байта!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly
Giuseppe
источник
Вам не нужно @.
г-н Xcoder
@ Mr.Xcoder спасибо. Не осознавал этого; Кажется, это не очень четко задокументировано.
Джузеппе
2

Retina , 51 36 байт

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

Попробуйте онлайн! Выходы ничего не для n>10. Объяснение:

.+
10*

Заменить вход на 10 _с.

"$+"{

Повторите остальное время программы n.

%`^.
*_$&

Префикс каждого числа _повторяется в соответствии с его первой цифрой.

L$v`_+

Сопоставьте все _s, но _включите также все следующие s в совпадение, для которого нам нужно включить перекрывающиеся совпадения.

$.%`$%'

Для каждого _найденного префикса число _s слева от номера.

Это немного сложно, поэтому, возможно, реальный случай будет лучше. Давайте предположим, что мы уже выполнили цикл дважды, так что все двухзначные PIN-коды были сгенерированы, и в настоящее время мы работаем над их созданием трехзначных PIN-кодов. Мы посмотрим, что происходит с 36: первая цифра 3, так что три _с префиксом, чтобы сделать ___36. Затем создаются следующие совпадения, помеченные здесь с помощью `'s:

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

$%'расценивается как 36во всех трех случаях, в результате чего 3-значный PIN - коды 036, 136и 236.

Если бы мы тогда продолжали создавать 4-значные ПИН-коды, то 036не имели бы _префикса s и, следовательно, не приводили бы ни к каким совпадениям в конечном результате.

Нил
источник
В вопросе говорится, что вклад неотрицательный. На входе ноль это выводит десять символов подчеркивания.
aschepler
@aschepler Действительно; Я вижу , что ОП решил исключить этот случай, но в случае , если вам интересно, то исправление будет препенд ^0и стоимость 5 байт.
Нил
1

Протон , 43 байта

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

Попробуйте онлайн!

Proton finally outgolfs Python :D I thought (import itertools) would return the value but apparently I failed at that. Also importing * afterwards doesn't work because it's not in a lambda, it's a top-level expression.

HyperNeutrino
источник
1

Japt, 5 bytes

Outputs an array of digit arrays. Outputs all combinations if input is 0 or an empty array if input is <0 or >10.

Ao àU

Try it


Explanation

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U
Shaggy
источник
Я не думаю, что вывод для ввода 0 является правильным. Выходными данными должен быть список, содержащий один элемент, который является пустым.
aschepler
@aschepler, откуда ты это взял?
Мохнатый
1

Stax , 4 байта

Vd,S

Попробуйте онлайн!

Vdесть "0123456789". ,толкает ввод в основной стек.S gets combinations of the specified size.

В ссылке tio mиспользуется в нижнем колонтитуле для печати каждого вывода.

рекурсивный
источник
1

Стандарт ML , 124 122 121 байт

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

Попробуйте онлайн! Пример использования: !2доходность[[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))))

Некоторые альтернативы:

125 123 байта

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;

Попробуйте онлайн! Определяет анонимную функцию, которая связана с it.

127 124 байта

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

Попробуйте онлайн!

Laikoni
источник
1

Oracle 18 SQL, 169 байт

Не язык игры в гольф, но:

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

Ожидается, что вход будет в таблице iсо столбцом a:

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

Попробуйте онлайн в Oracle Live SQL (требуется бесплатный вход в систему, затем скопируйте и вставьте решение в рабочую таблицу) или в SQLFiddle (без входа в систему, но для работы в более низкой версии Oracle требуется +7 байт).

mt0
источник
1

CJam , 13 11 байт

{Ae!f<:$_|}

Попробуйте онлайн!

Технически не работает на tio.run, так как место в куче заканчивается. Тем не менее, он работает должным образом для 9-значных клавиатур и должен нормально работать с большим объемом оперативной памяти.

Сохранено 2 байта благодаря Денису

maxb
источник
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;}

Try it online!

glenn jackman
источник
r 0 doesn't work.
aschepler
r is the recursive function: it's not meant to be launched with only 1 parameter. p 0 behaviour is unspecified in the question.
glenn jackman
0

JavaScript (Firefox 30-57), 67 bytes

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

Port of my Retina answer, but works for n=0 too (returning a list of an empty string, as distinct from an empty list for n>10).

Neil
источник
0

Charcoal, 21 bytes

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

Try it online! Link is to verbose version of code. Explanation:

⊞υω

Push the empty string to the predefined list.

Fχ

Loop over each digit.

Eυ⁺κIι

Append the digit to every string in the list.

≔⁺υ...υ

Append the result to the original list.

Φυ⁼θLι

Print all strings with the correct number of digits.

Neil
источник