ŁATWO zapamiętywanie liczb

41

Liczby, które są łatwe do zapamiętania, ale teoretycznie niełatwe do wykonania

Twoim wyzwaniem jest stworzenie programu / funkcji w dowolnym języku, który generuje jednolicie losowe liczby spełniające te kryteria:

  1. Długość to 5 cyfr

  2. Istnieją dwie oddzielne pary powtarzających się cyfr

  3. Jeden zestaw powtarzających się cyfr znajduje się na początku lub na końcu, a cyfry są obok siebie

  4. Liczba nieparzysta jest otoczona drugą parą cyfr

  5. Dwie pary cyfr i druga liczba powinny być niepowtarzalne

  6. Twój program może obsługiwać liczby z wiodącymi zerami lub nie, według własnego uznania. Jeśli obsługiwane są zera wiodące, muszą być uwzględnione w danych wyjściowych: 06088, a nie 6088. Jeśli zera wiodące nie są obsługiwane, wówczas liczby takie jak 06088 nie powinny być generowane w ogóle.

Przypadki testowe

Zaakceptowane wyniki:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

Nieakceptowane wyniki:

55555
77787
85855
12345
99233
12131
abcde
5033

Więcej akceptowalnych przypadków testowych można znaleźć pod tym linkiem .

Zostały one wykonane za pomocą tego programu python:

importuj losowo
dla i w zakresie (100):

    if random.randint (0,100)> = 50: # Ustaw parę dotykającą na początku, jeśli jest prawdą
        temp = [] #working array
        temp. append (random.randint (0,9)) #append losowa cyfra
        temp.append (temp [0]) # ponownie dodaj tę samą cyfrę

        x = random.randint (0,9)
        podczas gdy x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #append inną unikalną cyfrę

        y = losowy. losowy (0,9)
        podczas gdy y == temp [0] lub y == temp [2]:
            y = losowy. losowy (0,9)
        temp.append (y) #append inną unikalną cyfrę i poprzednią unikalną cyfrę
        temp. append (x)

    else: #Umieść parę dotykającą na końcu
        temp = [] #working array  
        temp. append (random.randint (0,9)) #append losowa cyfra

        # Chociaż nie jest wyjątkowy, spróbuj ponownie
        x = random.randint (0,9)
        podczas gdy x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #append inną unikalną cyfrę


        temp.append (temp [0]) # dodaj ponownie tę samą cyfrę 0


        y = losowy. losowy (0,9)
        podczas gdy y == temp [0] lub y == temp [1]:
            y = losowy. losowy (0,9)
        temp. append (y) #app dwukrotnie kolejną unikalną cyfrę
        temp. dopisywanie (y)

    tempstr = ""
    dla i w temp:
        tempstr + = str (i)
    temp. wydruku

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

drham
źródło
5
Sugeruję „Możliwe wyniki (prawdopodobieństwo> 0)” i „Niemożliwe wyniki (prawdopodobieństwo = 0)” zamiast „Prawda” i „Falsy” - wydaje się, że jest to bardziej zgodne z tym, o co myślę (i z Pythonem) ).
Khuldraeseth na'Barya
9
Czy musimy wydrukować wyjście takie jak 09033 z wiodącym zerem?
xnor
3
Jeśli prawdopodobieństwo jest jednolite, czy możesz to określić w pytaniu. Domyślnie randomnie oznacza to jednakowo
Jo King
3
może dodać 99233, aby
konwencja była
3
Witamy w PPCG! Ładne pierwsze wyzwanie.
Jonathan Allan

Odpowiedzi:

21

05AB1E , 11 bajtów

žh.r3£ûÁÂ)Ω

Wypróbuj online!

Wyjaśnienie

žh            # push "0123456789"
  .r          # random shuffle
    3£        # take the first 3
              # EX: 152
      û       # palendromize
              # EX: 15251
       Á      # rotate right
              # EX: 11525
        Â)    # pair with its reverse
              # EX: [11525, 52511]
          Ω   # pick one at random
Emigna
źródło
Zastanawiam się, czy Emigna ha ... widzi najwyższą odpowiedź +1.
Magic Octopus Urn
9

CJam (16 bajtów)

YmrG*98+ZbA,mrf=

Demo online

Uwaga: Założyłem, że „unikalny” OP naprawdę oznacza „odrębny”.

Również dla 16 bajtów:

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

Sekcja

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"

Pozostałe warianty generują za pomocą, [1 0 1 2 2]a następnie wybierają wynik lub jego odwrotność.

Peter Taylor
źródło
9

Perl 5 , 81 63 56 bajtów

Wytnij 7 bajtów z inspiracją @DomHastings

Konstruowanie liczby z odpowiedniego wzorca.

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

Wypróbuj online!


Perl 5 , 89 bajtów

Wybiera losowe liczby 5-cyfrowe, aż znajdzie taką, która spełnia kryteria.

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

Wypróbuj online!

Xcali
źródło
Fajna sztuczka za pomocą klawiszy skrótu dla losowości! Myślę, że jest to równoważne z -8, chociaż mogłem przegapić przypadek na krawędzi ... Wypróbuj online!
Dom Hastings,
1
Randomizacja skrótu. Znakomity! krótszy
Ton Hospel
Pytanie brzmi, czy time%2jest wystarczająco losowy, ponieważ w pewnym sensie znajduje się pod kontrolą użytkownika.
Xcali,
@Xcali Wydaje się, że istnieje konsensus, że jest w porządku, o ile używasz go tylko raz, więc uważam, że powinieneś być dobry.
FryAmTheEggman
8

Python 2 , 80 bajtów

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

Wypróbuj online!

Wyświetla listę cyfr.

Python 2 , 83 bajty

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

Wypróbuj online!

Dane wyjściowe to liczba.

ovs
źródło
Jeśli domyślnie dozwolona jest niejednolita losowość (pytanie nie określa), możesz zapisać bajty, próbkując również odwrotność: Wypróbuj online! Edycja: Nieważne, widzę, że jednolitość została edytowana w specyfikacji. Zastanawiam się, czy to podejście można jeszcze uratować.
xnor
7

APL (Dyalog Unicode) , 22 21 20 18 17 bajtów

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

Wypróbuj online!

Jeśli jest to dopuszczalne na mocy numery zawsze w tym samym formacie, może zostać skrócony do 12 bajtów, albo 1⌽1↓,∘⌽⍨3?10albo 3⌽1↓,∘⌽⍨3?10.

Zapisano bajt, usuwając niepotrzebne .

Zapisano bajt dzięki H.PWiz, a następnie 2 kolejne bajty ze względu na ich wskazówkę.

Zapisano bajt dzięki ngn.

Funkcja zakłada ⎕IO←0( I ndex O rigin).


W jaki sposób?

(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.
J. Sallé
źródło
Nie można podać danych
wejściowych
@drham nie ma danych wejściowych do funkcji. W takim przypadku pole TIO Inputsłuży do wywołania funkcji g. Ponadto liczba g←nie jest liczona w liczbie bajtów, ponieważ nie jest to konieczne, służy jedynie do wywołania funkcji.
J. Sallé,
To, co gjest wywoływane w sekcji wprowadzania, to tylko dziwactwo tego, jak APL ma działać na TIO
H.PWiz
(4∨?2)zapisuje bajt ponad1 4[?2]
H.PWiz
1
Możesz także oszczędzać bajty, nie przypisując fi nie pociągając . Ale zostawię to tobie :)
H.PWiz
6

Java 8, 145 136 125 119 bajtów

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

-9 bajtów dzięki @ OlivierGrégoire.
-11 bajtów dzięki @RickHitchcock .
-6 bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj online.

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
Kevin Cruijssen
źródło
136 bajtów
Olivier Grégoire,
@ OlivierGrégoire Czy opublikowałeś to przy właściwym wyzwaniu? ..: S Wygląda znajomo, ale z pewnością nie jest to wyzwanie.
Kevin Cruijssen
Trochę to zepsuło moje łącze ... W każdym razie, oto golf:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
Olivier Grégoire
1
Wydaje mi się, że można skrócić wyrażenie regularne (.).*\\1(.).*\\2, oszczędzając 11 bajtów.
Rick Hitchcock,
1
119 bajtów:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay
5

Galaretka , 23 bajty

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

Wypróbuj online!

HyperNeutrino
źródło
Fajnie, chciałbym głosować, ale nie mogę
drham
7
@drham :) dzięki. powinieneś być w stanie wkrótce, gdy tylko najbardziej aktywni członkowie obudzą się, twoje pytanie prawdopodobnie uzyska wiele pozytywnych opinii. dobre pierwsze wyzwanie i przy okazji witamy w PPCG!
HyperNeutrino
5

Galaretka , 12 11 bajtów

ØDẊ⁽0yṃ,U$X

Wypróbuj online!


Wyjaśnienie


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

(*) Właściwym argumentem jest lista ['0','1','2',...,'9']losowo losowana, zawierająca 10 elementów. Tak więc liczba 13122zostanie przekonwertowana na bazę bijective 10 ( [1,3,1,2,2]) i zindeksowana do listy (więc jeśli lista jest l, zwracana jest wartość atomu [l[1],l[3],l[1],l[2],l[2]], w którym Jelly używa indeksowania 1)

użytkownik202729
źródło
(ten sam pomysł, co odpowiedź 05AB1E, wymyślił niezależnie)
user202729
... 05AB1E dostaje 6 głosów pozytywnych za to, że jest w stanie powiązać Galaretkę, Galaretka dostaje tylko 2 głosy pozytywne, ponieważ nie jest w stanie wygrać 05AB1E?
user202729,
2
Poparłem twoją odpowiedź. -> MOWA 100 <---
L_Church
4

JavaScript (ES6), 79 bajtów

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

Wypróbuj online!

W jaki sposób?

Math.random()daje losową liczbę zmiennoprzecinkową w [0..1) . Używamy, +faby wymusić przymus na łańcuch. Ignorujemy wiodące zero i kropkę dziesiętną, wykonując [,,( destrukcyjne przypisanie pierwszych dwóch znaków do zera ) i zbieramy pierwsze 4 cyfry dziesiętne na d , a , b i c .

Jeśli , b i c to 3 różne liczby całkowite, budować ostateczną wyjścia w obydwu AABCB lub BCBAA formacie (przy parzystości o d zdecydować). W przeciwnym razie próbujemy ponownie, aż będą.

W bardzo nieprawdopodobnym przypadku Math.random()zwrócenia wartości bez wystarczającej liczby miejsc dziesiętnych, co najmniej c zostanie ustawione na znak niezerowy, zmuszając test do niepowodzenia i wywołanie rekurencyjne. Jeśli a , b i c są poprawnymi liczbami całkowitymi, to gwarantuje się, że d jest również poprawną liczbą całkowitą, więc nie trzeba tego testować.

Arnauld
źródło
Oba &&mogą być &. Jak [,,a,b,c,d]działa? Nigdy nie widziałem takiego wkładu jak [,,wcześniej.
Kevin Cruijssen
1
@KevinCruijssen Bitowe AND może na przykład zawieść, a=4, b=2, c=1ponieważ 4-2&4-1&2-1 == 2&3&1 == 0. Dodałem krótkie wyjaśnienie dotyczące przypisania zmiennej.
Arnauld
Ach, oczywiście. Ja tylko starałem &&się &w TIO i dała odpowiednie wyjścia, więc zakłada się, że to możliwe. Nie zdawałem sobie sprawy, że &zamiast tego &&odfiltrowałbym prawidłowe dane wyjściowe. I dziękuję za dodatkowe wyjaśnienie dotyczące zadania restrukturyzacji, którego nigdy wcześniej nie widziałem.
Kevin Cruijssen
To jest po prostu niesamowite +1
Luis Felipe De Jesus Munoz
2

Brudny , 33 bajty

Używa --numeric-outputflagi, aby była czytelna, w przeciwnym razie wyświetlałby ciąg znaków kontrolnych z punktami kodowymi odpowiadającymi cyfrom.

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

Wypróbuj online!

Wyjaśniono:

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
Obrzydliwe
źródło
2

Węgiel drzewny , 34 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  χ                                 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
Neil
źródło
2

Siatkówka , 40 bajtów


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

Wypróbuj online!

Może drukować ciągi z wiodącymi zerami.

Wyjaśnienie


10*

Zainicjuj ciąg do 10 znaków podkreślenia.

Y`w`d

Cyklicznie transliteruj znaki słowne na cyfry. To trochę dziwne. Skróty wi doznaczają odpowiednio następujące ciągi:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Cykliczna transliteracja oznacza, że ​​najpierw oba ciągi są powtarzane do długości ich LCM:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Ponieważ ciągi znaków o długości 53 i 10 są chronione prawem autorskim, każda kopia _jest sparowana z inną cyfrą. A teraz cykliczny transliteracji zastąpi I th kopia _z I th parowanie w tej rozszerzonej listy. W rezultacie otrzymujemy następujący ciąg:

0369258147

Wszystko po to, by zaoszczędzić jeden bajt na dosłownym ciągu 0369258147, więc chyba tak? :RE

W każdym razie mamy teraz ciąg wszystkich 10 cyfr.

V?`

To przetasowuje cyfry. Pierwsze trzy cyfry będą jednakowo losowym wyborem trzech różnych cyfr.

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

Dopasowujemy ciąg ...ABCi przekształcamy go w BABCC. Sposób, w jaki to robimy, jest trochę szalony i znów oszczędza tylko jeden bajt w porównaniu do prostszego podejścia. Najpierw dopasowujemy wszystkie nakładające się ( v) pary znaków, przechwytując drugą ( .(.)). Następnie zachowujemy tylko 8. dopasowanie (od 7zera), które jest ABw ...ABC. Następnie zamieniamy ( $) na: B( $1), ABC( $<'który jest sufiksem separatora dopasowania po lewej stronie dopasowania), C( $'który jest sufiksem samego dopasowania).

O?`...?

Na koniec dopasowujemy 3 lub 2 znaki i tasujemy mecze, dając nam jeden BABCClub CCBABlosowo.

Martin Ender
źródło
2

R , 78 bajtów

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

Wypróbuj online!

sample3 losowo wybiera wartości z 0:9, które umieszcza się w wektorze w taki sposób: a b a c c. Teraz mamy szansę 50/50, aby odwrócić ten wektor, a następnie połączyć i wydrukować.

JAD
źródło
Bardzo dobrze! 62 bajty ; wygląda na to, że trochę nie ćwiczysz;)
Giuseppe
Spojrzałem na używanie rt, ale z jakiegoś powodu myślałem, że to już dłużej ...
JAD
A (no-op to dobre znalezisko :)
JAD
@Giuseppe twój asnwer może być golfowany dalej do 55 bajtów ... TIO
JayCe
2

PHP, 73 72 66 bajtów

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

Edycja: 66 bajtów dzięki sugestii @David.

Wypróbuj online!

retrowaver
źródło
Możesz dostać go do 65 za pomocą:<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Davіd
@David Niestety Twoje rozwiązanie narusza zasadę 5. Może tak być rand(0,3).rand(4,6).rand(7,9), ale z drugiej strony nie jest „jednolicie losowe”. Btw. Nie byłem zaznajomiony rand()%2, więc twój komentarz i tak pomógł mi nieco ulepszyć moje rozwiązanie.
retrowaver
1
ah, tak, masz rację. Nie widziałem tej zasady. Mam taki, który pracuje obecnie w 66 bajtów: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Możesz przetestować, że array_randdrugi parametr zwraca tutaj tylko unikalne wyniki (przetestowane w ponad 10000 iteracjach).
Davіd
@David dzięki, właśnie zaktualizowałem mój post!
retrowaver
1

Czerwony , 147, 146 125 bajtów

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

Wypróbuj online!

Nie golfowany:

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 
]
Galen Iwanow
źródło
1

Rubin , 60 59 bajtów

->{a,b,c=[*0..9].sample 3;[[a,a,b,c,b],[b,c,b,a,a]].sample}

Wypróbuj online!

Zwraca listę cyfr.

Eric Duminil
źródło
1

Python 3 + numpy, 69 bajtów

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

Wyjaśnienie

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
użytkownik2699
źródło
1

C (gcc) , 126 119 bajtów

-6 bajtów od @ceilingcat

#define R time(0)%10
b,n,m,k;f(){b=R^8;for(n=R;m==n|k==m|k==n;m=R,k=R);printf("%d%d%d%d%d",b?n:m,b?n:k,m,b?k:n,b?m:n);}

Wypróbuj online!

Vazt
źródło
0

J , 35 bajtów

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

Wypróbuj online!

Jestem pewien, że można grać w golfa znacznie dalej.

Wyjaśnienie:

  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
Galen Iwanow
źródło