ЛЕГКО запам'ятовуючи числа


41

Числа, які легко запам'ятовувати, але теоретично не легко зробити

Ваше завдання полягає в тому, щоб зробити програму / функцію будь-якою мовою, яка генерує рівномірно випадкові числа, що відповідають цим критеріям:

  1. Довжина - 5 цифр

  2. Є дві окремі повторювані пари

  3. Один набір повторних цифр знаходиться на початку або в кінці, і цифри знаходяться поруч

  4. Непарне число назовні оточене іншою парою цифр

  5. Двозначні пари та інше число повинні бути унікальними

  6. Ваша програма може підтримувати номери з провідними нулями чи ні, на ваш розсуд. Якщо підтримуються провідні нулі, вони повинні бути включені у висновок: 06088, а не 6088. Якщо провідні нулі не підтримуються, то числа, як 06088, взагалі не повинні генеруватися.

Випробування

Прийняті результати:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

Не прийняті результати:

55555
77787
85855
12345
99233
12131
abcde
5033

Більш прийнятні тестові випадки можна знайти за цим посиланням .

Вони були зроблені за допомогою цієї програми python:

імпорт випадковим чином
для i в діапазоні (100):

    якщо random.randint (0,100)> = 50: # Введіть пару на початку, якщо це правда
        temp = [] # робочий масив
        temp.append (random.randint (0,9)) # додавання випадкової цифри
        temp.append (temp [0]) #додайте знову ту саму цифру

        x = random.randint (0,9)
        у той час як x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #додайте ще одну унікальну цифру

        y = random.randint (0,9)
        тоді як y == temp [0] або y == temp [2]:
            y = random.randint (0,9)
        temp.append (y) #додайте ще одну унікальну цифру та попередню унікальну цифру
        temp.append (x)

    else: # Вставте торкаючись пари наприкінці
        temp = [] # робочий масив  
        temp.append (random.randint (0,9)) # додавання випадкової цифри

        #Що не унікальне, спробуйте ще раз
        x = random.randint (0,9)
        у той час як x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #додайте ще одну унікальну цифру


        temp.append (temp [0]) #додайте знову ту ж саму цифру


        y = random.randint (0,9)
        тоді як y == temp [0] або y == temp [1]:
            y = random.randint (0,9)
        temp.append (y) #додайте ще одну унікальну цифру двічі
        temp.append (y)

    tempstr = ""
    для я в темп:
        tempstr + = str (i)
    print tempstr

Це , тому найкоротша відповідь у байтах виграє!


5
Я пропоную "Можливі виходи (ймовірність> 0)" і "Не можливі виходи (ймовірність = 0)", а не "Truthy" і "Falsy" - це більше відповідає тому, що я думаю, що ви запитуєте (і з Python ).
Khuldraeseth na'Barya

9
Чи повинні ми друкувати вихід, як 09033, з нульовим нулем?
xnor

3
Якщо ймовірність рівномірна, можете вказати це у питанні. За замовчуванням randomце не означає рівномірно
Jo King

3
можливо додати 99233, для зручності зрозуміти
l4m2

3
Ласкаво просимо до PPCG! Гарний перший виклик.
Джонатан Аллан

Відповіді:



9

CJam (16 байт)

YmrG*98+ZbA,mrf=

Демонстрація в Інтернеті

Примітка. Я припускав, що "унікальний" ОП насправді означає "чіткий".

Також на 16 байт:

98ZbA,mrf=W2mr#%
98ZbA,mrf=_W%]mR

Розсічення

Ymr    e# Select a random number from [0 1]
G*98+  e# Multiply by 16 and add 98 to get 98 or 114
Zb     e# Base conversion in base 3 to get [1 0 1 2 2] or [1 1 0 2 0]
A,mr   e# Shuffle the numbers from 0 to 9
f=     e# Map "select the item at this index"

Інші варіанти генерують, використовуючи, [1 0 1 2 2]а потім вибирають або результат, або його зворотний.


9

Perl 5 , 81 63 56 байт

Виріжте 7 байт з натхненням від @DomHastings

Побудова числа з відповідного зразка.

@q{0..9}++;say+(keys%q)[.5>rand?(2,2,0,1,0):(0,1,0,2,2)]

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


Perl 5 , 89 байт

Вибирає випадкові 5-значні числа, поки не знайде таке, яке відповідає критеріям.

$_=sprintf'%05d',0|rand 1E5until(/(.)\1(.)(.)\2/||/(.)(.)\1(.)\3/)&&$1-$2&$2-$3&$1-$3;say

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


Приємний трюк із використанням хеш-клавіш для випадковості! Я думаю, що це рівнозначно -8, хоча я, можливо, пропустив крайню справу ... Спробуйте в Інтернеті!
Дом Гастінгс

1
Хеш-рандомізація. Блискуче! коротше
Тон Євангелія

Питання полягає в тому, чи time%2є достатньо випадковим чи ні , оскільки це, в певному сенсі, під контролем користувача.
Xcali

@Xcali Здається, є єдиною думкою, що це добре, якщо ви використовуєте його лише один раз, тому я думаю, ви повинні бути хорошими.
FryAmTheEggman

8

Python 2 , 80 байт

from random import*
a,b,c=sample(range(10),3)
print[a,a,b,c,b][::choice((-1,1))]

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

Виводить список цифр.

Python 2 , 83 байти

from random import*
a,b,c=sample('0123456789',3)
print(a*2+b+c+b)[::choice((-1,1))]

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

Вихід - це число.


Якщо за замовчуванням дозволена неоднорідна випадковість (питання не вказується), ви можете зберегти байти, відібравши вибірку також за допомогою зворотності: Спробуйте в Інтернеті! Редагувати: Неважливо, я бачу, що рівномірність була відредагована у специфікації. Цікаво, чи можна все-таки врятувати цей підхід.
xnor

7

APL (Dyalog Unicode) , 22 21 20 18 17 байт

(3∨?2)⌽1↓,∘⌽⍨3?10

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

Якщо прийнятно виводити числа завжди в одному форматі, це може бути скорочено до 12 байт, 1⌽1↓,∘⌽⍨3?10або3⌽1↓,∘⌽⍨3?10 .

Збережено байт, видаливши зайве .

Збережено байт завдяки H.PWiz, а потім ще 2 байти завдяки їх наконечнику.

Збережено байт завдяки ngn.

Функція передбачає ⎕IO←0( I ndex O rigin).


Як?

(3∨?2)⌽1↓,∘⌽⍨3?10  Anonymous function.
              3?10   Deal 3 (distinct) random numbers from 0 to 9. (Assume 1 2 3)
                   Use that as both arguments for:
          ,∘⌽       Rotate (⌽), then concatenate (,).
                    Yields 3 2 1 1 2 3.
        1          Drop the first element. Our vector is now 2 1 1 2 3
                   Rotate the vector to the left using as argument:
(  ?2)              Roll 0 or 1 and...
 3                 Do the GCD between 3 and the result. (30=3; 31=1.)
                    This yields either 1 1 2 3 2 or 2 3 2 1 1.

Введення не можна
драм

@drham немає вводу в функцію. У цьому випадку поле TIO Inputвикористовується для виклику функції g. Крім того, значення g←не зараховується до числа байтів, оскільки це не потрібно, він використовується лише для виклику функції.
Дж. Салле

Те, що gвикликається у розділі введення, - це лише вигадка про те, як APL встановлюється для запуску в TIO
H.PWiz

(4∨?2)економить байт на1 4[?2]
H.PWiz

1
Ви також можете зберігати байти, не призначаючи fпоїзд і не користуючись ним. Я залишаю це тобі :)
H.PWiz

6

Java 8, 145 136 125 119 байт

v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}

-9 байт завдяки @ OlivierGrégoire.
-11 байт завдяки @RickHitchcock .
-6 байт завдяки @Nevay .

Пояснення:

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

v->{            // Method with empty unused parameter and String return-type
  String r;     //  Result-String
  for(;!(r=(int)(Math.random()*1e5)+"")
                //  Generate a random number in the range [0; 100000) and set it to `r`
        .matches("(.).*\\1(.).*\\2")
                //   And continue doing this as long as it doesn't match the regex above,
       |r.chars().distinct().count()<3;);
                //   or doesn't have three distinct digits
  return r;}    //  Return the result


@ OlivierGrégoire Ви розмістили це питання під час правильного виклику? ..: S Це виглядає знайомим, але це, звичайно, не це завдання ..
Кевін Круїссен

Трохи розірвав моє посилання ... У всякому разі, ось гольф:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
Олів'є Грегоар

1
Я думаю, що ваш регулярний вираз можна скоротити до (.).*\\1(.).*\\2економії 11 байт.
Рік Хічкок

1
119 байт:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Невай

5

Желе , 23 байти

⁵Ḷṗ3⁼Q$ÐfXµḢ;`;ŒBW;U$µX

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


Добре, я б підтримав пропозицію, але не можу
drham

7
@drham :) спасибі Ви повинні мати можливість незабаром, як тільки більшість активних членів прокинуться, ваше питання, ймовірно, отримає багато відгуків. хороший перший виклик і ласкаво просимо до PPCG до речі!
HyperNeutrino

5

Желе , 12 11 байт

ØDẊ⁽0yṃ,U$X

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


Пояснення


ØDẊ⁽0yṃ,U$X    Niladic link, generate a random string.
ØD             List of digits, ['0','1','2',...,'9'].
  Ẋ            Random shuffle.
   ⁽0y         Number 13122.
      ṃ        Base decompression. (*)
       ,U$     Pair with its upend (reverse).
          X    Choose one (it or its reversed) randomly.

(*) Правильним аргументом є список['0','1','2',...,'9'] , який випадковим чином перетасовується, містить 10 елементів. Таким чином, число 13122буде перетворене в біективну базу 10 ( [1,3,1,2,2]) і індексується в список (так що, якщо список є l, то повертається значення атома [l[1],l[3],l[1],l[2],l[2]], де Jelly використовує індексацію на основі 1)


(та сама ідея, що і у відповіді 05AB1E, придумана самостійно)
user202729

... 05AB1E отримує 6 нагород через те, що зможеш прив'язати желе, Jelly отримаєш лише 2 нагороди через неможливість виграти 05AB1E?
користувач202729

2
я підтримав вашу відповідь. -> SPEECH 100 <---
L_Church

4

JavaScript (ES6), 79 байт

f=([,,d,a,b,c]=[...Math.random()+f])=>a-b&&a-c&&b-c?d&1?a+a+b+c+b:b+c+b+a+a:f()

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

Як?

Math.random()дає випадковий поплавок у [0..1) . Ми використовуємо +fдля примусу до струни. Ми ігноруємо провідний нуль і десяткову точку, виконуючи [,,( руйнуючи присвоєння перших двох символів нічим) і збираємо перші 4 десяткових цифри в d , a , b і c .

Якщо a , b і c - це три різних цілих числа, ми будуємо кінцевий результат у форматі AABCB або BCBAA (використовуючи паритет d для вирішення). В іншому випадку ми спробуємо ще раз, поки вони не стануть.

У дуже неправдоподібному випадку Math.random()повернення значення без достатньої кількості десяткових знаків принаймні c буде встановлено на нецифровий символ, що змушує тест вийти з ладу і відбутися рекурсивний виклик. Якщо a , b і c є дійсними цілими числами, то d гарантовано буде також дійсним цілим числом, тому це не потрібно тестувати.


І те й інше &&може бути &. Також, як [,,a,b,c,d]працює? Я ніколи не бачив таких даних, як [,,раніше.
Кевін Кройсейсен

1
@KevinCruijssen Побіжно І не вдасться, наприклад, a=4, b=2, c=1через те, що 4-2&4-1&2-1 == 2&3&1 == 0. Я додав коротке пояснення щодо призначення змінної.
Арнольд

Ну звичайно. Я просто спробував , &&щоб &в TIO і він дав правильні виходи, тому я припустив , що це було можливо. Не зрозумів, &замість того, &&щоб фільтрувати інакше дійсні результати. І дякую за додане пояснення щодо завдання руйнування, якого раніше не бачив.
Кевін Круїссен

Це просто приголомшливий +1
Luis felipe De jesus Munoz


2

Брудні , 33 байти

Використовує --numeric-outputпрапор таким чином, щоб він був читабельним, інакше він виводить рядок контрольних символів з кодовими точками, що відповідають цифрам.

10⭧[1w#%D⅋№3⤱≠1ẅ&]1wẂ⭿⭣1u∅#1∧◌ŪW‼

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

Пояснили:

10⭧              put 10 on the right stack
[1w#%D⅋№3⤱≠1ẅ&] loop until there are 3 distinct positive numbers below 10 in the top stack
1wẂ              clean-up the right and top stacks
⭿               copy the top and bottom of the top stack to each-other
⭣                swap the first two elements of the top stack
1u               rotate the top stack by 1
∅#1∧◌ŪW          reverse the top stack half of the time
‼                print the top stack

2

Вугілля деревне , 34 байти

≔‽χθ≔‽Φχ⁻ιθη↑I⟦θθη‽Φχ×⁻ιθ⁻ιηη⟧¿‽²‖

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

  χ                                 Predefined variable 10
 ‽                                  Random element from implicit range
≔  θ                                Assign to variable `q`
       χ                            Predefined variable 10
      Φ                             Filter on implicit range
         ι                          Current value
          θ                         Variable `q`
        ⁻                           Subtract
     ‽                              Random element
    ≔      η                        Assign to variable `h`
                    χ               Predefined variable 10
                   Φ                Filter on implicit range
                       ι  ι         Current value
                        θ           Variable `q`
                           η        Variable `h`
                      ⁻  ⁻          Subtract
                     ×              Multiply
                  ‽                 Random element
               θθ                   Variable `q`
                 η          η       Variable `h`
              ⟦              ⟧      Wrap 5 values into array
             I                      Cast array elements to string
            ↑                       Make array print horizontally
                                ²   Literal 2
                               ‽    Random element from implicit range
                              ¿     If
                                 ‖  Reflect

2

Сітківка , 40 байт


10*
Y`w`d
V?`
Lv$7`.(.)
$1$<'$'
O?`...?

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

Можна друкувати рядки з провідними нулями.

Пояснення


10*

Ініціалізуйте рядок до 10 підкреслень.

Y`w`d

Циклічно транслітеруйте символи слова до цифр. Це трохи дивно. wІ dкороткі для наступних рядків, відповідно:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Циклічна транслітерація означає, що спочатку обидва рядки повторюються по довжині їх LCM:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Оскільки довжини рядків 53 і 10 є одночасними, кожна копія _поєднується з різною цифрою. А тепер циклічна транслітерації замінить I - й копію _з I - го спарювання в цьому розширеному списку. Отже, ми закінчуємо наступним рядком:

0369258147

Все це, щоб зберегти один байт через буквальну рядок 0369258147, так що я гадаю? : D

У будь-якому випадку, у нас зараз є рядок з усіх 10 цифр.

V?`

Це переміщує цифри. Отже перші три цифри будуть рівномірно випадковим вибором трьох відмінних цифр.

Lv$7`.(.)
$1$<'$'

З'єднуємо рядок ...ABCі перетворюємо його на BABCC. Те, що ми робимо це, начебто божевільне, хоча і знову економить лише один байт порівняно з більш прямим підходом. Ми спочатку співставляємо всі перекриваються ( v) пари символів, захоплюючи другий ( .(.)). Тоді ми зберігаємо лише восьмий матч ( 7на основі нуля), який знаходиться ABв ...ABC. Тоді ми замінюємо ( $) на: B( $1), ABC( $<'це суфікс відповідника- роздільника зліва від збігу), C( $'що є суфіксом самого збігу).

O?`...?

Нарешті, ми порівнюємо або 3, або 2 символи та перетасовуємо сірники, даючи нам BABCCабо CCBABнавмання.


2

R , 78 байт

z=sample(0:9,3)[c(2,1:3,3)];cat(paste(`if`(runif(1)>.5,z,rev(z)),collapse=''))

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

sample вибирає 3 випадкових значення з 0:9 , які розташовані в векторі таким чином: a b a c c. Тепер у нас є шанс 50/50 перевернути цей вектор, а потім об'єднати та надрукувати.


Дуже хороша! 62 байти ; виглядає, що ти трохи поза практикою;)
Джузеппе

Я переглянув використання rt, але чомусь думав, що це довше ....
JAD

І (як не-оп - це хороша знахідка :)
JAD

@Giuseppe ваш asnwer можна буде пограти далі в 55 байт ... TIO
JayCe

2

PHP, 73 72 66 байт

<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));

Редагувати: 66 байт завдяки пропозиції @David.

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


Ви можете отримати це до 65 за допомогою цього:<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Давид

@David На жаль, ваше рішення порушує правило 5. Це може бути rand(0,3).rand(4,6).rand(7,9), але, знову ж таки, не є "рівномірно випадковим". Btw. Я не був знайомий rand()%2, тому ваш коментар допоміг мені трохи покращити своє рішення.
ретровер,

1
ах, так, ти маєш рацію. Я не бачив цього правила. У мене є той , який працює зараз, в 66 байт: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Ви можете перевірити, що array_randдругий параметр повертає тут лише унікальні результати (протестовано понад 10000 ітерацій).
Давід

@Давид дякую, щойно оновив мій пост!
ретровевер

1

Червоний , 147, 146 125 байт

func[][b: copy[]d:[1 1 2 3 2]if 1 = random 2[d: reverse d]while[4 > length? b][alter b(random 10)- 1]foreach a d[prin b/(a)]]

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

Безголовки:

f: func[] [                       function with no arguments
    b: copy []                    an empty list
    d: [1 1 2 3 2]                preset digits at positons
    if 1 = random 2 [             generate 1 or 2 
        d: reverse d]             based on this choose to reverse the positions list
    while [4 > length? b] [       while we haven't chosen 3 different digits
        alter b (random 10) - 1   pick a random digit, if it's not in the list already
                                  append it to the list, otherwise remove it
    ]
    foreach a d [                 for each position
       prin b/(a)]                print the corresponding digit 
]



1

Python 3 + numpy, 69 байт

from pylab import*
r=choice
i=r(2)
print(r(10,3,0)[[1-i,0,1,2,-1-i]])

Пояснення

from pylab import*     
r=choice               # `choice` takes a range, number of samples, and wether repetition is allowed
i=r(2)                 # Single value in [0,1] to specify if repeated digits come on right or left
print(r(10,3,0)[[1-i,0,1,2,-1-i]])    # Construct output using index list and 3 random integers


0

J , 35 байт

[:u:48+[:|.^:(?&2:)2 2 1 0 1{3?10"_

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

Я впевнений, що в гольф можна набагато далі.

Пояснення:

  3?10             - generates 3 different digits
7 0 3

  2 2 1 0 1{       - constructs a list using digits positions 0, 1 and 2

  2 2 1 0 1{3?10   
3 3 0 7 0

  |.^:(?&2:)       - generates 0 or 1 and if 1, reverses the list 

  |.^:(?&2:)2 2 1 0 1{3?10
0 7 0 3 3

   u:48+              - converts to char by adding 48 to each digit
   u:48+|.^:(?&2:)2 2 1 0 1{3?10
07033
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.