สร้างสตริงตัวอักษร 6 ตัวจากตัวอักษร 15 ตัว


17

ในโครงการของเราในที่ทำงานเมื่อเร็ว ๆ นี้เราค้นพบวิธีการที่ยิ่งใหญ่เป็นพิเศษในการสร้างสตริงตัวอักษร 6 ตัวจากตัวอักษร 15 ตัว พวกเราสองสามคนอ้างว่า "ฉันพนันได้เลยว่าจะได้ในบรรทัดเดียว" ซึ่งเริ่มเกมโค้ดกอล์ฟเล็ก ๆ

งานของคุณคือการเอาชนะพวกเราซึ่งฉันไม่สงสัยเลยว่าจะใช้เวลานาน!

อัลกอริทึมดั้งเดิมใช้ตัวอักษร 0-9A-E แต่เราได้ทดลองกับตัวอักษรอื่น ดังนั้นจึงมีสามงานย่อย

  1. สร้าง6สตริงตัวอักษรสุ่มเลือกจาก15ตัวอักษรตัวอักษรhardcoded เช่นABC123!@TPOI098ตัวอักษรตัวอักษรเช่น(นี่เป็นเพียงตัวอย่างและควรปรับแต่งได้โดยไม่กระทบกับจำนวนไบต์)
  2. สร้าง6สตริงตัวอักษรสุ่มเลือกจาก15ตัวอักษรตัวอักษร0123456789ABCDEตัวอักษรตัวอักษร
  3. สร้าง6สตริงตัวอักษรสุ่มเลือกจาก15ตัวอักษรตัวอักษรที่คุณเลือก (โปรดพิมพ์ตัวอักษรเท่านั้น)

ตัวละครแต่ละตัวควรมีโอกาสในการเลือกและการซ้ำซ้อนเท่ากัน

สิ่งที่ดีที่สุดที่เราสามารถจัดการได้สำหรับแต่ละงานย่อยคือ:

  • "ABC123! @ TPOI098" - 24 bytes
  • "0123456789ABCDE" - 21 bytes
  • ตัวอักษรที่กำหนดเอง - 13 bytes

คะแนนของคุณคือผลรวมของไบต์ในโซลูชันของแต่ละภารกิจย่อย เช่นคะแนนของเราคือ 58

เราได้ลองใช้กับ CJam และ Ruby ต้นฉบับอยู่ใน C # ใช้ภาษาที่คุณชอบ แต่เราจะสนใจที่จะเห็นวิธีแก้ปัญหาในภาษาเหล่านี้โดยเฉพาะ


5
เกี่ยวกับความท้าทายหลายส่วน น่าเสียดายที่ฉันไม่มีวิธีแก้ปัญหาที่ดีในกรณีนี้เนื่องจากงานย่อยทั้งสามนี้มีวิธีการที่คล้ายกันมากเกินไปที่จะทำให้การแยกพวกเขาออกเป็นความท้าทายหลายอย่าง ฉันยังพิจารณาเสนอข้อยกเว้นสำหรับนโยบายนั้นสำหรับความท้าทายหลายส่วนที่งานย่อยเป็นเพียงการเปลี่ยนแปลงเล็กน้อยของความท้าทายเดียวกัน (แม้ว่าจะยังคงมีปัญหาที่แก้ปัญหาย่อยสามารถนำมาจากคำตอบอื่น ๆ ) ดังนั้นฉันจะไม่แก้ไขสิ่งนี้และดูว่าชุมชนคิดอย่างไร
Martin Ender

"คะแนนของคุณคือผลรวมของไบต์ ... " ดังนั้นตัวอย่างแรกของฉันคือโชคร้าย ฉันจะแก้ไขอีกตัวอย่างที่เป็นไปได้
James Webster

2
@ มาร์ตินเพิ่ม 2 เซนต์ของฉัน: ฉันคิดว่ามันโอเคและจะไม่ VTC แน่นอนว่าโดยทั่วไปฉันคิดว่าความท้าทายกับงานที่น่าสนใจเพียงงานเดียวนั้นดีกว่า แต่เนื่องจากงานเหล่านี้คล้ายกันมากมันจึงดีกว่า "สนามกอล์ฟ" ที่ระบุว่า "ทำงาน 8 อย่างที่ไม่เกี่ยวข้องกันแบบสุ่ม" ถึงแม้ว่าจะไม่มีการโต้ตอบกันระหว่างงาน แต่ในสายตาของฉันความท้าทายนี้ไม่แตกต่างจากGolf Golf ทั้ง 16 ประตูมากนัก
DJMcMayhem

มีการ จำกัด เวลาหรือหน่วยความจำหรือไม่? ภารกิจย่อยต้องเป็นอิสระหรืออนุญาตให้แบ่งใช้โค้ดหรือไม่?
Dennis

2
"สร้างสตริง" หมายความว่ารหัสต้องสร้างค่าสตริงด้วยอักขระที่เหมาะสมจริง ๆ หรือส่งออกอักขระหกตัว (ไม่คั่นด้วยช่องว่างหรือบรรทัดใหม่) ยอมรับได้หรือไม่
DLosc

คำตอบ:


6

เยลลี่ , 38 ไบต์

TryItOnline เชื่อมโยง, BและC

:ABC123!@£POI09822 ไบต์

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

(คิดเกี่ยวกับการบีบอัดเพื่อลดอันนี้)

B :0123456789ABCDE8 ไบต์:

ØHṖWẋ6X€

C :123456789ABCDEF(ตัวเลือก) 8 ไบต์:

ØHḊWẋ6X€

อย่างไร?

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

ตัวอักษรตามอำเภอใจ: 23 ไบต์ ( ตัวอย่างออนไลน์ )

{"ABC123!@TPOI098"mR}6*

ตัวอักษรฐานสิบหก: 14 ไบต์ ( ตัวอย่างออนไลน์ )

{FmrAbHb'0+}6*

ตัวอักษรที่กำหนดเอง: ABCDEFGHIJKLMNO, 10 ไบต์ ( ตัวอย่างออนไลน์ )

{Fmr'A+}6*

การผ่า

เลขฐานสิบหกคืออันที่น่าสนใจ:

{      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

อักขระหกตัวจะอยู่บนสแต็กและพิมพ์โดยอัตโนมัติ


2
AbHbยอดเยี่ยมมาก ฉันคิดถึงวิธีการทั่วไป แต่_9>7*+นานเกินไป
Martin Ender

6

Perl, 46 + 26 + 26 = 98 ไบต์

เครดิตจำนวนมากไปที่@Dom Hastingsเพื่อประหยัด 13 ไบต์!

โปรแกรมทั้งสามนั้นเหมือนกันยกเว้นตัวอักษรที่เปลี่ยนไป

  • ตัวอักษร Hardcoded ( ABC123!@)POI098ในตัวอย่างนี้) -> 46 ไบต์:

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

  • ตัวอักษรคงที่0123456789ABCDE-> 26 ไบต์:

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

  • ตัวอักษรที่กำหนดเอง0123456789ABCDEในกรณีนั้น -> 26 ไบต์:

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

คุณสามารถใส่พวกเขาทั้งหมดในไฟล์เพื่อเรียกใช้พวกเขา:

$ 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 "";อยู่ที่นี่เพื่อปรับปรุงรูปแบบผลลัพธ์)


2
คำตอบที่ดี! ฉันได้สวยมากเหมือนกันเป็นครั้งแรกและครั้งสุดท้าย แต่คุณสามารถบันทึกไบต์โดยใช้say: และsay map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6 say map{(A..O)[rand 15]}1..6สำหรับครั้งที่สองคุณสามารถใช้printf: printf"%X",rand 15for 1..6เพื่อบันทึก 11 ทั้งหมด! ฉันแน่ใจว่าต้นสามารถให้คำแนะนำเกี่ยวกับเวทมนตร์ที่ลึกลับบางอย่างเพื่อประหยัดมากขึ้น!
Dom Hastings

1
อันที่จริงด้วยตัวอักษรที่กำหนดเองsubstrช่วยประหยัดอีก:say map{substr"ABC123!@)POI098",15*rand,1}1..6
Dom Hastings

1
@DomHastings อืมแน่นอนว่ามันดีเล่นได้ดีมาก! ขอบคุณ :-)
Dada

2
ฉันชอบที่คุณลบบันทึกเกี่ยวกับรหัสที่ตรงไปตรงมา: D
Dom Hastings

@DomHastings ด้วยprintf"%X", substr..randและmapมันเป็นเพียงเล็กน้อยที่เห็นได้ชัดน้อยลงดังนั้นผมจึงปล่อยให้คนเพลิดเพลินกับความมหัศจรรย์ของ Perl กับสปอยเลอร์! : D
Dada

4

R, 33 + 43 + 59 = 135 ไบต์

ตัวอักษรที่กำหนดรหัสยาก (เปลี่ยนสตริงเพื่อเปลี่ยนตัวอักษร):

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

ตัวอักษรของ[0-9A-E]:

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

ตัวอักษรที่ผู้ใช้กำหนดจาก stdin:

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

ทุกกรณีพิมพ์คำที่ส่งออกไปยัง stdout


4

JavaScript (ES6), 167 166 164 163 ไบต์

บันทึก 1 ไบต์ขอบคุณ Neil
บันทึก 2 ไบต์ขอบคุณ ETHproductions
บันทึก 1 ไบต์ขอบคุณ premek.v

ฮาร์ดโค้ด: "ABC123!@TPOI098" (58 ไบต์)

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

คงที่: "0123456789ABCDE" ( 58 57 ไบต์)

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

กำหนดเอง: "()+.1=>?M[afhnt" ( 51 49 48 ไบต์)

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):''ช่วยให้คุณประหยัดไบต์
Neil

1/8+Mathดีมาก :)
ETHproductions

แต่.1+JSONดีกว่า;)
ETHproductions

1
หรือJSON+f( [object JSON](n=> " (JNOS[]bcejnot")
ETHproductions

@ETHproductions หนึ่งที่ดี :)
Arnauld

3

JavaScript (ES6), 184 ไบต์

ตัวอักษรที่กำหนดเอง: 66 ไบต์

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

0-9A-E: 63 ไบต์

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

0-9a-e: 55 ไบต์

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

(ลบ 6 ไบต์หากการสุ่มตามวันที่อนุญาต)


คุณสามารถบันทึกไบต์ในรายการสุดท้ายด้วย**:_=>((Math.random()+1)*15**6|0).toString(15).slice(1)
ETHproductions

@ETHproductions แน่นอนว่ามันจะทำให้ ES7 มากกว่า ES6? (ดูเหมือนว่าฉันจะประหยัดแบบ 3 ไบต์ได้)
Neil

ใช่แล้วจะปรากฏขึ้นเพื่อบันทึก 3 ไบต์ ฉันต้องรวมf=จำนวนไบต์ไว้ด้วย
ETHproductions

3

q, 42 ไบต์

A

19 ไบต์

6?"ABC123!@TPOI098"

B

14 ไบต์

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

9 ไบต์

6?15#.Q.a

(ใช้ตัวอักษรสิบห้าตัวแรกของตัวอักษร)



2

CJam, 48 ไบต์

ตัวอักษรตามอำเภอใจ 23 ไบต์:

{"ABC123!@TPOI098"mR}6*

ลองออนไลน์!

เลขฐานสิบหก, 15 ไบต์:

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

ลองออนไลน์!

ตัวอักษรABCDEFGHIJKLMNO10 ไบต์:

{Fmr'A+}6*

ลองออนไลน์!


ฉันมีความคิดที่ไม่ดี หากเราพิจารณาตัวละคร U + FFFE ~cแทนที่จะ'A+ส่งคืนสิ่งที่พิมพ์ได้ทางเทคนิค
jimmy23013

บางทีฉันผิด ฉันไม่พบคำจำกัดความของอักขระ Unicode ที่พิมพ์ได้
jimmy23013

2

ทับทิม 47 + 37 + 31 = 115

ฮาร์ดโค้ด: "ABC123! @ TPOI098" (47)

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

คงที่: "0123456789ABCDE" (37)

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

กำหนดเอง: "ABCDEFGHIJKLMNO" (31)

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


1

Python 2, 70 + 70 + 64 = 204 ไบต์

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

น่าเสียดายที่ตัวอย่างที่สองนั้นง่ายกว่าด้วยวิธีแรกมากกว่าบางอย่าง choice([randint(48,57)),choice(65,69)])


ทำไมคุณใช้from random import*? ฉันคิดว่าคุณสามารถใช้import randomและrandom.choiceอย่างน้อยในสองตัวอย่างแรก
Roman Gräf

import random random.choiceคือ 27 แต่from random import* choiceคือ 26 และยังimport random as r r.choiceเป็น 27
Karl Napf

สำหรับกรณีฐานสิบหกเราสามารถทำได้ดีขึ้นเล็กน้อยโดยใช้format(randrange(8**8),'X')ฉันคิดว่า
DSM

@DSM ปัญหาคือต้องไม่มี F
Karl Napf


1

J, 24 + 24 + 18 10 = 58 ไบต์

บันทึกได้ 8 ไบต์ด้วยไมล์!

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

ใช่สตริงที่สองไม่สามารถบีบอัดได้อย่างง่ายดายใน J:

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

หากตัวอักษรฐานสิบหกตัวเล็กเป็นตัวพิมพ์เล็กแสดงว่ามี,hfd?6#15ขนาด 9 ไบต์ตามที่ @miles ระบุไว้

อย่างไรก็ตาม?6#15ตัวเลขสุ่ม 6 ตัวระหว่าง 0 ถึง 15 คือ {~เป็นสิ่งที่รับมาu:แปลงตัวเลขเป็นตัวอักษร ABCDEFGHIJKLMNOPเข้ารหัสตัวอย่างสุดท้าย

โบนัส: กรณีทั่วไป

{~6?@##

{~6?@## ประมาณ:

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

ในกรณีที่สองมีในตัวที่มีชื่อhfdซึ่งแปรรูปชั่วโมงอดีตรอมd ecimal คุณสามารถรับโซลูชันขนาด 9 ไบต์,hfd?6#15ได้ ในกรณีสุดท้ายเพื่อให้มีบางสิ่งที่อ่านง่ายใช้ตัวอักษรจาก'A'โซลูชัน 10 ไบต์u:65+?6#15รวม 24 +9 + 10 = 45
ไมล์

@ ไฟล์ฉันคิดว่ากรณีที่สองต้องใช้อักษรตัวพิมพ์ใหญ่ สำหรับกรณีสุดท้าย ... ฮ่าฮ่าโอ๊ะ ฉันลืมเกี่ยวกับการบวกเวกเตอร์อย่างสมบูรณ์
Conor O'Brien

1

PHP, 46 + 36 + 35 = 117 ไบต์

ฮาร์ดโค้ด (46 ไบต์)

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

(47 ไบต์)

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

เลขฐานสิบหก (ตัวพิมพ์เล็ก) (36 ไบต์)

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

สำหรับตัวพิมพ์ใหญ่ 46 ไบต์พร้อมรุ่น Hardcoded

กำหนดเอง (AO) (35 ไบต์)

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

ฉันไม่คิดว่าฉันสามารถยอมรับส่วนที่ 2 ของคุณ ae ไม่เหมือนกับ AE
James Webster

0

สกาลา, 154 ไบต์

ตัวอักษร Hardcoded (54 ไบต์):

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

ตัวอักษรเลขฐานสิบหก (54 ไบต์):

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

ตัวอักษรที่กำหนดเองABCDEFGHIJKLMNO(47 ไบต์):

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

คำอธิบาย:

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' สร้างลำดับ 15 ตัวอักษร A ถึง O


0

Pip , 42 ไบต์

ตัวอักษร Hardcoded ขนาด 22 ไบต์:

L6ORC"ABC123!@TPOI098"

เลขฐานสิบหก, 11 ไบต์:

L6ORR15TB16

อักษรตัวพิมพ์เล็ก 15 ตัวแรก 9 ไบต์:

L6Oz@RR15

คำอธิบาย

โปรแกรมทั้งสามเริ่มต้นด้วย L6O : วนรอบ 6 ครั้งและส่งออกนิพจน์ที่กำหนด

  • RC"...": ตัวเลือกแบบสุ่มของอักขระจากสตริงที่มีการเข้ารหัสยาก
  • RR15TB16: RandRange (15), แปลงเป็นฐาน 16
  • z@RR15: อักษรตัวพิมพ์เล็กzจัดทำดัชนีด้วย RandRange (15)

ลองออนไลน์!


0

Skript / skQuery , 108 ไบต์

ฮาร์ดโค้ด (43 ไบต์):

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

0123456789ABCDE (34 ไบต์):

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

ตัวเลือก (31 ไบต์):

random 6 char string from `A-M`

คุณสามารถย้ายช่องเปิด`ไปทางซ้ายได้หรือไม่?
Addison Crump

@VTCAKAVSMoACE ไม่ไม่อนุญาตให้คุณ
Oliver Ni

0

Jolf, 26 + 14 + 13 = 51 ไบต์

Μ*S6d rG"ABC123!@TPOI098"E

ตัวอักษรที่กำหนดเอง 24 ไบต์ ลองที่นี่!

Μ*S6d r lp^0wά

อักษร 0-9A-E ขนาด 14 ไบต์ ลองที่นี่! lp^0wάคือlp(0-Z) สไลซ์ ( l) จาก0ถึง15( )

Μ*S6d r lp^1ά

ตัวอักษร 1-9A-F ขนาด 13 ไบต์ ลองที่นี่! lp^1άเหมือนกันด้านบนยกเว้นจาก1ถึง16การ


วิธีการทั่วไป:

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

ความพยายามอื่น ๆ (โดยใช้การบีบอัดสตริง):

Μ*S6d rGμpwΞ $AE

0

PowerShell v2 +, 45 + 44 + 37 = 126 ไบต์

ตัวอักษรคงที่ 45 ไบต์

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

ตัวอักษรเลขฐานสิบหกเกือบ 44 ไบต์

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

ตัวอักษรที่กำหนดเอง (A ถึง O), 37 ไบต์

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

ทั้งหมดเหล่านี้เป็นไปตามรูปแบบเดียวกัน - วนจาก0ถึง5, แต่ละการวนซ้ำเลือกRandomอักขระหรือค่า ASCII, การคัดเลือกว่าเป็นchar-array หากจำเป็นและ-joinผสานเข้าด้วยกันเป็นสตริง สตริงนั้นจะถูกทิ้งไว้บนไพพ์ไลน์


ตัวอย่าง

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 ไบต์

ตัวอักษรโดยกรรมวิธี 20 ไบต์

6V"ABC123!@TPOI098"H

ลองที่นี่!

ตัวอักษร Hex, 8 ไบต์

6V~J15<H

ลองที่นี่!

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

ตัวอักษรที่กำหนดเอง 7 ไบต์

6VG15<H

ลองที่นี่!

G15< - alphabet[:15]

ตัวอักษรที่เลือก: abcdefghijklmno

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

ดูเหมือนว่าจะออก 6 ตัวอักษรคั่นด้วยขึ้นบรรทัดใหม่แทนสตริง 6-char
Emigna

คำถามไม่ได้ระบุรูปแบบผลลัพธ์
บลู

ฉันเห็นคำพูด สร้างสตริงอักขระ 6 ตัวใน 4 ตำแหน่งในข้อกำหนด
Emigna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.