Rastgele bilet kodu üreticisi


18

Bir piyango şirketi, 10 karakter uzunluğunda rastgele bir piyango bileti numarası oluşturmak istiyor.

Her rakamın sadece bir kez geldiği böyle bir sayı oluşturmak için herhangi bir dilde bir kod yazın, örneğin 9354716208bu sayıda 0 ila 9 arasındaki tüm tamsayılar sadece bir kez gelir. Bu sayı rastgele bir sayı olmalıdır.

  • Oluşturulan numara ekranda gösterilmelidir.
  • İzin verilen tüm karakterlerin tüm permütasyonlarını oluşturabilmelidir.
  • Kodun olabildiğince küçük olması gerekir (bayt cinsinden).

3
Neden Java veya PhP'de olmalı?
Fabinout

4
Genellikle, kod golf açıklamasına göre herhangi bir dile izin vermek iyi bir fikirdir .
Konrad Borowski

10
@Howard gibi kişiler 5 veya 8 karakter yanıtı aldığında, en uzun ve en az golf edilen cevaplardan birinin (SQL yanıtı), hatta bir char sayısı bile olmadan, kod golfünde kabul edilen cevap olarak nasıl durur?
Darren Stone

1
Evet, @marinus 4 baytlık bir çözüme sahiptir (benimki 6 bayttır)
Timtech

4
-1 Kazanın seçimi, bunun bir kod golf zorluğu olduğu göz önüne alındığında, yanlış seçimdir.
DavidC

Yanıtlar:


41

J (4 bayt)

Direnemedi.

?~10

J'de, eğer Fikili F~ xise, aynıdır x F x.


3
+1 Bence bunu yenmek için Python'dan biraz daha kısa bir şey denemek zorunda kalacağım.
Joachim Isaksson

Bu sıfır ile başlayan bir parolaya izin veriyor mu? Kurallara göre, program "izin verilen tüm karakterlerin tüm permütasyonlarını üretebilmelidir"
DavidC

@DavidCarraher: evet. Aralıktan tekrar etmeyen 10 rasgele sayı seçer [0..10), böylece temelde rastgele bir '0123456789' permütasyonu anlamına gelir.
Marinus

1
Anlıyorum. Bunu çoğalttım çünkü çoğu dilde "0123456789" numarası otomatik olarak 123456789 biçiminde düzenlenecektir. "0123456789" dizgisi dokunulmadan kalır. Benim sorum gerçekten şu: Çıktınız bir sayı mı yoksa dize mi?
DavidC

@DavidCarraher Bir dizi.
homoseksüel

12

J, 5 karakter ve APL, 8 karakter

J

10?10

J yerleşik anlaşma operatörüne ( ?) sahiptir. Böylece, 10 üzerinden 10 alabiliriz ( 10?10).

APL

1-⍨10?10

APL aynı işleve sahiptir ve maalesef sıfır yerine bir ile başlar. Bu nedenle her sayıdan bir tane çıkarıyoruz ( işe gidip gelme operatörüne bağlı 1-⍨Xaraçlar X-1).


Oh, vay be, güzel.
Konrad Borowski

OP özellikle bir dizi değil numara isterse, bunu da10#.
swish

Bunu varsayabilirsin, ⎕IO←0böylece birini çıkarmak zorunda değilsin. Ayrıca, hem J hem de APL için, bir baytı kaydetmek için ?~10ve işe gidip gelme işlevini kullanabilirsiniz ?⍨10. Ancak bu, J kodunun Marinus ile aynı olmasını sağlar .
Adám

9

Python 2.7 ( 64 63 57)

Burada bir şans değil operatör ağır dil ve varsayılan yüklü rastgele eksikliği nedeniyle :) Bu ben gelebilir en kısa;

from random import*
print''.join(sample("0123456789",10))

Bir aralık oluşturur ve değiştirmeden ondan 10 sayı örnekler.

(Daha kısa içe aktarma biçimi düzeltmesi için @xfix ve biraz karmaşık örnekleme aralığımı belirtmek için @blkknght sayesinde)

Python 2,7 (40)

Etkileşimli istemden çalıştırırsanız ve virgülle ayrılmış olarak okuyabilirseniz, 40'a tıraş olabilirsiniz, ancak kuralların ruhunu kırmak gibi bir şey hisseder;

from random import*
sample(range(10),10)

1
from random import*Bir karakteri kaydetmek için kullanabilirsiniz . Bu benim Perl 6 çözümüme benziyor, ancak daha ayrıntılı, ancak daha ayrıntılı olsa bile böyle bir şeyin Python'da çalışabileceğini görmek harika.
Konrad Borowski

@xfix Evet, ne yazık ki Python modülleri karşılaştırıldığında almak için biraz ayrıntılı :) İthalat düzeltme ile güncellendi, golf şey için oldukça yeni, bu yüzden benim deyim "par" kadar değil.
Joachim Isaksson

Kullanmak "0123456789"yerine dizeden örnekleyerek rangeve bunları eşleyerek birkaç karakter kaydedebilirsiniz str.
Blckknght

@Blckknght Teşekkürler, önerinizle güncellendi :)
Joachim Isaksson

8

PHP, 29 karakter

<?=str_shuffle('0123456789');

PHP ile kapanış etiketi gerekli değildir. Ancak bu kurallara aykırı ise, değiştirebilirsiniz; ?> 1 net artış için.


Beni bu çözüme yendin.
Shaun Bebbers

8

Yakut, 18

Bunu şurada çalıştır irb:

[*0..9].shuffle*''

Bunun çıktı olarak stdout(kurallar bunu gerektirmiyor gibi görünüyor ) bağımsız bir program olmasını istiyorsanız , bu 4 karakteri başlangıçta ekleyin:

$><<

Sen kısaltabilir (0..9).to_aiçin [*0..9].
Howard

Bitti ve bitti efendim. Teşekkürler!
Darren Stone

Rica ederim. Ama neden [*0..9].shuffleilk etapta kullanmıyorsunuz ?
Howard

@Howard, çünkü geç oldu ve aptalım. :) Teşekkürler!
Darren Stone

sayı değil numaralı bu dönüş dizisi

8

PHP - 37 Karakter

<?=join('',array_rand(range(0,9),10))

Teorik olarak çalışması gereken 18 karakterli bir çözümüm vardı ama PHP garip.

Veya, bir xkcd cevabı istiyorsanız:

<?="5398421706" // Chosen by program above; guaranteed to be random ?>

EDIT: Teşekkürler xfix, şimdi 5 karakter daha kısa ve eksiksiz. TEKRAR DÜZENLE: Canlı örnek .


Tam parçalar yerine tam bir program yazın. Ayrıca, echoebeveynlere ihtiyaç duymaz echove programdaki ilk ifade ise, <?php echoile değiştirebilirsiniz <?=. Ayrıca, joiniçin bir takma addır implode.
Konrad Borowski

@xfix Teşekkürler, düzeltirim. :)
cjfaure

Hatta gerek yok <?=ve ?>. Bunlar olmadan geçerli bir PHP kodu.
jeremy

@Jeremy Golf numaranın gösterilmesini gerektirir; ayrıca, echo uzunluk <?=ve ?>kombine aynı uzunluktadır ve bunlar olmadan Codepad'de çalışmaz. Yine de teşekkürler. : P
cjfaure

1
@Jeremy Ah, PHP, bir terminalin yanında gömülü olmayan uygulamaların az olduğu. : P
cjfaure

8

Perl 6 (18 16 karakter)

print pick *,^10

Bu, tüm rastgele elemanları ihtiva eden bir dizi (oluşturur pick *den) 0için 9ve sonuç verir ( print).

Örnek çıktı:

$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902

+1 Sanırım daha önce boşluklara ihtiyacınız yok pick.
Howard

1
@Howard: Aslında ihtiyacım var. [~](Perl 6 dilbilgisine göre bir listop olarak ayrıştırılır), herhangi bir bağımsız değişken içeriyorsa bir boşluk (veya paren) gerektirir. Aksi takdirde, Perl 6 derleyicisi "arka arkaya iki terim" hakkında şikayet eder. Perl 6'nın eski sürümlerinde gerekli değildi, ama bu geçmişte kaldı. Perl 6 hala üzerinde çalışılıyor.
Konrad Borowski

1
@xfix: 2 karakter printyerine kullanın say [~]ve kaydedin :)
Ayiko

@Ayiko: İyileştirdiğiniz için teşekkürler :).
Konrad Borowski

7

GolfScript, 12 karakter

10,{;9rand}$

Sadece rakamların listesini oluşturur (10, ) oluşturur ve {...}$bazı rastgele tuşlara göre sıralar - bu rakamlar rastgele bir sıra verir.

Örnekler ( çevrimiçi deneyin ):

4860972315

0137462985

Bunu göndermek
üzereydim

Örneğin, ilk basamak değiştirilmesi 1'den 0 olması muhtemel olarak üç kez hakkındadır: gerçi bu tür bir bok değişikliği yönünde var 9randolan 99randetmem (çoğunlukla) düzeltme olduğunu; neredeyse mükemmel9.?rand olurdu .
Ilmari Karonen

1
@IlmariKaronen Biliyorum, ama soru tekdüze dağıtım hakkında hiçbir şey söylemedi.
Howard

6

R (23 karakter)

cat(sample(0:9),sep="")

Örnek çıktı:

> cat(sample(0:9),sep="")
3570984216
> cat(sample(0:9),sep="")
3820791654
> cat(sample(0:9),sep="")
0548697132

6

TI-BASIC, 5 bayt

randIntNoRep(1,10

Sayı yerine bir liste görüntüler. Arıyorsunuz randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans.
lirtosiast

2
Ben bu meydan okuma bir tamsayı türü gerektirir, sadece "oluşturulan sayı ekranda gösterilmelidir" olduğunu sanmıyorum.
Timtech

Hmm, sorunun bir sayı istediğini sanıyordum ( diğerleri gibi ama meydan okumanın amacı hiç netleştirilmemiş gibi görünüyor. Bazı çözümler her durumda bir liste (J ve APL) olarak çıktı)
lirtosiast

Emin olmadıkça bunu varsaymam, çünkü bu yöntem daha kısadır.
Timtech

5

Oktav (14)

randperm(10)-1

randperm ne yazık ki 1..n arasından bir seçim oluşturur, bu yüzden 0-9 elde etmek için sonunda 1 çıkarmak zorunda.


5

Sql sunucusunda

DECLARE @RandomNo varchar(10)
SET @RandomNo = ''

;WITH num as (
SELECT 0 AS [number]
Union 
select 1
Union 
select 2
Union 
select 3
Union 
select 4
Union 
select 5
Union 
select 6
Union 
select 7
Union 
select 8
Union 
select 9
)
SELECT Top 9 @RandomNo = COALESCE(@RandomNo + '', '') + cast(n.number AS varchar(1))
FROM numbers n
ORDER BY NEWID()

SELECT cast(@RandomNo AS numeric(10,0))

Demoya Bakın

VEYA özyineleme ve xml kullanarak benzer bir şey (@manatwork izniyle).

with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')

1
Dostum, CTE'leri seviyorsunuz… Ama bu bir kod-golf mücadelesi olduğundan, mümkün olduğunca kısaltın. Benim en iyim 186 karakter select i+0from(select 0i union select 1union select 2union select 3union select 4union select 5union select 6union select 7union select 8union select 9)f order by newid()for xml path(''). (BTW, harika bir numara newid().)
manatwork

1
Tamam, haklısın. CTE ile daha kısadır. 106 karakterler: with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('').
Ocak'ta

(VALUES (1),(2),...)
İle kate

5

Javascript ( 79 78 68 karakter)

0-9 sayıları içeren bir dizi oluşturmak ve sıralamak yerine rastgele sayılar üretmeye karar verdim. O sırada dizide olmayan bir sayı bulduğunda ekledi. Bu, on kez tekrarlanır ve ardından çıkışı uyarır.

for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)


Bunun ||yerine kısa devre değerlendirmesini kullanarak 1 bayt tasarruf edebilirsiniz if: for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
Steven Palinkas 24:17

1
@StevenPalinkas Teşekkürler, harika fikir! Gönderiyi buna göre güncelledim.
scribblemaniac

Ayrıca kodda yeniden düzenleme ile 2 bayt kaydedebiliriz:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas

for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Math.floor

4

Mathematica, 27

Row@RandomSample@Range[0,9]

enter image description here


Dizeleri önlemek için güzel bir yol!
DavidC

4

Kabuk / Coreutils, 23

shuf -i0-9|paste -sd ''

Sondaki satırsonuna ihtiyacımız yoksa, bunu 20 ile tıraş edebilirsinizshuf -i0-9|tr -d \\n
joeytwiddle

ne dersinshuf -zi0-9
marcosm

@marcosm: Bu size sıfırlarla sonlanan satırları verir, bu da biraz gariptir.
Hasturkun

4

JavaScript, 82 karakter

EDIT: Rob W sayesinde , kod uzunluğu 90 karaktere azalır.

EDIT: sayesinde George Reith , kod uzunluğu (döngü kullanarak) 82 karaktere azalır.

Oldukça basit bir yol: [0,1,2,3,4,5,6,7,8,9]dizinin rastgele elemanını seçin ve çıktıya ekleyin, sonra diziyi azaltın ve tekrar oynatın.

Eski sürüm (106 karakter):

a=[0,1,2,3,4,5,6,7,8,9],l=11,t="";while(--l){r=Math.floor(Math.random()*l);t+=a[r];a.splice(r,1);}alert(t)

Okunabilir sürüm:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], l = 10,t = "";
while(l--) {
  r = Math.floor(Math.random() * l);
  t += a[r];
  a.splice(r, 1);
}
alert(t);

Daha iyi sürüm (90 karakter):

a="0123456789".split(t=""),l=11;while(--l)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)

Son sürüm (82 karakter):

a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)

JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .


1
Ben 90 karaktere yönteminizi aşağı golfed: a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t). Büyük tasarruflar: Math.random(x)=== 0|x. Kıvırcık parantezleri ve noktalı virgülleri virgülle değiştirin. Atamanın sonucunu, ara değişken kullanmak yerine doğrudan değer olarak kullanın. Son olarak, ilk diziyi kullanarak başlatın .split(r=''). Bu, dizi değişmez değerleri kullanarak bir dizi oluşturmak ve dize değerini ayrı bir ifadede atamaktan daha kısadır.
Rob W

@RobW İpuçları için teşekkürler. Cevabımı güncelledim. PS Sanırım demek istedin Math.floor(x) === 0|x.
gthacoder

1
Bunun sonunda daima 9 vardır. Düzeltmek, başlatmak l=11ve while döngüsü koşulunuzu değiştirmek içinwhile(--l)
Greg

@Greg İyi bir nokta. Teşekkür ederim. Cevabı güncelledim.
gthacoder

1
82 Karakterler: a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)- Kodunuz bir döngüler başlatma, koşul ve ifade bağımsız değişkenlerine mükemmel şekilde uyar. rDeğişken gereksiz olduğunu.
George Reith

4

C #, 145 bayt

Ungolfed

using System;
using System.Linq;
class P
{
    static void Main()
    {
        Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);
    }
}

golfed

using System;using System.Linq;class P{static void Main(){Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

1
Kullanabilirsiniz Enumerable.Range(0,10)ve foreachdöngüdeki kıvırcık parantezlere ihtiyacınız yoktur .
Rik

3

JavaScript (80 karakter)

alert("0123456789".split("").sort(function(){return .5-Math.random()}).join(""))

JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/


3
Not (şu anda sadece FF'de çalışıyor, ancak yakında her yerde tercümanlara geliyor) bir ok işlevi kullanılarak daha da golf edilebilir :alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers

1
Sen arasında boşluk gerekmez returnve.5
TiBoS

1
@Greg Shhhh! Gerçek bir karıştırma işlevinin kaç karakter aldığını bilmiyor musunuz ? ;)
IQAndreas

1
@Greg Rastgele bir dağılımdır (Math.random'un yeterince rastgele olduğunu varsayarsak), sadece tek tip değildir.
SuperJedi224

1
Orijinal blog yazısı gitti ve gelecek nesiller için internet arşivi eklendi: web.archive.org/web/20150212083701/http://sroucheray.org/blog/…
Greg

3

K / Kona (6)

-10?10

J'de ?olduğu gibi, anlaşma operatörüdür; -için kuvvetler değerler tekrarlamayın.


3

Mathematica 40

Sayı, gerektiğinde sıfırın ilk karakter olarak görüntülenmesini sağlayacak şekilde dize olarak oluşturulur.

""<>RandomSample["0"~CharacterRange~"9"]

Çıktı örnekleri

"0568497231"
"6813029574"

açıklama

"0"~CharacterRange~"9" "CharacterRange [" 0 "," 9 "]" için infix gösterimidir. Bunlardan biri {"0", "1", "2", "3", "4", "5", " 6" , "7", "8", "9"}.

RandomSample[list]varsayılan olarak listenin bir permütasyonunu döndürür. (Parametreler dahil edildiğinde diğer örnekleme türleri için de kullanılabilir. Örneğin RandomSample[list, 4], tekrarlamadan 4 karakterlik Rastgele bir örnek döndürür.


Ama neden 0'ı ilk karakter olarak gösterelim?
Ankush

OP'ye göre, program "izin verilen tüm karakterlerin tüm permütasyonlarını üretebilmelidir".
DavidC

@Ankush Bu infix gösterimi, bu yüzden "0" her zaman ilk karakter değildir.
Ajasja

Ajasja doğrudur. Program herhangi bir permütasyon üretebilir. Bunu açıklığa kavuşturmak için yukarıda bazı açıklamalar ekledim.
DavidC


2

Dördüncü, 72

needs random.fs : r ': '0 do i loop 9 for i 1+ random roll emit next ; r

Oda hala golf, belki, ama Forth bu bir zor yaptı. Bence.


2

Prolog, 177/302 karakter

Ben Prolog bir acemi değilim, bu yüzden muhtemelen bu en yoğun kod değil.

:- use_module(library(clpfd)).
sort(N) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N).

İadeler:

| ?- sort2(N).                                         
N = [1,0,2,3,4,5,6,7,8,9] ? ;
N = [1,0,2,3,4,5,6,7,9,8] ? ;
N = [1,0,2,3,4,5,6,8,7,9] ? ;
N = [1,0,2,3,4,5,6,8,9,7] ? ;
N = [1,0,2,3,4,5,6,9,7,8] ? 
yes

Bir tamsayı döndürmesini istiyorsanız:

:- use_module(library(clpfd)).
sort(M) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N),
    M is (N0*1000000000)+(N1*100000000)+(N2*10000000)+(N3*1000000)+
         (N4*100000)+(N5*10000)+(N6*1000)+(N7*100)+(N8*10)+N9.

İadeler:

| ?- sort(N).
N = 1023456789 ? ;
N = 1023456798 ? ;
N = 1023456879 ? ;
N = 1023456897 ? ;
N = 1023456978 ? 
yes

Bunun yerine:

labeling([down],N)

Sayıları ters sırada verir:

| ?- sort(N).                                        
N = 9876543210 ? n
N = 9876543201 ? n
N = 9876543120 ? n
N = 9876543102 ? n
N = 9876543021 ? 
yes

Gönderilen diğer bazı kodların aksine, bu tüm olasılıkları döndürür (tekrarlama olmadan).




2

Clojure, 42

(println (apply str (shuffle (range 10))))

6209847315


Oluşturulan sayı ekranda değil, ekranda gösterilmelidir.
Sylwester

2

Javascript, 83 karakter

a=[];while(!a[9]){b=Math.floor(Math.random()*10);!a.includes(b)&&a.push(b)}alert(a)

Dizi 10 elemente kadar koşarken.

0 - 9 arasında rastgele sayı üreterek dizi! 'Nin bu sayıyı içerip içermediğini kontrol edin ve diziye ekleyin.


1
Siteye Hoşgeldiniz! :)
DJMcMayhem

1

Bu JMK'nın cevabından çok daha küçük değil, ama burada biraz daha küçük bir C # çözümü (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid()))); 
    } 
}

Sıkıştırılmış (134):

using System;using System.Linq;class P{static void Main(){Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid())));}}

Alternatif versiyon (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        "0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write); 
    } 
}

sıkıştırılmış:

using System;using System.Linq;class P{static void Main(){"0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

Uzunlukları eşittir, ancak gerçekten Linq'in ForEach işlevini mi yoksa String'in Birleştirme fonksiyonunu mu kullanmak istediğinize bağlıdır. Enumerable.Range (0, 10) kullanmak yerine bir dizede "0123456789" aralığını yazarak 10 karakteri kaldırabildim.


1

LOGO , 64 karakter

make "d 1234567890
repeat 10 [
    make "n pick d
    show n
    make "d butmember n d
]

pick , verilen listenin rastgele öğesini döndürür. butmember , belirtilen öğenin tüm tekrarlarının kaldırıldığı listeyi döndürür. Not: Tüm Logo uygulamaları butmemberkomutu desteklemez .


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.