Rakamları ezberlemek KOLAY


41

Hatırlanması kolay, fakat teorik olarak kolay sayılar yapılmadı.

Buradaki zorluk, bu kriterlere uyan düzenli olarak rasgele sayılar üreten herhangi bir dilde bir program / işlev yapmaktır:

  1. Uzunluk olan 5 basamak

  2. İki ayrı tekrarlanan basamak çifti vardır

  3. Tekrarlanan rakamlardan biri başlangıçta veya sondadır ve rakamlar yan yanadır

  4. Tek sayı, diğer rakamlarla çevrilidir.

  5. İki basamaklı çift ve diğer sayının tümü benzersiz olmalıdır

  6. Programınız, sizin takdirinize bağlı olarak, baştaki sıfırlarla birlikte sayıları destekleyebilir. Baştaki sıfırlar destekleniyorsa, çıkışa dahil edilmelidir: 06088, 6088 değil. Baştaki sıfırlar desteklenmiyorsa, 06088 gibi sayılar hiç üretilmemelidir.

Test Kılıfları

Kabul edilen çıktılar:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

Kabul edilmeyen çıktılar:

55555
77787
85855
12345
99233
12131
abcde
5033

Bu pastebin bağlantısında daha kabul edilebilir test vakaları bulunabilir .

Bunlar bu python programında yapıldı:

rastgele içe aktar
i aralığında (100):

    eğer random.randint (0,100)> = 50: # Başlangıçta çiftin dokunması
        temp = [] #working dizisi
        temp.append (random.randint (0,9)) # rasgele basamak
        temp.append (temp [0]) # tekrar aynı rakamı ekle

        x = random.randint (0,9)
        x == temp iken [0]:
            x = random.randint (0,9)
        temp.append (x) # başka bir benzersiz rakam gir

        y = random.randint (0,9)
        y == temp [0] veya y == temp [2] iken:
            y = random.randint (0,9)
        temp.append (y) # başka bir benzersiz rakam ve bir önceki rakam
        temp.append (x)

    else: # Sonunda dokunan çift
        temp = [] #working dizisi  
        temp.append (random.randint (0,9)) # rasgele basamak

        # Eşsiz olmasa da tekrar deneyin
        x = random.randint (0,9)
        x == temp iken [0]:
            x = random.randint (0,9)
        temp.append (x) # başka bir benzersiz rakam gir


        temp.append (temp [0]) # tekrar aynı 0ncı basamağa


        y = random.randint (0,9)
        y == temp [0] veya y == temp [1] iken:
            y = random.randint (0,9)
        temp.append (y) # iki kere başka bir benzersiz rakam girin
        temp.append (y)

    tempstr = ""
    i temp için:
        tempstr + = str (i)
    tempstr baskı

Bu , bayt cinsinden en kısa cevap!


5
"Truthy" ve "Falsy" yerine "Olası çıktılar (olasılık> 0)" ve "Mümkün olmayan çıktılar (olasılık = 0)" i öneririm; ).
Khuldraeseth na'Barya

9
Sıfır ile 09033 gibi bir çıktı yazdırmamız gerekiyor mu?
xnor

3
Olasılık tekdüze ise, soruda bunu belirtebilirsiniz. Varsayılan olarak, randomtek tip anlamına gelmez
Jo King

3
belki de anlayabilmek için 99233 ekleyebilirsin
l4m2

3
PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma.
Jonathan Allan,

Yanıtlar:


21

05AB1E , 11 bayt

žh.r3£ûÁÂ)Ω

Çevrimiçi deneyin!

açıklama

ž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

Acaba Emigna ha ... en iyi cevabı +1 görüyor mu ?
Magic Octopus Urn,

9

CJam (16 bayt)

YmrG*98+ZbA,mrf=

Çevrimiçi demo

Not: "Eşsiz" OP'nin gerçekten "farklı" anlamına geldiğini varsaydım.

Ayrıca 16 bayt için:

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

teşrih

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"

Diğer değişkenler kullanılarak üretilir [1 0 1 2 2]ve sonra sonucu ya da tersini seçer.


9

Perl 5 , 81 63 56 bayt

@DomHastings'den ilham alarak 7 byte kes

Sayıyı uygun desenden oluşturmak.

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

Çevrimiçi deneyin!


Perl 5 , 89 bayt

Kriterleri karşılayan birini bulana kadar rastgele 5 basamaklı sayıları seçer.

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

Çevrimiçi deneyin!


Rastgele için hash tuşlarını kullanarak güzel hile! Sanırım bu -8'e eşdeğer, ancak son bir davayı kaçırmış olabilirim ... Çevrimiçi deneyin!
Dom Hastings

1
Karma randomizasyonu. Parlak! kısa
Ton Hospel

Soru, time%2bir anlamda kullanıcının kontrolünde olduğu için yeterince rastgele olup olmadığıdır .
Xcali

@Xcali Sadece bir kez kullandığınız sürece iyi olduğu konusunda fikir birliğine varmış gibi görünüyor, bu yüzden iyi olmanız gerektiğini düşünüyorum.
FryAmTheEggman

8

Python 2,80 bayt

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

Çevrimiçi deneyin!

Rakamların bir listesini verir.

Python 2 , 83 bayt

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

Çevrimiçi deneyin!

Çıktı bir sayıdır.


Tek tip rastlantısal olmayan rastlantısallığa varsayılan olarak izin veriliyorsa (soru belirtilmez), ters çevriciliği de örnekleyerek baytları kaydedebilirsiniz: Çevrimiçi deneyin! Düzenleme: Boşver, Ben tekdüzelik spec düzenlenmiş görüyorum. Merak ediyorum bu yaklaşım hala kurtarılabilir mi?
xnor

7

APL (Dyalog Unicode) , 22 21 20 18 17 bayt

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

Çevrimiçi deneyin!

Numaraları her zaman aynı biçimde vermek kabul edilebilirse, bu ya 1⌽1↓,∘⌽⍨3?10da ya 12 bayt olarak kısaltılabilir 3⌽1↓,∘⌽⍨3?10.

Gereksiz kaldırarak bir bayt kaydedildi .

H.PWiz sayesinde bir bayt, bahşiş nedeniyle 2 bayt daha kaydedildi.

Ngn sayesinde bir bayt kaydedildi.

İşlev varsayılır ⎕IO←0( I ndex O rigin).


Nasıl?

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

Giriş yapılamıyor
drham

@drham işleve girdi yok. Bu durumda, TIO alanı Inputişlevi çağırmak için kullanılır g. Ayrıca, g←bayt sayısında sayılmaz, çünkü gerekli değildir, sadece işlevi çağırmak için kullanılır.
J. Sallé

gGiriş bölümünde adlandırılan gerçeği,
APL’nin TIO’da

(4∨?2)bir bayttan daha fazla tasarruf sağlıyor1 4[?2]
H.PWiz

1
fBir trene atayarak ve kullanmadan da bayt kaydedebilirsiniz . Bunu sana bırakacağım :)
H.PWiz

6

Java 8, 145 136 125 119 bayt

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

@ OlivierGrégoire sayesinde 9 bayt . @ RickHitchcock
sayesinde 11 byte . @Nevay sayesinde -6 bayt .

Açıklama:

Çevrimiçi deneyin.

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 Bunu doğru soruna yolladın mı? ..: S Tanıdık geliyor, ama kesinlikle bu zorlama değil ..
Kevin Cruijssen

Aptal şey bağlantımı kopardı ... Her neyse, işte 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
Bence regex'iniz kısaltılabilir (.).*\\1(.).*\\2, 11 byte tasarruf sağlanabilir .
Rick Hitchcock

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

5

Jöle , 23 bayt

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

Çevrimiçi deneyin!


Güzel, affedeceğim, ama yapamam
drham

7
@drham :) teşekkürler. Yakında yapabilmelisiniz, çoğu aktif üye uyandıktan sonra sorunuz muhtemelen çok fazla artıracaktır. iyi ilk meydan okuma ve bu arada PPCG'ye hoş geldiniz!
HyperNeutrino,

5

Jöle , 12 11 bayt

ØDẊ⁽0yṃ,U$X

Çevrimiçi deneyin!


açıklama


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

(*) Doğru argüman rastgele karıştırılmış, 10 element içeren listedir ['0','1','2',...,'9']. Böylece sayı 13122, bijektif taban 10'a ( [1,3,1,2,2]) dönüştürülecek ve listeye indeks eklenecektir (eğer liste ise latomun dönüş değeri, [l[1],l[3],l[1],l[2],l[2]]Jelly'in 1 tabanlı indeksleme kullandığı durumda)


(05AB1E'nin cevabıyla aynı fikir, bağımsız olarak ortaya çıktı)
user202729

... 05AB1E Jelly'i bağlayabildiği için 6 puan kazanıyor, Jelly, 05AB1E kazanamadığı için sadece 2 puan kazanıyor mu?
user202729

2
Cevabını aştım. -> SPEECH 100 <---
L_Church

4

JavaScript (ES6), 79 bayt

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

Çevrimiçi deneyin!

Nasıl?

Math.random()[0..1) 'de rastgele bir değişkenlik sağlar . +fZorlamayı bir dizeye zorlamak için kullanırız . Biz yaparak lider sıfır ve ondalık noktayı görmezden [,,( kurucuların atama hiçbir şey ilk iki karakter) ve içine ilk 4 ondalık basamak toplamak d , a , b ve c .

Eğer bir , b ve c 3 farklı tamsayılardır, biz ya son çıktı oluşturmak AABCB veya BCBAA biçimi (parite kullanılarak d karar vermek için). Aksi takdirde, onlar kadar tekrar deneyelim.

Math.random()Yeterince ondalık basamak içermeyen bir değerin döndürülmesinin son derece olanaksız olması durumunda , en az c rakamsız bir karaktere ayarlanarak testin başarısız olmasına ve özyinelemeli çağrının gerçekleşmesine neden olur. Eğer bir , b ve c sonra geçerli tam sayılardır d bu bir test edilmeye ihtiyacı yoktur bu yüzden de geçerli bir tamsayı olması sağlanır.


Her ikisi &&de olabilir &. Ayrıca, nasıl [,,a,b,c,d]çalışır? Daha önce hiç böyle bir giriş görmedim [,,.
Kevin Cruijssen

1
@KevinCruijssen Bitsel olarak VE a=4, b=2, c=1çünkü örneğin başarısız olur 4-2&4-1&2-1 == 2&3&1 == 0. Değişken ataması hakkında kısa bir açıklama ekledim.
Arnauld,

Ah elbette. Sadece çalıştı &&etmek &TIO ve doğru çıkışları verdi, bu yüzden mümkün olduğunu varsaydık. &Bunun yerine &&geçerli çıktıları filtrelemek yerine fark etmedim. Ve yok etme görevi hakkında ek açıklama için teşekkür ederim, daha önce hiç görmedim.
Kevin Cruijssen

Bu sadece harika +1
Luis felipe De jesus Munoz


2

Kirli , 33 bayt

--numeric-outputBayrağı kullanır, böylece okunabilir, aksi halde rakamlara karşılık gelen kod noktalarına sahip bir kontrol karakteri dizisi çıkarır.

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

Çevrimiçi deneyin!

Açıklaması:

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

Kömür , 34 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  χ                                 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

Retina , 40 bayt


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

Çevrimiçi deneyin!

Dizeleri baştaki sıfırlarla yazdırabilir.

açıklama


10*

Dize 10 alt çizgi için başlat.

Y`w`d

Döngüsel olarak sözcük karakterlerini basamaklara çevirir. Bu biraz garip. wVe dsırasıyla aşağıdaki dizeleri, kısa şunlardır:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Döngüsel transliterasyon ilk önce, her iki dizenin de LCM'lerinin uzunluğuna kadar tekrarlandığı anlamına gelir:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Dize uzunluğu 53 ve 10 koprime ait olduğundan, her kopyası _farklı bir rakamla eşleştirilir. Ve şimdi halkalı çevirisi yerini alacak i kopyasını inci _ile i o genişletilmiş listede inci eşleştirme. Bu yüzden aşağıdaki dizeyle bitiyoruz:

0369258147

Bunların tümü değişmez karakter dizisi üzerinde tek bir bayt kaydetmek için 0369258147, sanırım yay? : D

Her neyse, şimdi 10 haneden oluşan bir dizi var.

V?`

Bu, rakamları karıştırır. Bu yüzden ilk üç hane üç ayrı hane eşit olarak rastgele seçilmiş olacaktır.

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

İple eşleşip ...ABConu dönüştürüyoruz BABCC. Bunu yapma şeklimiz biraz çılgınca ve yine daha basit bir yaklaşıma kıyasla sadece bir byte tasarruf sağlıyor. İlk önce tüm üst üste gelen ( v) karakterleri, ikinciyi ( .(.)) yakalayan karakterleri eşleştiririz . Sonra biz sadece 8 maça korumak ( 7sıfır tabanlı) olduğu ABiçinde ...ABC. Sonra (replace $ile): B( $1), ABC( $<'match- ait eki olan ayırıcı , maçın sol) C( $'maçın kendisi sonekidir).

O?`...?

Son olarak, 3 veya 2 karakterle eşleşiyoruz ve bize ya BABCCda CCBABrastgele vererek eşleşmeleri karıştırıyoruz .


2

R , 78 bayt

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

Çevrimiçi deneyin!

sample3 rastgele değerler alır 0:9, böylece gibi bir vektör içine yerleştirilir,: a b a c c. Şimdi bu vektörü tersine çevirme ve birleştirme ve basma için 50/50 şansımız var.


Çok hoş! 62 bayt ; antrenmandan biraz
Giuseppe

Kullanmaya baktım rt, ama nedense daha uzun olduğunu düşündüm ....
JAD

Ve (no-op olarak iyi bir
JAD

@Giuseppe, asnwer'ınız 55 byte'a kadar golf oynayabilir ... TIO
JayCe

2

PHP, 73 72 66 bayt

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

Düzenleme: @David önerisi sayesinde 66 bayt.

Çevrimiçi deneyin!



@David Maalesef çözümünüz kural 5'e aykırı. Olabilir rand(0,3).rand(4,6).rand(7,9), ancak daha sonra yine "tekdüze rastgele" değil. Btw. Aşina değildim rand()%2, bu yüzden yorumunuz yine de çözümümü geliştirmeme yardımcı oldu.
retrowaver

1
evet haklısın. Bu kuralı görmedim. Ben, şimdi çalışıyor tane var 66 bayt: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Bunu test edebilirsiniz array_rand'ın ikinci parametre yalnızca benzersiz sonuçlar verir burada (10000 tekrarlamalar üzerinde test).
Davіd

@David teşekkürler, yazımı güncelledi!
retraktör

1

Kırmızı , 147, 146 125 bayt

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

Çevrimiçi deneyin!

Ungolfed:

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 bayt

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

açıklama

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

1

C (gcc) , 126 119 bayt

-6 bayt (@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);}

Çevrimiçi deneyin!


0

J , 35 bayt

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

Çevrimiçi deneyin!

Eminim çok daha fazla golf oynayabilir.

Açıklama:

  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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.