Pytanie Code Golf: MSM Random Number Generator


Wyzwanie:

Najkrótszy kod według liczby znaków, który wygeneruje serię (pseudo) losowych liczb przy użyciu znaku Metoda średniego kwadratu.

The Metoda średniego kwadratu generacji (pseudo) losowej generacji po raz pierwszy zasugerował John Von Neumann w 1946 r. i jest zdefiniowany następująco:

Rn + 1 = średni ((Rn)2, m)

Na przykład:

34562 = 11943936

mid (11943936) = 9439

94392 = 89094721

mid (89094721) = 0947

9472 = 896809

średni (896809) = 9680

96802 = 93702400

średni (93702400) = 7024

Inny przykład:

8432 = 710649

średni (710649) = 106

1062 = 11236

średni (11236) = 123

1232 = 15129

mid (15129) = 512

5122 = 262144

średni (262144) = 621

6212 = 385641

średni (385641) = 856

8562 = 732736

średni (732736) = 327

3272 = 106929

średni (106929) = 069

692 = 4761

średni (4761) = 476

4762 = 226576

mid (226576) = 265

Definicja mid:

Najwyraźniej jest pewne zamieszanie dotyczące dokładnej definicji mid. Na potrzeby tego wyzwania przyjmij, że wyodrębniasz tyle samo cyfr co początkowe ziarno. Znaczenie, jeśli początkowe ziarno miało 4 cyfry, zrobiłbyś wyodrębnić 4 cyfry od środka. Jeśli początkowe ziarno miało 3 cyfry, zrobiłbyś wyodrębnić 3 cyfry od środka.

Jeśli chodzi o pobieranie liczb, gdy nie możesz znaleźć dokładnego środka, rozważ numer 710649. Jeśli chcesz wyodrębnić środkowe 3, istnieje pewna niejasność (106 lub 064). W takim przypadku wyodrębnij 3, który jest najbliższy początku napisu. Tak więc w tym przypadku wyodrębnisz 106.

Łatwo to sobie wyobrazić, aby wstawić zera do liczby, jeśli nie jest to odpowiednia liczba cyfr. Na przykład, jeśli wybierzesz wiodące wartości zerowe 710649 dostajesz 0710649 a teraz stają się 3 środkowe cyfry 106.

Przypadki testowe:

Nie zakładaj żadnych założeń dotyczących długości nasion. Na przykład nie można założyć, że materiał siewny zawsze będzie 4-cyfrową liczbą

Początkowe nasienie 3456 generujący 4-cyfrowe liczby losowe powinien generować następujące serie (pierwsze 10):

9439, 947, 9680, 7024, 3365, 3232, 4458, 8737, 3351, 2292

Początkowe nasienie 8653 która generuje 4-cyfrowe liczby losowe powinna generować następujące serie (pierwsze 10):

8744, 4575, 9306, 6016, 1922, 6940, 1636, 6764, 7516, 4902

Początkowe nasienie 843 generujący 3-cyfrowe liczby losowe powinien generować następujące serie (pierwsze 10):

106, 123, 512, 621, 856, 327, 69, 476, 265, 22

Początkowe nasienie 45678 który generuje 5-cyfrowe liczby ranoma, powinien wygenerować następujące serie (pierwsze 10):

86479, 78617, 80632, 1519, 30736, 47016, 10504, 3340, 11556, 35411

Jeśli chodzi o początkowe zera, odpowiedź brzmi, że nie powinny być wyświetlane wiodące zera :).


13


pochodzenie


Perl master, w ten sposób \ / \ / \ / \ /
Upewnij się, że twój kod działa również z teczką testową 947 !!! - DVK
Aktualizacja nie jest obliczana. Mówi "przyjmij, że wyodrębniasz tę samą liczbę cyfr co oryginalne ziarno", ale przypadek testowy mówi, że produkuje 476 dla nasion 69. - doublep
Sprawdź swoje rozwiązanie na wszystko zamieścił przypadki testowe i zanotował wszelkie odchylenia. Dzięki.
Czy nie jest zabawne, że większość pytań w kodzie golfowym rozpoczyna się systematycznie z podstawową definicją, a następnie pojawiają się przypadki krańcowe i dopiero wtedy następuje wyczerpujące zapisywanie wymagań? Mój, to tak jak w prawdziwym świecie! - JRL


Odpowiedzi:


dc 26/37 znaków

26 wywołuje funkcję dla pojedynczej liczby:

?dZsl2^dZ1+ll-2/Ar^/All^%p

37 znaki z pętlą 10-cyklową:

?dZsl[2^dZ1+ll-2/Ar^/All^%pdzB>L]dsLx

Wyjaśnienie funkcji:

? Wejście n
dZ obliczyć liczbę cyfr
sl sklep w rejestrze l
2 ^ obliczyć n ^ 2
dZ obliczyć liczbę cyfr kwadratu
1 + ll-2 / Ar ^ / n / (10 ^ ((squaredigits + 1-l) / 2)) int podział obcina ostatnie cyfry
Cały ^% n% (10 ^ l) moduł obcina pierwsze cyfry
p wydrukuj numer

Test:

dc msml.dc
45678
86479
78617
80632
1519
30736
47016
10504
3340
11556
35411

10



Wow, nie wiem, że dc może być używany w ten sposób. - user49117


Dokumenty Google - Arkusz kalkulacyjny: 42 znaki

=MID(C2^2,LEN(C2^2)/2-LEN(C2)/2+1,LEN(C2))

Stosowanie:

  • Umieść początkowe nasiono w komórce C2i przeciągnij formułę dla całej sekwencji.

Przypadki testowe:

Zrzut ekranu:

Code Golf: MSM Generator liczb losowych http://img59.imageshack.us/img59/6830/golfo.png

Ograniczenia:

  • Ta formuła zachowuje początkowe zera, ale można je przyciąć za pomocą innej kolumny i zastosować INT() na wynikach.

15



To jest doskonałe i ma 42 znaki! :) - armandino
A więc, w tym operacja "Wypełnij", czy nie powinno to być "42 znaki + 1 kliknięcie, przeciągnięcie"? - Jeff Meatball Yang
@Jeff: Rozważałbym kliknięcia i przeciągnięcia jako stdin, standardowe wejście :) ... W ten sposób użytkownik informuje arkusz kalkulacyjny o długości sekwencji. - Daniel Vassallo
@Jeff: Uważałbym, że 10 kopii 42 bajtów kodu ma łącznie 420 bajtów, co oznacza, że ​​jest to ostatnie miejsce z dużym marginesem - który (z uwagi na trudny do odgadnięcia) jest dokładnie tam, gdzie należy; Powielanie kodu 10 razy, aby wytworzyć 10 wartości, jest po prostu złym pomysłem. - Jerry Coffin


Python (86 znaków)

r=input()
l=len(str(r))
while 1:
 x=str(r*r)
 y=(len(x)-l)/2
 r=int(x[y:y+l])
 print r

Tworzy nieskończoną sekwencję na standardowe wyjście. Zwróć uwagę, że lewy trick nie działa co najmniej w starszych wersjach z long wpisz ze względu na zakończenie L w reprezentacji. Python 3 print jako funkcja doda 1 dodatkowy znak do zamknięcia paren.


5



@doublep Wyjaśniłem definicję mid. Przepraszam za to! - Vivin Paliath
Dziękuję za prośbę o dodatkowe wyjaśnienia. Przepraszam za początkową ogólnikowość zasad. Mam nadzieję, że obecny zestaw reguł ma więcej sensu. - Vivin Paliath
Teraz działa dla wyjaśnionych reguł. - doublep
+1 I jest czytelny. - Jon-Eric


C # (96  81  79  85 84 znaki)


Zmień dziennik

  • Dodano sugestię Yuliya dla 81
  • Usunięto dodatkowe nawiasy dla 79.
  • Zwiększona liczba, ponieważ początkowo nie policzyłem niezbędnych spacji (tylko znaki).
  • Zastępowanie 1,0 przez 1d zgodnie z sugestią Camerona.

Mój kod:

    int F(int s, int l)
    {
        var r = "" + 1d*s*s;

        return int.Parse(r.Substring((r.Length - l) / 2, l));
    }

Przykład użycia:

    int s = 8653;
    int l = 4;
    for(int i = 0; i< 10; i++)
    {
        s = F(s, l);
        Console.WriteLine(s);
    }

Wyniki

---8653---
8744
4575
9306
6016
1922
6940
1636
6764
7516
4902

---843---
106
123
512
621
856
327
69
476
265
22

---45678---
86479
78617
80632
1519
30736
47016
10504
3340
11556
35411

4



Pierwsza linia może być zastąpiona przez var r = "" + (1. * s * s); aby zapisać niektóre postacie. - Yuliy
Chłodny! Dzięki Yuliy! :-) - AboutDev
@AboutDev: Liczenie int F(int s, int l){var r=""+1.0*s*s;return int.Parse(r.Substring((r.Length-l)/2, l));} wydaje się być 87 znaków. Czy może czegoś brakuje? - Daniel Vassallo
@AboutDev: Ponadto, myślę, że powinieneś wyprowadzić długość nasienia w swoim kodzie, ponieważ długość jest naprawdę funkcjonalnie zależna od nasienia. - Daniel Vassallo
Zapisz 1 znak, zastępując 1,0 1d - Cameron MacFarland


Perl (102  96  95  93  92 79 znaków)

$s=$_;$d=length$s;map{$s*=$s;print 0+($s=substr$s,($s=~y///c-$d)/2,$d),$/}0..9

echo -n 3456 | perl -ne '$s=$_;$d=length$s;map{$s*=$s;print 0+($s=substr$s,($s=~y///c-$d)/2,$d),$/}0..9'
9439
947
9680
7024
3365
3232
4458
8737
3351
2292

2





Groovy - 82 znaki

s=args[0]as int;def r(){f=s*s;g=f as String;t=g.size()/2;g=g[t-2..t+1];s=g as int}

za pomocą pierwszego argumentu jako seed i wyjście wykonane przez 4 cyfry 10 base10, jak w przykładach.


1



czy musi być spacja między ; i def? 82 znaki - SeanJA
tak, thx! (wyściółka) - Jack
Czy to obsłuży 3456 nasion? (Nie czytam Groovy, więc nie jestem pewien, przepraszam) - DVK
jego wydajność dla 3456: 9439, 947, 9680, 7024, 3365, 3232, 4458, 8737, 3351, 2292 - Jack
Sprawdzę, czy jutro będzie "nowa zgodność z mid-definition"! - Jack


Perl, 80 znaków

(z linii poleceń)

$n=pop;$l=length$n;map{$n*=$n;print 0+($n=substr$n,(length($n)-$l)/2,$l),$/}0..9

1





Rubin, 85  76 69 znaków (generuje i drukuje 10 liczb)

n=gets
l=n.size
10.times{n=n.to_i;x=(n*n).to_s;p n=x[(x.size-l)/2,l]}

Czyta ze standardowego wejścia.

Wydajność

> ruby rand.rb < 3456
9439
947
9680
7024
3365
3232
4458
8737
3351
2292

> ruby rand.rb < 8653
8744
4575
9306
6016
1922
6940
1636
6764
7516
4902

> ruby rand.rb < 843
106
123
512
621
856
327
69
476
265
22

> ruby rand.rb < 45678
86479
78617
80632
1519
30736
47016
10504
3340
11556
35411

1





JavaScript: 91 znaków

function a(s,n){m=(s+'').length;while(n--)c=''+s*s,s=1*c.substr((c.length-m)/2,m);return s}

Stosowanie:

a(3456, 4);     // 4th seed of 3456:   Returns: 7024
a(8653, 2);     // 2nd seed of 8653:   Returns: 4575
a(843, 10);     // 10th seed of 843:   Returns: 22
a(45678, 6);    // 6th seed of 45678:  Returns: 47016

Pełne przypadki testowe:

var tests = [3456, 8653, 843, 45678];

for (var i = 0; i < tests.length; i++) {
   console.log('-------------');
   console.log('| Seed: ' + tests[i]);
   console.log('-------------');

   for(var j = 1; j <= 10; j++) {
      console.log('| ' +  a(tests[i], j));
   }

   console.log('~~~~~~~~~~~~~');
}

Wyniki testu:

-------------         -------------
| Seed: 3456          | Seed: 8653
-------------         -------------
| 9439                | 8744
| 947                 | 4575
| 9680                | 9306
| 7024                | 6016
| 3365                | 1922
| 3232                | 6940
| 4458                | 1636
| 8737                | 6764
| 3351                | 7516
| 2292                | 4902
~~~~~~~~~~~~~         ~~~~~~~~~~~~~

-------------         -------------
| Seed: 843           | Seed: 45678
-------------         -------------
| 106                 | 86479
| 123                 | 78617
| 512                 | 80632
| 621                 | 1519
| 856                 | 30736
| 327                 | 47016
| 69                  | 10504
| 476                 | 3340
| 265                 | 11556
| 22                  | 35411
~~~~~~~~~~~~~         ~~~~~~~~~~~~~

1





Haskell


Uwaga: tworzy się nieskończoną listę zawierającą losowe liczby MSM.


Funkcja, 81

l=length
m k n=take k$drop(div(l n-k)2)n
r n=iterate(read.m(l$show n).show.(^2))n

Przykładowe użycie:

r 34562

Przykładowe wyniki:

[34562,94531,36109,3859,48918,92970,...

Program, 103

l=length
m k n=take k$drop(div(l n-k)2)n
r n=iterate(read.m(l$show n).show.(^2))n
main=readLn>>=print.r


1