Hasilkan string 6 karakter dari alfabet 15 karakter


17

Dalam salah satu proyek kami di tempat kerja, kami baru-baru ini menemukan metode yang sangat besar untuk menghasilkan string 6 karakter dari alfabet 15 karakter. Beberapa dari kita mengklaim "Saya yakin kita bisa mendapatkannya dalam satu baris" yang memulai permainan internal kecil kode golf.

Tugas Anda adalah mengalahkan kami, yang saya yakin tidak akan butuh waktu lama!

Algoritma asli menggunakan alfabet 0-9A-E, tetapi kami telah bereksperimen dengan huruf lain. Karena itu ada tiga subtugas.

  1. Hasilkan a 6 string karakter secara acak memilih dari 15alfabet karakter hardcod sewenang-wenang seperti ABC123!@TPOI098. (Ini hanya contoh, dan harus disesuaikan tanpa mempengaruhi jumlah byte.)
  2. Hasilkan a 6 string karakter secara acak dari 15alfabet karakter 0123456789ABCDE.
  3. Hasilkan a 6 string karakter secara acak memilih dari 15alfabet karakter pilihan Anda (hanya karakter yang dapat dicetak).

Setiap karakter harus memiliki kesempatan yang sama untuk seleksi dan pengulangan harus dimungkinkan.

Yang terbaik yang dapat kami kelola untuk masing-masing subtugas adalah:

  • "ABC123! @ TPOI098" - 24 bytes
  • "0123456789ABCDE" - 21 bytes
  • Alfabet khusus - 13 bytes

Skor Anda adalah jumlah byte dalam setiap solusi subtugas. yaitu skor kami saat ini 58.

Kami telah mencoba menggunakan antara lain, CJam dan Ruby. Aslinya ada di C #. Gunakan bahasa apa pun yang Anda suka, tetapi kami akan tertarik untuk melihat solusi dalam bahasa ini khususnya


5
Mengenai tantangan multi-bagian. Sayangnya, saya tidak memiliki solusi yang baik dalam hal ini, karena ketiga subtugas ini terlalu mirip untuk membuatnya masuk akal untuk membaginya menjadi beberapa tantangan. Saya juga telah mempertimbangkan untuk mengusulkan pengecualian terhadap kebijakan untuk tantangan multi-bagian di mana subtugas hanyalah variasi kecil dari tantangan yang sama. (Meskipun itu masih memiliki masalah yang dapat diambil dari solusi-sub dari jawaban lain.) Jadi saya tidak akan memalu ini, dan melihat apa yang dipikirkan masyarakat.
Martin Ender

"Skor Anda adalah jumlah dari byte ..." jadi contoh pertama saya sangat disayangkan. Saya akan mengubah contoh potensial lainnya
James Webster

2
@ MartinEnder 2 sen saya: Saya pikir tidak apa-apa dan tidak akan VTC. Tentu, saya umumnya berpikir tantangan dengan satu tugas menarik lebih baik, tetapi karena tugas ini sangat mirip, itu jauh lebih baik daripada "lapangan golf" yang mengatakan "lakukan 8 tugas acak yang tidak terkait ini." Meskipun tidak ada interaksi antara tugas, di mata saya tantangan ini tidak jauh berbeda dengan mengatakan Golf semua 16 gerbang logika .
DJMcMayhem

Apakah ada batasan waktu atau memori? Apakah subtugas harus independen atau diizinkan berbagi kode?
Dennis

2
Apakah "menghasilkan string" berarti kode harus benar-benar menghasilkan nilai string dengan karakter yang sesuai di dalamnya, atau apakah mengeluarkan enam karakter (tidak dipisahkan oleh spasi atau baris baru) dapat diterima?
DLosc

Jawaban:


6

Jelly , 38 byte

TryItOnline link A , B , dan C .

A :ABC123!@£POI098, 22 bytes

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

(Memikirkan kompresi untuk mengurangi yang ini)

B :0123456789ABCDE, 8 byte:

ØHṖWẋ6X€

C :123456789ABCDEF(pilihan), 8 byte:

ØHḊWẋ6X€

Bagaimana?

...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 byte)

Alfabet sewenang-wenang: 23 byte ( demo online )

{"ABC123!@TPOI098"mR}6*

Alfabet heksadesimal: 14 byte ( demo online )

{FmrAbHb'0+}6*

Alfabet khusus:, ABCDEFGHIJKLMNO10 byte ( demo online )

{Fmr'A+}6*

Pembedahan

Heksadesimal adalah yang menarik:

{      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

Keenam karakter dibiarkan di tumpukan dan dicetak secara otomatis.


2
AbHbbrilian. Saya memikirkan pendekatan umum _9>7*+itu tetapi terlalu lama.
Martin Ender

6

Perl, 46 + 26 + 26 = 98 byte

Banyak kredit jatuh ke @Dom Hastings untuk menghemat 13 byte!

3 program ini cukup identik, kecuali untuk alfabet yang berubah.

  • Alfabet hardcode ( ABC123!@)POI098dalam contoh ini) -> 46 byte:

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

  • Alfabet tetap 0123456789ABCDE-> 26 byte:

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

  • Alfabet khusus 0123456789ABCDEdalam kasus itu -> 26 byte:

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

Anda bisa memasukkan semuanya ke dalam file untuk menjalankannya:

$ 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 "";hanya ada di sini untuk meningkatkan format output)


2
Jawaban yang bagus! Saya memiliki hampir sama untuk yang pertama dan terakhir, tetapi Anda dapat menyimpan byte menggunakan say: say map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6and say map{(A..O)[rand 15]}1..6. Untuk yang kedua Anda dapat menggunakan printf: printf"%X",rand 15for 1..6untuk menyimpan 11 lebih dari semua! Saya yakin Ton dapat menyarankan beberapa sihir misterius untuk menabung lebih banyak juga!
Dom Hastings

1
Sebenarnya dengan alfabet kustom substrmenyimpan yang lain:say map{substr"ABC123!@)POI098",15*rand,1}1..6
Dom Hastings

1
@HomHastings Hmm memang, itu bagus, dimainkan dengan baik! Terima kasih :-)
Dada

2
Saya suka bahwa Anda menghapus catatan tentang kode yang mudah: D
Dom Hastings

@HomHastings dengan printf"%X", substr..randdan map, itu hanya sedikit kurang jelas, jadi saya membiarkan orang menikmati perl sihir tanpa spoiler! : D
Dada

4

R, 33 + 43 + 59 = 135 byte

Alfabet hard-code sewenang-wenang (ubah string untuk mengubah abjad):

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

Alfabet dari [0-9A-E]:

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

Alfabet yang ditentukan pengguna dari stdin:

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

Semua case mencetak kata output ke stdout.


4

JavaScript (ES6), 167 166 164 163 byte

Disimpan 1 byte berkat Neil
Disimpan 2 byte berkat ETHproduk yang
disimpan 1 byte berkat premek.v

Hardcoded: "ABC123!@TPOI098" (58 bytes)

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

Diperbaiki: "0123456789ABCDE" ( 58 57 byte)

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

Khusus: "()+.1=>?M[afhnt" ( 51 49 48 byte)

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):''menghemat satu byte.
Neil

1/8+Mathis great :)
ETHproductions

Tapi .1+JSONlebih baik;)
ETHproduk

1
Atau JSON+f( [object JSON](n=> " (JNOS[]bcejnot")
ETHproduk

@ ETHproduk Bagus. :)
Arnauld

3

JavaScript (ES6), 184 byte

Alfabet khusus: 66 byte

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

0-9A-E: 63 byte

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

0-9a-e: 55 byte

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

(Kurangi 6 byte jika keacakan berdasarkan tanggal diizinkan.)


Anda dapat menyimpan byte pada yang terakhir dengan **:_=>((Math.random()+1)*15**6|0).toString(15).slice(1)
ETHproduksi

@ ETHproductions Tentunya itu akan membuatnya ES7, bukan ES6? (Juga, sepertinya penghematan 3 byte bagi saya.)
Neil

Ya, dan tampaknya menghemat 3 byte. Saya harus memasukkan f=dalam hitungan byte
ETHproduksi

3

q, 42 byte

SEBUAH

19 byte

6?"ABC123!@TPOI098"

B

14 byte

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

C

9 byte

6?15#.Q.a

(menggunakan lima belas huruf alfabet pertama)


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

CJam, 48 byte

Alfabet sewenang-wenang, 23 byte:

{"ABC123!@TPOI098"mR}6*

Cobalah online!

Hex digit, 15 byte:

{A,'F,65>+mR}6*

Cobalah online!

Alfabet ABCDEFGHIJKLMNO, 10 byte:

{Fmr'A+}6*

Cobalah online!


Saya punya ide buruk. Jika kami menganggap U + FFFE sebagai karakter, ~calih-alih 'A+mengembalikan sesuatu yang dapat dicetak secara teknis.
jimmy23013

Mungkin aku salah. Saya tidak menemukan definisi karakter Unicode yang dapat dicetak.
jimmy23013

2

Ruby 47 + 37 + 31 = 115

Hardcoded: "ABC123! @ TPOI098" (47)

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

Diperbaiki: "0123456789ABCDE" (37)

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

Kustom: "ABCDEFGHIJKLMNO" (31)

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


1

Python 2, 70 + 70 + 64 = 204 byte

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

Sayangnya, contoh kedua lebih mudah dengan metode pertama daripada sesuatu seperti choice([randint(48,57)),choice(65,69)])


Mengapa Anda menggunakan from random import*? Saya pikir Anda dapat menggunakan import randomdan random.choicesetidaknya dalam dua contoh pertama.
Roman Gräf

import random random.choiceadalah 27 tetapi from random import* choice26, juga import random as r r.choice27
Karl Napf

Untuk kasus hex, kita bisa melakukan sedikit lebih baik dengan menggunakan format(randrange(8**8),'X'), saya pikir.
DSM

@ DSM masalahnya adalah, tidak boleh adaF
Karl Napf


1

J, 24 + 24 + 18 10 = 58 byte

8 byte disimpan berkat mil!

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

Ya, string kedua tidak mudah kompresibel dalam J:

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

Jika alfabet heks huruf kecil baik-baik saja, maka ada ,hfd?6#15 untuk 9 byte, seperti yang dicatat @miles.

Bagaimanapun, ?6#15adalah 6 angka acak antara 0 dan 15; {~adalah take-from.u:mengonversi angka menjadi karakter. Contoh terakhir mengkodekanABCDEFGHIJKLMNOP .

Bonus: kasus umum

{~6?@##

{~6?@## kira-kira:

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

Pada kasus kedua, ada builtin bernama hfdyang mengkonversi ke h ex f rom d ecimal. Anda bisa mendapatkan solusi 9 byte menggunakan ,hfd?6#15. Kasus terakhir, hanya untuk memiliki sesuatu yang mudah dibaca, menggunakan alfabet dari 'A'untuk solusi 10 byte u:65+?6#15, membuat total 24 + 9 + 10 = 45.
mil

@miles Saya pikir kasus kedua membutuhkan huruf besar. Adapun kasus terakhir ... haha, oops. Saya benar-benar lupa tentang penambahan vektor.
Conor O'Brien

1

PHP, 46 + 36 + 35 = 117 byte

Hardcoded (46 byte)

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

(47 byte)

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

Heksadesimal (huruf kecil) (36 byte)

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

Untuk huruf besar, 46 byte dengan versi Hardcoded.

Ubahsuaian (AO) (35 byte)

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

Saya tidak berpikir saya bisa menerima bagian ke-2 Anda. ae tidak sama dengan AE
James Webster

0

Scala, 154 byte

Alfabet hardcode (54 byte):

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

Alfabet heksa (54 byte):

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

Alfabet khusus ABCDEFGHIJKLMNO(47 byte):

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

Penjelasan:

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' menciptakan urutan 15 karakter, A hingga O


0

Pip , 42 byte

Alfabet hardcode, 22 byte:

L6ORC"ABC123!@TPOI098"

Hex digit, 11 byte:

L6ORR15TB16

15 huruf kecil pertama, 9 byte:

L6Oz@RR15

Penjelasan

Ketiga program dimulai dengan L6O: loop 6 kali dan output ekspresi yang diberikan.

  • RC"...": Pilihan acak karakter dari string yang dikodekan keras
  • RR15TB16: RandRange (15), dikonversi ke Base 16
  • z@RR15: huruf kecil z, diindeks dengan RandRange (15)

Cobalah online!


0

Skript / skQuery , 108 byte

Hardcoded (43 byte):

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

0123456789ABCDE (34 byte):

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

Pilihan (31 byte):

random 6 char string from `A-M`

Bisakah Anda memindahkan bukaan `ke kiri?
Addison Crump

@VTCAKAVSMoACE Tidak, ini tidak memungkinkan Anda
Oliver Ni

0

Jolf, 26 + 14 + 13 = 51 byte

Μ*S6d rG"ABC123!@TPOI098"E

Alfabet khusus, 24 byte. Coba di sini!

Μ*S6d r lp^0wά

Alfabet 0-9A-E, 14 byte. Coba di sini! lp^0wάadalah lp(0-Z) diiris ( l) dari 0ke 15( ).

Μ*S6d r lp^1ά

Alfabet 1-9A-F, 13 byte. Coba di sini! lp^1άsama dengan di atas, kecuali dari 1ke 16.


Metode umum:

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

Upaya lain (menggunakan kompresi string):

Μ*S6d rGμpwΞ $AE

0

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

Memperbaiki alfabet, 45 byte

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

Alfabet hampir heksadesimal, 44 byte

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

Alfabet khusus (A ke O), 37 byte

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

Semua ini mengikuti pola yang sama - loop dari 0ke 5, setiap iterasi memilih Randomkarakter atau nilai ASCII, casting itu sebagai char-array jika perlu, dan-join memasukkannya bersama-sama ke dalam string. String itu ditinggalkan di pipeline, dan output tersirat.


Contohnya

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 byte

Alfabet arbiter, 20 byte

6V"ABC123!@TPOI098"H

Coba di sini!

Alfabet hex, 8 byte

6V~J15<H

Coba di sini!

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

Alfabet khusus, 7 byte

6VG15<H

Coba di sini!

G15< - alphabet[:15]

Alfabet yang dipilih: abcdefghijklmno

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

Ini tampaknya menghasilkan 6 karakter yang dipisahkan oleh baris baru dan bukan string 6-karakter.
Emigna

Pertanyaannya tidak menyatakan format output.
Biru

Saya melihat kata-kata Menghasilkan string 6 karakter di 4 tempat dalam spesifikasi.
Emigna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.