随机大写


37

任务

您的任务是创建一个程序或函数,在给定输入的情况下,将输入文本输出为带有大写字母的随机字母,同时将已经大写的字母保持为大写字母。

小写字母大写的每种组合都应该是可能的。例如,如果输入是abc,应该有输出任何以下组合中的一个非零的概率:abcAbcaBcabCABcAbCaBCABC

输入值

您的输入是一个字符串,包含任意数量的可打印ASCII字符,例如Hello World。该输入的输出包括HeLLo WoRlDHElLO WOrld

计分

这是代码高尔夫,因此每种语言中最短的答案会获胜!

Answers:


14

TI-Basic(83系列),137字节

For(I,1,length(Ans
Ans+sub(sub(Ans,I,1)+"ABCDEFGHIJKLMNOPQRSTUVWXYZ",1+int(2rand)inString("abcdefghijklmnopqrstuvwxyz",sub(Ans,I,1)),1
End
sub(Ans,I,I-1

在中输入Ans,如以下屏幕截图所示:

在此处输入图片说明

(如果屏幕截图看起来像是乱七八糟的(有时对我来说如此,请尝试在新标签页中打开它吗?)

TI-Basic(至少是TI-83版本...也许我应该涉足TI-89高尔夫运动)是一种可怕的语言,试图挑战这一挑战,因为:

  1. 它绝对不支持任何带字符的算术运算,也不知道小写字符的大写形式,甚至不知道字母。
  2. 每个单个小写字符占用2个字节来存储。(实际上,我必须使用汇编脚本才能输入小写字母。)

结果是该程序的78个字节(超过一半)仅存储了两次字母表。

无论如何,我们的想法是循环遍历字符串,并有机会将小写字符转换为大写字符,并将结果添加到字符串的末尾,以便将输入和输出都存储在中Ans。当我们离开For(循环时,I它比原始字符串的长度大一,因此I-1从开始的字符I给出输出。


应用程序“ MirageOS”和“ OmniCalc”都允许您只需按两次alpha即可键入小写字母。而且它们还具有其他不错的功能。
法比安·罗林(FabianRöling)

@Fabian组装脚本和您提到的应用程序基本上都以相同的方式工作:它们在操作系统中设置一个标志,以启用“按两次Alpha键以小写字母”。
米莎·拉夫罗夫

11

Japt,6个字节

®m`«`ö

在线测试!

说明

®m`«`ö   Implicit input
®        Map each char in the input by
 m         mapping each char in this char through
  `«`ö       a random character of "us". (`«` is "us" compressed)
             The u function converts to uppercase, and s is slice, which does nothing here.
         Implicit output


10

C, 47  46字节

感谢@ l4m2节省了一个字节!

f(char*s){for(;*s++-=(*s-97u<26&rand())*32;);}

在线尝试!

如果可以假定{|}~未出现在输入中,则将为42个字节:

f(char*s){for(;*s++-=(*s>96&rand())*32;);}

在线尝试!


值得注意的是,对于特定的实现,大写是完全确定性的(C标准srand(1)在程序开始时提供了隐式,因此在每次执行中,返回的值的顺序rand()都将相同)。
Matteo Italia

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}对于某些编译器(-funsigned-char
默认

@ l4m2谢谢!但是由于某种原因,这不起作用。更改'a'97u有效,甚至不需要-funsigned-char标志。
Steadybox '18

看来,当你减去'a'(这是signed int不是unsigned char)从*s(这是unsigned char),*s提升为signed int替代unsigned int,因此负值是可能的,并且预期比较不工作。
Steadybox '18

8

果冻,5个字节

多亏迪尔南,另一个人才尘土飞扬。

żŒuX€

在线尝试!

说明

żŒuX€  main link: s = "Hello world"

żŒu    zip s with s uppercased  ["HH", "eE", "lL", "lL", "oO", "  ", ...]
   X€  map random choice        "HeLLo woRlD"

1
我需要ŒṘ更多地使用它来查看事物在引擎盖下的表示方式
dylnan


7

JavaScript(ES6),56个字节

s=>s.replace(/./g,x=>Math.random()<.5?x.toUpperCase():x)

如果不需要统一的随机性,则可以使用当前时间作为随机性的来源来节省6个字节:

s=>s.replace(/./g,x=>new Date&1?x.toUpperCase():x)

这趋向于大写或一次不理会所有字母。


“输出以下任意组合的概率不应该为零:abc,Abc,aBc,abc,ABc,AbC,aBC或ABC”,而您的输出却无法输出,AbC因为时间变化不会那么快
l4m2

@ l4m2,如果您有一台非常慢的机器,它可能会;-)也许我应该删除该部分...
ETHproductions '18

6

R,66字节

for(i in el(strsplit(scan(,""),"")))cat(sample(c(i,toupper(i)),1))

在线尝试!

另一个R答案。


我已经写了太多的“常规” R代码,甚至没有想到尝试使用for-loop!好东西。
朱塞佩

6

Excel VBA,74 71 64字节

Randomize调用总是使VBA中的随机输出代价高昂:(

匿名VBE立即窗口功能,该功能从范围获取输入[A1]并输出到VBE立即窗口。产生50%(平均)的UCased输出。

For i=1To[Len(A1)]:a=Mid([A1],i,1):?IIf(Rnd>.5,a,UCase(a));:Next

你好先生。您可以通过删除保存2个字节Randomize:,并改变Rnd[RAND()>.5]。或者只是忽略它。:)
取消

@remoel,不幸的是,该[Rand()]呼叫是唯一的伪随机和具有大约10 ^ 13的周期长度,使其在功能上等同于未Randomized Rnd呼叫,事实上两个用相同的种子(其Randomize呼叫通过使用timer功能输出)。
泰勒·斯科特

@romoel,但是我确实认为,在提示符下可以取消Randomize呼叫并改为使用Rnd>.5
Taylor Scott

6

木炭8 7字节

⭆S‽⁺↥ιι

在线尝试!链接是详细版本的代码。说明:

 S          Input string
      ι     Character
    ↥ι      Uppercase character
   ⁺        Concatenate
  ‽         Random element
⭆           Map over each character and join the result
            Implicitly print

4

Ruby,40个字节

带字符串的Lambda函数。感谢Arnauld,节省了1个字节。感谢Snack,节省了5个字节。

->s{s.gsub(/./){|x|[x,x.upcase].sample}}

1
欢迎来到PPCG!您可以用<1代替来保存一个字节==1吗?
Arnauld


不错,@ displayname。当用户提高分数时,FWIW许多人喜欢用<s>标记“划掉”旧分数,例如“ Ruby,<s> 46 </ s> 40个字节”。当然不是必需的。
乔丹

3

APL + WIN,37个字节

⎕av[c-((n÷2)<n?n←⍴s)×32×s←98<c←⎕av⍳⎕]

提示输入屏幕,标识小写字母并将其随机转换为大写字母。


3

R89 88字节

由djhurio超越!

cat(sapply(el(strsplit(scan(,""),"")),function(x)"if"(rt(1,1)<0,toupper,`(`)(x)),sep="")

在线尝试!

该程序采用每个字符,并以1/2的概率将其转换为大写字母或将其保留。这可能与不同价值观打调整这个概率df0

rt从学生的t分布中抽取,该t分布的中位数为0,且具有任意自由度(我选择1它是因为它是可能的最小数)。


1
这是随机执行某件事的非常R的方式。
米莎·拉夫罗夫


@djhurio太棒了。
朱塞佩

3

05AB1E6 5字节

谢谢Adnan的-1个字节

uø€ΩJ

在线尝试!

说明

uø€ΩJ   
u      Upper case of top of stack. Stack: ['zzzAA','ZZZAA']
 ø     Zip(a,b). Stack: ['zZ', 'zZ', 'zZ', 'AA', 'AA']
  €    Following operator at each element of it's operand
   Ω   Random choice. Stack: ['z', 'Z', 'z', 'A', 'A']
    J  Join a by ''. Stack: 'zZzAA'
        Implicit output

方法来自@totallyhuman的答案


1
有人会打败6吗?:P
ETHproductions 2017年

1
@ETHproductions如果Jelly对于05AB1E这样的大写字母有一个单字节运算符,我们会的!
dylnan '17

哦... random_pick的新命令是吗?ε„luΩ.V是我的尝试,很好!
魔术章鱼缸

3
您可以将重复项删除:)
Adnan

1
有人会打败5吗?:P
完全人类的,2017年


3

斯威夫特4,86字节

s.map{let s="\($0)",u=s.uppercased();return u==s ? u:arc4random()%2==0 ? u:s}.joined()

3
欢迎来到PPCG!
Martin Ender

3

Java 8,46字节

此lambda是从IntStreamIntStream(代码点的流)。

s->s.map(c->c>96&c<'{'&Math.random()>0?c-32:c)

在线试用

资本分配

是否使用大写字母曾经是的相当明智的条件,Math.random()<.5大约一半的时间可以满足。在当前条件下Math.random()>0(节省一个字节),几乎每次都会出现大写,这使测试程序毫无意义。但是它确实满足了随机性要求。

致谢

  • -1字节感谢OlivierGrégoire

如果使用流路由,则可以使用代码点并执行41个字节
OlivierGrégoire17年

好吧,如果输入包含上面的ASCII字符,这会中断z。不过我可以带一个资格。
雅各布


3

时髦,55字节

s=>s::gsub("."c=>{0s.upper,s.lower}[math.random(2)](c))

在线尝试!

由于使用了可选的逗号,因此0s.upper在表定义中执行此操作要短一个字节,这意味着math.randomwill会随机选择1or 2,而不是math.random(0,1)在进行随机操作时不使用0


3

R60 59 58 57 56 63字节

intToUtf8((s=utf8ToInt(scan(,"")))-32*rbinom(s,s%in%97:122,.5))

在线尝试!

在这里这里与其他两个R答案的方法不同。改进和修复,感谢朱塞佩!


我不知道采样函数的行为!
朱塞佩

@Giuseppe就在我以为不能打高尔夫球的时候……
JayCe


@Giuseppe这不仅是高尔夫球手,而且更加优雅!爱它!
JayCe '18年

在第二种观点,这会不会当打印的ASCII字符以上的工作90一样[,但为+7个字节这个修复它这仍然是golfier比djhurio的答案
朱塞佩

2

衔尾蛇,25个字节

i.b*)..96>\123<*?2*>32*-o

在这里尝试

唯一看中的部分是控制流程.b*)。让我们先谈谈其余部分。

i..                    Get a character of input, duplicate twice
   96>                 Test if charcode greater than 96
      \                Swap with copy #2
       123<            Test if charcode less than 123
           *           Multiply the two tests (logical AND): test if it is lowercase letter
            ?          Random number between 0 and 1
             2*        Times 2
               >       Is lcase test greater? If test was 1 and rand*2 < 1, then 1, else 0
                32*-   Multiply by 32 and subtract from charcode to ucase lcase letter
                    o  Output as character

然后,我们循环回到该行的开头。控制流程包括更改行尾的位置;如果将其移到IP的左侧,则执行终止。从而:

 .     Duplicate input charcode
  b*   Push 11 and multiply
    )  Move end of line that many characters to the right

当字符代码为正数时,)它是空操作,因为该行的末尾尽可能远。但是当所有字符都读完后,i给出-1。然后,我们将代码-11字符的结尾向右移动,即,向左移动11个字符。它需要进行几次迭代,但是最终IP超出了代码末尾,程序停止了。



2

Brachylog,5个字节

ụᶻṛᵐc

在线尝试!

说明

Example input: "Test"

ụᶻ        Zip uppercase:      [["T","T"],["e","E"],["s","S"],["t","T"]]
  ṛᵐ      Map random element: ["T","e","S","T"]
    c     Concatenate:        "TeST"

2

爱丽丝17 15字节

感谢Leo节省2个字节。

/uRUwk
\i*&o.@/

在线尝试!

说明

/...
\...@/

这是完全以Ordinal模式运行的大部分线性程序的常用框架。

i    Read all input as a string.
R    Reverse the input.
&w   Fold w over the characters of the string. w is nullary which means it
     doesn't actually use the individual characters. So what this does is that
     a) it just splits the string into individual characters and b) it invokes
     w once for each character in the string. w itself stores the current 
     IP position on the return address stack to begin the main loop which
     will then run N+1 times where N is the length of the string. The one
     additional iteration at the end doesn't matter because it will just
     output an empty string.
.    Duplicate the current character.
u    Convert it to upper case (does nothing for characters that aren't
     lower case letters).
*    Join the original character to the upper case variant.
U    Choose a character at random (uniformly).
o    Print the character.
k    If the return address stack is not empty yet, pop an address from it
     and jump back to the w.
@    Terminate the program.

我首先尝试完全在基数模式下执行此操作,但是仅根据字符代码确定某物是否为字母可能会占用更多字节。


2

Wolfram语言(Mathematica)52 49 44字节

StringReplace[c_/;Random[]<.5:>Capitalize@c]

在线尝试!

使用以下运算符形式StringReplace:提供一个规则(或规则列表),但没有字符串提供将该规则应用于您作为输入提供给它的任何字符串的功能。

RandomChoice@{#,Capitalize@#}&/@#&如果我们决定将一个字符列表作为输入(并产生作为输出),我们可以做得更好(34个字节),在Mathematica中,人们有时认为这是可以的,因为这是其他语言中唯一的字符串。但这没意思。


-5个字节,感谢M. Stern


使用Capitalize
M. Stern,在2008年

如果您Random不赞成使用已弃用的代码,则可以通过实现自己的命令来节省另外四个字节RandomChoiceStringReplace[c_/;Random[]<.5:>Capitalize@c]
M. Stern

@ M.Stern我试图Random一次上班,但是我忘记了这一点,/;所以我试图If发表一份声明。谢谢!
Misha Lavrov

2

Pyth,10 7 6个字节

smO,r1

由于ovs节省了3个字节,感谢Steven H节省了1个字节。

在线尝试

说明

smO,r1
 m      Q   For each character in the (implicit) input...
   ,r1dd    ... get the capitalized version and the (implicit) character, ...
  O         ... and pick one at random.
s           Concatenate the result.

r1d= rd1,允许您隐式输入golf另一个字节。
史蒂文H.

2

PHP, 63 53个字节

while($a=$argv[1][$i++])echo rand()%2?ucfirst($a):$a;

遵循Titus的建议,设法(部分地)将代码减少了10个字节。


1
好东西!之前不需要空格$a。尝试while(~$a=$argn[$i++])而不是foreach(作为管道运行)。
泰特斯(Titus),

使用该代码,我收到了“未捕获的错误:不支持的操作数类型”错误。而且我不知道为什么这样做,但是我怀疑〜。(也许是因为我使用PHP7并且该方法仅适用于5.6)
RFSnake

2

PowerShell57 56字节

-join([char[]]"$args"|%{(("$_"|% *per),$_)[(Random)%2]})

在线尝试!

-1字节感谢briantist

将输入作为字符串,将$args数组显式转换为字符串,将其转换为char-array,然后通过循环输入字符。每次迭代,我们50-50要么按原样输出字符,$_要么将其转换为大写字母"$_".ToUpper()(这就是("$_"|% *per)垃圾)。这是通过获取一个Random整数并将其取为mod来选择的2

这些字符留在管道上,然后-join一起返回单个字符串,该字符串本身留在管道上,并且输出是隐式的。


您可以保存一个字节,更改"$_".ToUpper()("$_"|% *per):-/
briantist'Dec 3''17

1
@briantist好东西,我们不在乎可读性。;-) 谢谢!
AdmBorkBork



1

果冻,16字节

2ḶXø³L¤Ð¡ḊT
Œu¢¦

在线尝试!

说明

2ḶXø³L¤Ð¡ḊT    First Link
2Ḷ             The list [0,1]
  X            Random element (1 is truthy, 0 is falsy)
   ø           Begin nilad
    ³L         Length of first input (the string)
      ¤        End nilad
       С      Random([0,1]) for each character in the input string and collect.
         Ḋ     The list had an extra None at the beginning. Don't know why. This removes it (the first element of the list)
          T    Get indices of all truthy 

Œu¢¦           Main Link
Œu             Capitalize
   ¦           At the indices in the list:
  ¢            The first link as a nilad (list of indices)

我无法让它单行工作。我也不知道为什么,但2ḶXø³L¤Ð¡给人的名单[None,1,0,..,1]0S和1S ^随机选择。这None第一个链接中的原因。

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.