Унікальний список замку PIN-коду!


16

Вступ

У приватному чаті мій друг, мабуть, нещодавно натрапив на систему безпеки, яка має два обмеження щодо своїх дійсних штифтів:

  • Кожна цифра повинна бути унікальною (тобто "1" може з’являтися лише один раз)
  • Порядок цифр не має значення ("1234" = "4321")

Отже, щоб проілюструвати, наскільки погана ця система замок, давайте перерахуємо всі дійсні PIN-коди!

Вхідні дані

Ваш вхід буде складатися з одного натурального цілого числа, яке позначає довжину 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]

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- це порожній список.


як це не працює з входом, більшим за 10 (спробував це, і мені здалося дивним)?
Печиво вітряка

2
@ gnu - ніхто не дає порожній список, оскільки ви не можете поєднати 11 елементів з 10 варіантами.
HyperNeutrino

о, ØD - це "0123456789". Спасибі.
Ветряний печиво

6

05AB1E , 5 байт

žhæsù

Спробуйте в Інтернеті!

Пояснення

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789

Не знав, ùщо річ. Досить впевнений, що раніше я використовував фільтр. Наскільки це нове?
Чарівний восьминога Урна

1
@MagicOctopusUrn: Досить старий. Був там давно: П
Емінья

Мені мозок не бачить команду раніше. Мені мозок не розумний.
Чарівний восьминога Урна

Зі мною траплялося пару разів. Також не раз у деяких командах, а це ...
Емінья,

... прийнятний для богоуровня 05AB1Er (05AB1E-ite? 05AB1E-an?), такого як ти.
Magic Octopus Urn

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' ]

Потім ми обчислюємо живлення:

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




3

Pyth, 4 байти

.cUT

Спробуйте тут

Пояснення

.cUT
  UT     [0, 1, ..., 9].
.c  Q    All (implicit input)-element subsets.






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

Гая ,  4  3 байти

₸…K

Спробуйте в Інтернеті!

Минув час, як я опублікував відповідь у Гаї! Дякую містеру Xcoder за збереження байта!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly

Вам не потрібно @.
Містер Xcoder

@ Mr.Xcoder дякую. Не усвідомлював цього; це не здається документально зафіксовано.
Джузеппе

2

Сітківка , 51 36 байт

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

Спробуйте в Інтернеті!Виходи нічого для n>10. Пояснення:

.+
10*

Замініть вхід на 10 _ с.

"$+"{

Повторіть решту програми n .

%`^.
*_$&

Префікс кожного числа за допомогою _ повторюється відповідно до його першої цифри.

L$v`_+

Збігайте всі _s, але включайте в себе все наступне_ s в матч, для чого нам потрібно включити збіги, що перекриваються.

$.%`$%'

Для кожного _ знайденого, приставте число _s ліворуч до числа.

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

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

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

Якби ми тоді продовжували створювати 4-значні PIN-коди, тоді 036не було б жодного _префікса, і, отже, у кінцевому результаті не було б жодних збігів.


Питання говорить, що вхід не має негативного значення. При нульовому введенні це виводить десять символів підкреслення.
aschepler

@aschepler Дійсно; Я бачу, що ОП вирішила виключити цей випадок, але у випадку, коли вам цікаво, виправити це буде попередньо, ^0і вартістю 5 байт.
Ніл

1

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

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

Спробуйте в Інтернеті!

Протон нарешті перевершив Пітона: думка Д.І. (import itertools) що поверне цінність, але, мабуть, у цьому я не зміг. Крім того, імпорт *після цього не працює, оскільки він не в лямбді, це вираз верхнього рівня.


1

Japt, 5 байт

Виводить масив цифрових масивів. Виводить всі комбінації, якщо вхід є, 0або порожній масив, якщо вхід є<0 або>10 .

Ao àU

Спробуй це


Пояснення

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U

Я не думаю, що вихід для введення 0 є правильним. Вихід повинен бути списком, що містить один елемент, який порожній.
aschepler

@aschepler, звідки ти це береш?
Кудлатий


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], ...].

Безголівки:

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

Спробуйте в Інтернеті!



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 байт).


1

CJam , 13 11 байт

{Ae!f<:$_|}

Спробуйте в Інтернеті!

Технічно не працює на tio.run, оскільки купі місця не вистачає. Однак він працює належним чином для до 9-ти цифрних клавіатур і повинен працювати просто чудово з більшою кількістю оперативної пам’яті.

Збережено 2 байти завдяки Деннісу



0

JavaScript (Firefox 30-57), 67 байт

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

Порт моєї відповіді на Retina, але також працює для цього n=0(повертає список порожнього рядка, відмінне від порожнього списку для n>10).


0

Деревне вугілля , 21 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

⊞υω

Натисніть порожній рядок до попередньо визначеного списку.

Fχ

Переведіть петлю на кожну цифру.

Eυ⁺κIι

Додайте цифру до кожного рядка у списку.

≔⁺υ...υ

Додайте результат до початкового списку.

Φυ⁼θLι

Роздрукуйте всі рядки з правильною кількістю цифр.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.