15 karakterlik bir alfabe ile 6 karakterlik bir dize oluşturma


17

İşteki projelerimizden birinde, son zamanlarda 15 karakterlik bir alfabe ile 6 karakterlik bir dize oluşturmak için özellikle büyük bir yöntem keşfettik. Birkaçımız "Bahse gireriz bunu bir satırda alabiliriz" iddiasıyla, küçük bir kod golf oyunu başlattık.

Senin görevin bizi yenmek, ki hiç şüphem uzun sürmeyecek!

Orijinal algoritma 0-9A-E alfabesini kullandı, ancak diğer alfabe ile denemeler yaptık. Bu nedenle üç alt görev vardır.

  1. 6Rastgele bir sabit kodlu 15karakter alfabe gibi rastgele bir karakter dizesi oluşturun ABC123!@TPOI098. (Bu sadece bir örnektir ve bayt sayısını etkilemeden özelleştirilebilir olmalıdır.)
  2. Karakter alfabesinden 6rastgele seçerek bir karakter dizesi oluşturun .150123456789ABCDE
  3. Seçtiğiniz 6bir 15karakter alfabesinden rastgele seçerek bir karakter dizesi oluşturun (yalnızca yazdırılabilir karakterler).

Her karakter eşit seçim şansına sahip olmalı ve tekrarlama mümkün olmalıdır.

Alt görevlerin her biri için yönetebildiğimiz en iyi şey:

  • "ABC123! @ TPOI098" - 24 bytes
  • "0123456789ABCDE" - 21 bytes
  • Özel alfabe - 13 bytes

Puanınız, her bir alt görev çözümündeki baytların toplamıdır. yani puanımız şu anda 58.

CJam ve Ruby gibi diğerlerinin yanında kullanmaya çalıştık. Orijinal C # idi. Beğendiğiniz dilleri kullanın, ancak özellikle bu dillerdeki çözümleri görmek isteyeceğiz


5
Çok parçalı zorluklarla ilgili. Ne yazık ki, bu durumda iyi bir çözümüm yok, çünkü bu üç alt görev onları birden fazla zorluğa bölmek için mantıklı olmayacak kadar benzer. Ayrıca, alt görevlerin aynı zorluğun sadece küçük varyasyonları olduğu çok parçalı zorluklar için bu politikaya bir istisna önermeyi düşünüyorum. (Her ne kadar bu hala alt çözümlerin diğer cevaplardan alınabileceği problemine sahip olsa da.) Bu yüzden bunu modifiye edemeyeceğim ve topluluğun ne düşündüğünü görmeyeceğim.
Martin Ender

"Skorun baytların toplamı ..." bu yüzden ilk örneğim talihsiz. Başka bir potansiyel örneği değiştireceğim
James Webster

2
@MartinEnder 2 sentim: Bence sorun yok ve VTC olmayacak. Elbette, genellikle tek bir ilginç görevle ilgili bir mücadelenin daha iyi olduğunu düşünüyorum, ancak bu görevler çok benzer olduğundan, "bu 8 rastgele ilgisiz görevi yapın" diyen bir "golf sahasından" çok daha iyi. Görevler arasında herhangi bir etkileşim olmamasına rağmen, gözlerimde bu zorluk Golf'ün 16 mantık kapısının hepsinden farklı değil .
DJMcMayhem

Herhangi bir zaman veya bellek limiti var mı? Alt görevlerin bağımsız olması gerekiyor mu veya kod paylaşmalarına izin veriliyor mu?
Dennis

2
"Bir dize oluştur", kodun gerçekte uygun karakterlerle bir dize değeri oluşturması gerektiği anlamına mı geliyor, yoksa altı karakteri (boşluk veya satırsonu ile ayrılmış değil) çıktı kabul edilebilir mi?
DLosc

Yanıtlar:


6

Jöle , 38 bayt

TryItOnline bağlantıları A , B ve C .

A :ABC123!@£POI09822 bayt

“ABC123!@£POI098”Wẋ6X€

(bunu azaltmak için bir sıkıştırma düşünmek)

B :,0123456789ABCDE8 bayt:

ØHṖWẋ6X€

C :123456789ABCDEF (seçim), 8 bayt:

ØHḊWẋ6X€

Nasıl?

...Wẋ6X€ - common theme
   W     - wrap (string) in a list
    ẋ6   - repeat six times
      X€ - random choice from €ach

ØH...... - hexadecimal digit yield: "0123456789ABCDEF"

..Ṗ..... - pop: z[:-1] (B)

..Ḋ..... - dequeue: z[1:] (C)

8

CJam (23 + 14 + 10 = 47 bayt)

Keyfi alfabe: 23 bayt ( çevrimiçi demo )

{"ABC123!@TPOI098"mR}6*

Onaltılık alfabe: 14 bayt ( çevrimiçi demo )

{FmrAbHb'0+}6*

Özel alfabe:, ABCDEFGHIJKLMNO10 bayt ( çevrimiçi demo )

{Fmr'A+}6*

teşrih

Onaltılık ilginç olanı:

{      e# Loop...
  Fmr  e#   Select a random number from 0 to 14
  AbHb e#   Convert to base 10 and then to base 17
       e#   (i.e. add 7 if the number is greater than 9)
  '0+  e#   Add character '0' (i.e. add 48 and convert from integer to character)
       e#   Note that 'A' - '0' = 17
}6*    e# ...six times

Altı karakter yığın üzerinde bırakılır ve otomatik olarak yazdırılır.


2
AbHbparlak. Bu genel yaklaşımı düşündüm ama _9>7*+çok uzundu.
Martin Ender

6

Perl, 46 + 26 + 26 = 98 bayt

Kredinin çoğu @Dom Hastings'e gidiyor13 bayt tasarruf !

Değişen alfabe dışında 3 program hemen hemen aynıdır.

  • Sabit kodlu alfabe ( ABC123!@)POI098bu örnekte) -> 46 bayt:

    say map{substr"ABC123!@)POI098",15*rand,1}1..6

  • Sabit alfabe 0123456789ABCDE-> 26 bayt:

    printf"%X",rand 15for 1..6

  • 0123456789ABCDEBu durumda özel alfabe -> 26 bayt:

    printf"%X",rand 15for 1..6

Hepsini çalıştırmak için bir dosyaya koyabilirsiniz:

$ cat 6chr_strings.pl
say map{substr"ABC123!@)POI098",15*rand,1}1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
$ perl -M5.010 6chr_string.pl
CB8!8!
24D582
9ED58C

( say "";çıktı biçimini geliştirmek için buradalar)


2
İyi cevaplar! İlk ve son için hemen hemen aynıydım, ancak kullanarak bir bayt kaydedebilirsiniz say: say map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6ve say map{(A..O)[rand 15]}1..6. İkincisi için şunları kullanabilirsiniz printf: printf"%X",rand 15for 1..611'i her şeyden kurtarmak için! Eminim Ton daha fazla tasarruf etmek için bazı gizli büyüler hakkında tavsiyelerde bulunabilir!
Dom Hastings

1
Aslında özel alfabe ile substrbaşka kaydeder:say map{substr"ABC123!@)POI098",15*rand,1}1..6
Dom Hastings

1
@DomHastings Hmm, gerçekten güzel, iyi oynanmış! Teşekkürler :-)
Dada

2
Kodun basit olmasıyla ilgili notu kaldırdığınızı beğendim: D
Dom Hastings

@DomHastings ile printf"%X", substr..randve map, biraz daha az belirgin, bu yüzden insanların hiçbir spoiler olmadan perl sihrinin tadını çıkarmasına izin verdim! : D
Dada

4

R, 33 + 43 + 59 = 135 bayt

Keyfi sabit kodlu alfabe (alfabeyi değiştirmek için dizeyi değiştirin):

cat(sample(strsplit("ABC123!@TPOI098","")[[1]],6,1),sep="")

Alfabe [0-9A-E]:

cat(sample(c(0:9,LETTERS[1:6]),6,1),sep="")

Stdin'den kullanıcı tanımlı alfabe:

cat(sample(scan(,''),6,1),sep="")

Tüm durumlar çıktı kelimesini stdout'a yazdırır.


4

JavaScript (ES6), 167 166 164 163 bayt

Neil
sayesinde 1 bayt kaydedildi ETHproductions sayesinde 2 bayt kaydedildi premek.v
sayesinde 1 bayt kaydedildi

Sabit kodlanmış: "ABC123!@TPOI098" (58 bayt)

f=(n=6)=>n?"ABC123!@TPOI098"[Math.random()*15|0]+f(n-1):''

Sabit: "0123456789ABCDE" ( 58 57 bayt)

f=(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''

Özel: "()+.1=>?M[afhnt" ( 51 49 48 bayt)

f=(n=6)=>n?(f+1)[Math.random()*15|0+5]+f(n-1):''

1
(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''size bayt kazandırır.
Neil

1/8+Mathharika :)
ETHproductions

Ama .1+JSONdaha iyi;)
ETHproductions 16:16

1
Veya JSON+f( [object JSON](n=> " (JNOS[]bcejnot")
ETHproductions

@ETHproductions Güzel bir tane. :)
Arnauld

3

JavaScript (ES6), 184 bayt

Özel alfabe: 66 bayt

_=>"......".replace(/./g,c=>"ABC123!@TPOI098"[Math.random()*15|0])

0-9A-E: 63 bayt

_=>"......".replace(/./g,c=>"ABCDE"[n=Math.random()*15|0]||n-5)

0-9a-e: 55 bayt

_=>(Math.random()*11390625+1e8|0).toString(15).slice(1)

(Tarihe dayalı rasgeleliğe izin veriliyorsa 6 bayt çıkarın.)


Sonuncusunda bir bayt kaydedebilirsiniz **:_=>((Math.random()+1)*15**6|0).toString(15).slice(1)
ETHproductions

@ETHproductions Kesinlikle bu ES6 yerine ES7 yapar? (Ayrıca, bana 3 baytlık bir tasarruf gibi görünüyor.)
Neil

Evet ve 3 bayt kaydedilmiş gibi görünüyor. f=Bayt sayısına dahil olmalıyım
ETHproductions 20:16

3

q, 42 bayt

bir

19 bayt

6?"ABC123!@TPOI098"

B

14 bayt

6?15#.Q.n,.Q.A

C

9 bayt

6?15#.Q.a

(alfabenin ilk on beş harfini kullanır)


3

Julia (36 + 26 + 21 = 83)

join(rand(["ABC123!@TPOI098"...],6))

base(15,rand(15^6:15^7-1))

join(rand('a':'o',6))


2

Yakut 47 + 37 + 31 = 115

Sabit kodlu: "ABC123! @ TPOI098" (47)

(1..6).map{"5CABC123!@TPOI098".chars.sample}*''

Sabit: "0123456789ABCDE" (37)

(1..6).map{[*0..9,*?A..?E].sample}*''

Özel: "ABCDEFGHIJKLMNO" (31)

(1..6).map{[*?A..?O].sample}*''


1

Python 2,70 + 70 + 64 = 204 bayt

from random import*
s=""
exec"s+=choice('ABC123!@TPOI098');"*6
print s

from random import*
s=""
exec"s+=choice('0123456789ABCDE');"*6
print s

from random import*
s=""
exec"s+=chr(randint(65,80));"*6
print s

Ne yazık ki, ikinci örnek ilk yöntemle benzer bir şeyden daha kolaydır choice([randint(48,57)),choice(65,69)])


Neden kullanıyorsun from random import*? Kullanabileceğin düşünmek import randomve random.choiceilk iki örnekte en azından.
Roman Gräf

import random random.choice27, ama from random import* choice26, ayrıca import random as r r.choice27
Karl Napf

Onaltılık durum için, kullanarak biraz daha iyi yapabiliriz format(randrange(8**8),'X').
DSM

@DSM sorun, hayır olmalıF
Karl Napf


1

J, 24 + 24 + 18 10 = 58 bayt

Mil sayesinde 8 bayt kurtarıldı!

'ABC123!@TPOI098'{~?6#15
'0123456789ABCDE'{~?6#15
u:65+?6#15

Evet, ikinci dize J'de kolayca sıkıştırılamaz:

u:47+23#.inv 12670682677028904639x
u:47+;(+i.@])/"1&.>1 10;18 5
('ABCDE',~1":i.10)
(toupper,hfd?6#15)
'0123456789ABCDE'

Küçük bir onaltılık alfabe iyi ise, ,hfd?6#15milin belirttiği gibi 9 bayt vardır .

Her neyse, ?6#150 ila 15 arasında 6 rasgele sayıdır; {~almaktır. u:sayıları karaktere dönüştürür. Son örnek kodlar ABCDEFGHIJKLMNOP.

Bonus: genel durum

{~6?@##

{~6?@## kabaca:

{~6?@##  input: y
      #  length of y
  6  #   six copies of the length
   ?@    random numbers between 0 and the length
{~       taken from y

İkinci durumda, h ex f rom d ecimal'e hfddönüşen adlı bir yerleşik var . Kullanarak 9 baytlık bir çözüm elde edebilirsiniz . Son durum, kolayca okunabilmesi için, 10 baytlık bir çözüm için alfabeyi kullanır ve toplam 24 + 9 + 10 = 45 olur.,hfd?6#15'A'u:65+?6#15
mil

miles İkinci davada büyük harf kullanılması gerekiyor. Son davaya gelince ... haha, ayy. Vektörize eklemeyi tamamen unuttum.
Conor O'Brien

1

PHP, 46 + 36 + 35 = 117 bayt

Sabit kodlanmış (46 bayt)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand()%15];

(47 bayt)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand(0,14)];

Onaltılık (küçük harf) (36 bayt)

for(;$j++<6;)echo dechex(rand()%15);

Büyük harf için, Hardcoded sürümlü 46 bayt.

Özel (AO) (35 bayt)

for(;$k++<6;)echo chr(rand(65,79));

2. bölümünüzü kabul edebileceğimi sanmıyorum. ae AE ile aynı değil
James Webster

0

Scala, 154 bayt

Sabit kodlu alfabe (54 bayt):

Seq.fill(6)("ABC123!@TPOI098"((math.random*14).toInt))

Onaltılık alfabe (54 bayt):

Seq.fill(6)("0123456789ABCDE"((math.random*14).toInt))

Özel alfabe ABCDEFGHIJKLMNO(47 bayt):

Seq.fill(6)(('A'to'O')((math.random*14).toInt))

Açıklama:

Seq.fill(6)(               //build a sequence of 6 elements, where each element is...
  "ABC123!@TPOI098"(         //from the string
    (math.random*14).toInt   //take a random char
  )
)

'A'to'O' A'dan O'ya 15 karakterlik bir dizi oluşturur


0

Pip , 42 bayt

Sabit kodlu alfabe, 22 bayt:

L6ORC"ABC123!@TPOI098"

Onaltılık basamak, 11 bayt:

L6ORR15TB16

İlk 15 küçük harf, 9 bayt:

L6Oz@RR15

açıklama

Her üç program da şu şekilde başlar L6O: 6 kez döngü ve verilen ifadeyi çıktılar.

  • RC"...": Sabit kodlu dizeden rastgele bir karakter seçimi
  • RR15TB16: RandRange (15), Base 16'ya dönüştürüldü
  • z@RR15: zRandRange ile endekslenmiş küçük harfli alfabe (15)

Çevrimiçi deneyin!


0

Skript / skQuery , 108 bayt

Sabit kodlanmış (43 bayt):

random 6 char string from `A@cD%F3h9JK{mN!`

0123456789ABCDE (34 bayt):

random 6 char string from `0-9A-E`

Seçim (31 bayt):

random 6 char string from `A-M`

Açıklığı `sola taşıyabilir misiniz ?
Addison Crump

@VTCAKAVSMoACE Hayır, izin vermiyor
Oliver Ni

0

Jolf, 26 + 14 + 13 = 51 bayt

Μ*S6d rG"ABC123!@TPOI098"E

Özel alfabe, 24 bayt. Burada deneyin!

Μ*S6d r lp^0wά

0-9A-E alfabesi, 14 bayt. Burada deneyin! lp^0wάolduğu lp(0-Z) (dilimlenmiş lden) 0için 15( ).

Μ*S6d r lp^1ά

1-9A-F alfabesi, 13 bayt. Burada deneyin! lp^1άhariç, yukarıdaki ile aynıdır 1için 16.


Genel yöntem:

Μ*S6d r
M*S6d      map six newlines over this function:
      r    select random element from array.

Diğer denemeler (dize sıkıştırmasını kullanarak):

Μ*S6d rGμpwΞ $AE

0

PowerShell v2 +, 45 + 44 + 37 = 126 bayt

Sabit alfabe, 45 bayt

-join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})

Neredeyse onaltılık alfabe, 44 bayt

-join[char[]](0..5|%{Random(48..57+65..69)})

Özel alfabe (A'dan O'ya), 37 bayt

-join[char[]](0..5|%{Random(65..79)})

Bunların hepsi aynı kalıbı takip - döngü gelen 0için 5bir seçme Her yineleme, Randomkarakter veya ASCII değerini, döküm bir şekilde chargerekirse -array ve -joinbir dizeye araya ing. Bu dize ardışık düzende bırakılır ve çıktı örtüktür.


Örnekler

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
32ATB3

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
III@B2

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
@302O@

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
74E117

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
09D7DD

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
COJDFI

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
EAKCNJ

-1

Pyke, 35 bayt

Arbitary alfabe, 20 bayt

6V"ABC123!@TPOI098"H

Burada deneyin!

Onaltılık alfabe, 8 bayt

6V~J15<H

Burada deneyin!

~J15< - "0123456789abcdefghijklmno..."[:15]

Özel alfabe, 7 bayt

6VG15<H

Burada deneyin!

G15< - alphabet[:15]

Seçilen alfabe: abcdefghijklmno

6V     - repeat 6 times:
  ...  -   get alphabet
     H -  choose_random(^)

Bu, 6 karakterlik bir dizgi yerine satırsonu ile ayrılmış 6 karakterlik çıktı olarak görünüyor.
Emigna

Soru çıktı biçimini belirtmiyor.
Blue

Spesifikasyonda 4 yerde 6 karakter dizesi üretin kelimelerini görüyorum .
Emigna
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.