从15个字符的字母生成6个字符串


17

在我们正在进行的一个项目中,我们最近发现了一种特别大的方法,可以从15个字符的字母生成6个字符串。我们中的一些人声称“我敢打赌我们可以一站式得到”,这开始了一些代码高尔夫的内部游戏。

您的任务是击败我们,我毫不怀疑会花很长时间!

原始算法使用字母0-9A-E,但是我们已经尝试了其他字母。因此,存在三个子任务。

  1. 生成6从任意硬编码15字符字母(例如)中随机选择的字符串ABC123!@TPOI098。(这只是一个示例,应该可以自定义而不影响字节数。)
  2. 生成615字符字母中随机选择的字符串0123456789ABCDE
  3. 615您选择的字符字母中随机生成一个字符串(请仅打印字符)。

每个角色都应该有相等的选择机会,并且应该可以重复

我们能够为每个子任务管理的最好的是:

  • “ ABC123!@ TPOI098”- 24 bytes
  • “ 0123456789ABCDE”- 21 bytes
  • 自定义字母- 13 bytes

您的分数是每个子任务解决方案中字节的总和。即我们的分数目前是58。

我们尝试过使用CJam和Ruby。原来是C#。使用您喜欢的任何语言,但我们将特别关注这些语言的解决方案


5
关于多部分挑战。不幸的是,在这种情况下,我没有一个好的解决方案,因为这三个子任务太相似了,以至于无法将它们分解为多个挑战。我还一直在考虑为多部分挑战提议该策略的例外,其中子任务只是同一挑战的微小变化。(尽管仍然存在可以从其他答案中获得子解决方案的问题。)因此,我不会对此进行修改,并查看社区的想法。
Martin Ender

“您的分数是字节的总和...”,所以我的第一个示例很不幸。我会修改另一个潜在的例子
詹姆斯韦伯斯特

2
@MartinEnder我的2美分:我认为还可以,也不会VTC。当然,我通常认为,一个有趣的任务所带来的挑战会更好,但是由于这些任务非常相似,因此比“高尔夫球场”说“做这8个随机无关的任务”要好得多。即使任务之间没有交互,在我看来,这一挑战与说高尔夫球16个逻辑门并没有太大区别。
DJMcMayhem

有时间或内存限制吗?子任务是否必须独立或是否允许共享代码?
丹尼斯

2
“生成字符串”是指代码实际上必须生成其中包含适当字符的字符串值,还是输出可接受的六个字符(不用空格或换行符分隔)?
DLosc

Answers:


6

果冻,38 个字节

TryItOnline链接,和Ç

AABC123!@£POI098,22字节

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

(考虑减少这种压缩)

B0123456789ABCDE,8个字节:

Ø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字节)

任意字母: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个字节,这是很多功劳!

这三个程序几乎相同,只是字母有所变化。

  • 硬编码字母(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
好答案!我的第一个和最后一个基本相同,但是您可以使用saysay map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6和来保存一个字节say map{(A..O)[rand 15]}1..6。对于第二个,您可以使用printfprintf"%X",rand 15for 1..6总共保存11个!我确定Ton可以建议一些奥术魔法来节省更多!
Dom Hastings

1
实际上,使用自定义字母substr可以节省另一个:say map{substr"ABC123!@)POI098",15*rand,1}1..6
Dom Hastings

1
@DomHastings嗯,的确很好,发挥很好!谢谢:-)
达达

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字节

感谢Neil,
节省了1个字节感谢ETHproductions,节省了2个字节感谢premek.v,
节省了1个字节

硬编码: "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):''节省您一个字节。
尼尔

1/8+Math太棒了:)
ETHproductions '16

但是.1+JSON更好;)
ETHproductions '16

1
JSON+f[object JSON](n=> " (JNOS[]bcejnot"
ETH生产

@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 16-10-16

@ETHproductions肯定会使其成为ES7,而不是ES6吗?(另外,对我来说,这似乎节省了3个字节。)
Neil

是的,它确实节省了3个字节。我必须包括f=在字节计数
ETHproductions

3

q,42个字节

一种

19字节

6?"ABC123!@TPOI098"

14字节

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

C

9字节

6?15#.Q.a

(使用字母表的前十五个字母)


3

朱莉娅(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个字节

任意字母,23个字节:

{"ABC123!@TPOI098"mR}6*

在线尝试!

十六进制数字,15个字节:

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

在线尝试!

字母ABCDEFGHIJKLMNO,10个字节:

{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 randomrandom.choice在第一两个例子至少。
罗曼·格拉夫(RomanGräf)

import random random.choice是27 from random import* choiceimport random as r r.choice

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是介于0到15之间的6个随机数;{~是从。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其转换为^ h˚F ROM d ecimal。您可以使用来获得9字节的解决方案,hfd?6#15。最后一种情况是为了使某些内容易于阅读,它使用'A'10个字节的解决方案中的字母u:65+?6#15,总共得出24 + 9 + 10 =45。–
英里

@miles我认为第二种情况需要大写字母。至于最后一种情况...哈哈,哎呀。我完全忘记了向量化加法。
科纳·奥布莱恩

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个字节。

自定义(AO)(35字节)

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

我认为我不能接受您的第二部分。AE与AE并不相同
James Webster's

0

Scala,154个字节

硬编码字母(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' 创建一个从A到O的15个字符的序列


0

点子,42字节

硬编码字母,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)从015)。

Μ*S6d r lp^1ά

1-9A-F字母,13个字节。在这里尝试! lp^1ά与相同,除了从116


通用方法:

Μ*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)})

所有这些都遵循相同的模式-从循环05,每次迭代选择一个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

在这里尝试!

十六进制字母,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个字符的字符串。
Emigna

问题没有说明输出格式。
2016年

我在规范中的4个地方看到生成6个字符串的字样。
Emigna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.