ssTTsSTtRrriinInnnnNNNIiinngg


18

挑战

对于字符串的每个字符(最后一个字符除外),请执行以下操作:

  • 输出当前字符。

  • 接下来,从以下列表中随机输出1-5(含)之间的随机次数:

    • 当前角色
    • 字符串的下一个字符
    • 您当前使用的字符的开关盒版本
    • 字符串的下一个字符的开关盒版本。

测试用例

String -> SSSTSStrTrIiinIIngn

, . , . , . Hello world! -> ,,, .. , ,, .... , , .. .. . HHH HHEeelLlLllooO wwOworOOrrrRllDd!!D

Programming Puzzles and Code Golf -> PrPPrRrOooooogggRgGraAraaaMMMmmmimMIiininGGgG PPPPuZzZZzZzzZzllLLEEeEsEsssS a aANnNddD C COCoooOOdeDe E GGGoOllFFf

笔记

  • 如果字符是字母(AZ和az)的一部分,则仅需要应用字符的切换大小写版本。
  • 您的随机函数不必统一,但仍需要有机会返回给定列表中的任何元素。
  • 您可以使用任何标准的I / O格式。
  • 您可以假定输入的长度大于或等于2。
  • 您可以假定输入仅包含ASCII字符。
  • 标题不是测试用例(如果是有效的测试用例,则不是故意的)。
  • Switchcase表示将char转换为小写(如果为大写),并将其转换为大写(如果为小写)。

除了“ ...不需要统一”之外,我想您可能希望指定给定某些输入,原则上应该可以生成所有有限的合法输出(否则,[1中我的非均匀随机整数,2,3,4,5]始终为2,我只输出原始字符串)。
Chas Brown

@ChasBrown是的,我将编辑问题
MilkyWay90

2
我发现规范令人困惑。您能说得更清楚些吗?例如,研究如何String生产SSSTSStrTrIiinIIngn
Luis

7
@LuisMendo我不是OP,但是我认为:[S]SSTSS [t]rT, [r]I, [i]inII, [n]gn,其中块之间的字符是第一个项目符号点(“ 输出当前字符 ”),而其他字符则是1-5次的随机1-4倍字符。但是我同意,更明确的解释是适当的。除了测试用例外,尚不清楚我们是否必须选择1-5次随机选择。而不是选择重复1-5次的随机选择(就像Gaia回答当前所做的那样)。
Kevin Cruijssen

3
@KevinCruijssen谢谢,您的解释符合示例,并且很清楚。OP应确认并将其编辑为文本
Luis Mendo

Answers:


6

盖亚 25字节

ṇ\+†ṅ\⟨)₌¤:~+4ṛ⟨ṛ₌¤⟩ₓ\⟩¦$

在线尝试!

感谢Kevin Cruijssen指出2个bug!

ṇ\				| delete the last character from the input
  +†				| push the input again and concatenate together, so for instance
				| 'abc' 'bc' becomes ['ab' 'bc' 'c']
    ṅ\				| delete the last element
       ⟨       		⟩¦	| for each of the elements, do:
	)₌			| take the first character and push again
	  ¤			| swap
	   :			| dup
	    ~			| swap case
	     +			| concatenate strings
	      4ṛ		| select a random integer from [1..5]
	        ⟨    ⟩ₓ		| and repeat that many times
		 ṛ₌¤		| select a random character from the string
		      \ 	| clean up stack
			   $	| convert to string

请注意,这4ṛ是因为它是为整数实现的,z例如python random.randint(1,z+1),它返回的整数N1<=N<=z+1


您确定游程长度编码在这里正确吗?如果我正确理解了挑战,则应随机选择1-5次这四个选项,而不是随机选择1-4次,重复1-5次。第一个示例输出SSSTSStrTrIiinIIngn[SSSTSS, trT, rI, iinII, ngn])似乎反映了这一点,目前在您的程序中尚无可能(我认为)。
Kevin Cruijssen

@KevinCruijssen我将“从列表中输出的随机次数”解释为游程长度解码,但是您是对的,测试用例似乎确实表明了其他解释;我认为应该很容易解决
Giuseppe

1
5ṛ可能由于6某种原因导致无法在线尝试?PS:在Gaia中是否没有整数到范围列表或范围for循环中?
凯文·克鲁伊森

1
@KevinCruijssen dang,Business Cat确实需要解决一个错误。我真的以为有一种for类型构造,但是我敢肯定,它甚至没有记录在Wiki页面上。
朱塞佩

4

APL(dzaima / APL),23 个字节

匿名默认前缀功能。

2(⊣,{?4⍴⍨?5}⊇,,-⍤,)/

在线尝试!

2()/ 在每个字符对之间应用以下infix默认功能:

- 所述switchcase
 的
, 所述对的级联

,, 将这对的连接放在前面

{}⊇ 从中选择以下元素:

  ?5 1…5范围内的随机数

  4⍴⍨ 这么多

  ? 这些人的随机指数

ε NLIST(扁平化)


3

Perl 6,60个字节

{S:g{.)>(.)}=$/~[~] roll ^5 .roll+1,$/.lc,$/.uc,$0.lc,$0.uc}

在线尝试!

小写/大写部分有点烦人。


我不认识Perl,所以我可能在这里说些愚蠢的话。但是,是否有可能将$/and和$0在一起并用.lc在该字符串上,然后创建该字符串的副本并使用.uc,然后将这两个并在一起?不知道这甚至有可能,或比你现在短$/.lc,$/.uc,$0.lc,$0.uc,但它意味着你会使用$/$0.lc,和.uc各一次。
凯文·克鲁伊森

1
las,(.lc~.uc for $0~$/).comb更长。Perl 6确实想区分字符串和列表,因此"abc"[0] eq "abc"(它假装成一个单项列表)。
Ven

您可以通过滑动并将匿名函数应用于列表来实现:{.lc,|.uc}($/,|$0)-5字节,而仅使用匹配列表的{.lc,|.uc}(@$/)-8字节。tio.run/...
菲尔^ h

@PhilH不,这不起作用。这些解决方案仅使用大写字母之一
Jo King


3

重击,121字节

-20字节归功于Nahuel

-9字节多亏了roblogic

for((i=0;i<${#1};i++)){
s=${1:i:1}
m=${1:i:2}
m=${m,,}${m^^}
for((t=0;t++<RANDOM%6;)){
s+=${m:RANDOM%4:1}
}
printf "$s"
}

在线尝试!

原始答案

Bash,150字节

几乎没有进行任何高尔夫击球动作,并尝试改善我的击球动作,因此欢迎提出任何意见。

for((i=0;i<${#1}-1;i++));do
c=${1:$i:1}
n=${1:$((i+1)):1}
a=($n ${c,} ${c^} ${n,} ${n^})
shuf -e ${a[@]} -n "$(shuf -i 1-5 -n 1)"|xargs printf %s
done

在线尝试!

代码是直接通过字符设置当前字符c和下一个n字符的循环,然后创建这4种可能性的数组,重复其中一种,因此恰好有5种。接下来,我们对该数组进行混洗,然后从中选择n个元素,其中n个元素之间是随机的1和5。


似乎不见了printf %s "$c"
Nahuel Fouilleul

1
do并且done可以与未记录的替换{}
纳乌艾尔乌Fouilleul


1
@roblogic很聪明。tyvm。
约拿

1
121字节的解决方案有点脆弱/笨拙,这是一个更健壮的版本(133字节),应该可以处理所有可打印的ASCII tio.run
roblogic,


2

05AB1E 18 17 字节

ü)vyн5LΩFyD.š«Ω]J

灵感来自@Giuseppe的Gaia答案
-1个字节感谢@Shaggy

在线尝试10次验证所有测试用例10次

说明:

ü)             # Create all pairs of the (implicit) input
               #  i.e. "Hello" → [["H","e"],["e","l"],["l","l"],["l","o"]]
  v            # Loop over each these pairs `y`:
   yн          #  Push the first character of pair `y`
   5LΩ         #  Get a random integer in the range [1,5]
      F        #  Inner loop that many times:
       y       #   Push pair `y`
        D.š«   #   Duplicate it, swap the cases of the letters, and merge it with `y`
            Ω  #   Then pop and push a random character from this list of four
  ]J           # After both loops: join the entire stack together to a single string
               # (which is output implicitly as result)

我不知道05AB1E,但是,INè您可以通过按的第一个字符来保存任何内容y吗?
毛茸茸的

@Shaggy是的,我确实可以..谢谢!也许我今天应该停止打高尔夫球,我真是一团糟,哈哈
。–

一团糟吗?¨vNUy5LΩFy¹X>è«D.š«Ω?
Magic Octopus Urn

1
@MagicOctopusUrn虽然很原始的方法,恐怕它不会做挑战的第一点(“ 输出当前字符。 ”),因为结果可以开始tTs输入"String"在你的程序,而应该总是以开头S
Kevin Cruijssen

1

木炭,27字节

FLθ«F∧ι⊕‽⁵‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ§θι

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

FLθ«

循环输入字符串的所有索引。

F∧ι⊕‽⁵

除了第一个索引,循环遍历1到5之间的一个随机数...

‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ

...从字符串中提取前一个和下一个字符,采用大写和小写形式,然后从这四个字符中选择一个随机字符。

§θι

在当前索引处打印字符。



1

Japt -P,14个字节

äÈ+Zu pv ö5ö Ä

尝试一下

äÈ+Zu pv ö5ö Ä     :Implicit input of string
ä                  :Take each consectutive pair of characters
 È                 :Pass them through the following function as Z
  +                :  Append to the first character of the pair
   Zu              :    Uppercase Z
      p            :    Append
       v           :      Lowercase
         ö         :    Get X random characters, where X is
          5ö       :      Random number in the range [0,5)
             Ä     :      Plus 1
                   :Implicitly join and output

1

Python 3 3,167字节

from random import*;c=choice
def f(s):
 i=0;r=""
 for i in range(len(s)-1):
  r+=s[i]
  for j in range(randrange(5)):r+=c([str.upper,str.lower])(c(s[i:i+2]))
 return r

在线尝试!


1

果冻,14字节

;;;Œs$Xɗ¥5X¤¡Ɲ

在线尝试!

说明

             Ɲ | For each overlapping pair of letters
;              | Join the first letter to...
         5X¤¡  | Between 1 and 5 repetitions of...
      Xɗ¥      | A randomly selected character from...
 ;;Œs$         | A list of the two letters and the swapped case versions of both

1

C(海湾合作委员会) 175个 162字节

来自LambdaBeta的-12个字节

f(s,S,i,r,a)char*s,*S,*i;{srand(time(0));for(i=S;*(s+1);++s){*i++=*s;for(r=rand()%5+1;r--;*i++=rand()&1?a>96&a<123|a>64&a<91?a^32:a:a)a=rand()&1?*s:*(s+1);}*i=0;}

在线尝试


我认为0第一行中不需要。
LambdaBeta

通过将缓冲区S作为参数并将变量添加到参数列表,还可以节省很多字符:在线尝试!
LambdaBeta

@LambdaBeta证明您是正确的0,这已经不值得#define
rtpax


1

PowerShell154 105 103 95 87个字节

-67字节感谢无法停止的mazzy

-join(($x=$args)|%{$_;$x[$i,++$i]*5|%{"$_"|% *wer;"$_"|% *per}|random -c(1..5|random)})

在线尝试!

这不是一个奇妙的方法,但它可以工作。现在很好。通过喷溅进行输入


哦,哇,多数民众赞成在很多字节。
MilkyWay90

1
@mazzy dog狗。我需要一直养成习惯,但不知道您可以像这样热交换通配符成员。
Veskah,

1
对不起,87个字节
令人着迷

0

Scala 2.12.8,214字节

高尔夫球版:

val r=scala.util.Random;println(readLine.toList.sliding(2).flatMap{case a :: b :: Nil=>(a +: (0 to r.nextInt(5)).map{_=>((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)})}.mkString)

打入换行符和缩进:

val r=scala.util.Random
println(readLine.toList.sliding(2).flatMap{
  case a :: b :: Nil=>
    (a +: (0 to r.nextInt(5)).map{_=>
      ((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)
    })
}.mkString)

取消高尔夫:

import scala.io.StdIn
import scala.util.Random

def gobble(input: String): String = {
  input.toList.sliding(2).flatMap {
    case thisChar :: nextChar :: Nil =>
      val numberOfAdditions = Random.nextInt(5)
      (thisChar +: (0 to numberOfAdditions).map { _ =>
        val char = if(Random.nextBoolean) thisChar else nextChar
        val cc = if(Random.nextBoolean) char.toUpper else char.ToLower
        cc
      })
  }.mkString
}

println(gobble(StdIn.readLine()))

1
没办法a :: b :: Nil变成a::b::Nil吗?同为a :+a:+()a.:+()可能工作
法师

@Ven a::b::Nil导致编译错误。+:是在列表中定义的方法,因此它可以通过摆脱外部括号来节省空间?
索伦

你只需要在这里只有一个ELEM所以它不是autotupling反正
法师



0

T-SQL查询,286个字节

DECLARE @ char(999)='String'

SELECT @=stuff(@,n+2,0,s)FROM(SELECT
top 999*,substring(lower(c)+upper(c),abs(v%4)+1,1)s
FROM(SELECT*,number n,substring(@,number+1,2)c,cast(newid()as varbinary)v
FROM(values(1),(2),(3),(4),(5))F(h),spt_values)D
WHERE'P'=type and n<len(@)-1and h>v%3+2ORDER
BY-n)E
PRINT LEFT(@,len(@)-1)

在线尝试不幸的是,,与MS SQL Server Management Studio不同,在线版本对于相同的varchar总是显示相同的结果




0

C(GCC) 110个 109字节

i,p;g(char*_){for(i=rand(putchar(*_))%1024;p=_[i%2],putchar(i&2&&p>64&~-p%32<26?p^32:p),i/=4;);_[2]&&g(_+1);}

在线尝试!

-1感谢ceilingcat

i,p;g(char*_){
    for(i=rand(putchar(*_)) //print current char
         %1024;             // and get 10 random bits
        p=_[i%2],           //1st bit => current/next char
        putchar(i&2&&       //2nd bit => toggle case
            p>64&~-p%32<26  // if char-to-print is alphabetic
            ?p^32:p),
        i/=4;);             //discard two bits
    _[2]&&g(_+1);           //if next isn't last char, repeat with next char
}

打印的字符数(每个输入字符)不是一致地随机的:

1  if      i<   4 (  4/1024 = 1/256)
2  if   4<=i<  16 ( 12/1024 = 3/256)
3  if  16<=i<  64 ( 48/1024 = 3/ 64)
4  if  64<=i< 256 (192/1024 = 3/ 16)
5  if 256<=i<1024 (768/1024 = 3/  4)

0

Zsh,113 107字节

随着大量的从帮助man zshexpnman zshparam在线尝试!

  • -6由我调整
for ((;i<#1;i++)){m=${1:$i:2};m=$m:l$m:u
for ((;t<RANDOM%5;t++))x+=${m[RANDOM%4]}
echo ${1[i]}$x\\c;t=;x=;}
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.