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は、文字が大文字の場合は小文字に変換し、小文字の場合は大文字に変換することを意味します。

「...は均一である必要はありません」に加えて、何らかの入力が与えられた場合、原則としてすべての有限の法的出力が生成できるように指定する必要があると思います(そうでなければ、[1 、2,3,4,5]は常に2になり、元の文字列を出力します)。
チャスブラウン

@ChasBrownええ、質問を編集します
MilkyWay90

2
仕様がわかりにくいです。もっと明示できますか?たとえば、どのようにStringプロデュースするかをSSSTSStrTrIiinIIngn
考え

7
@LuisMendo私はOPではありません[S]SSTSS [t]rT, [r]I, [i]inII, [n]gnが、ブロック間の文字は最初の弾丸ポイント(「現在の文字を出力する」)であり、他の文字は1〜5回ランダムに4つの選択肢の1つですキャラクター。しかし、私は同意する、いくつかのより明示的な説明が適切であろう。テストケースとは別に、ランダムな選択を1〜5回選択する必要があることは特に明確ではありませんでした。ランダムな選択を1〜5回繰り返す代わりに(現在のGaiaの回答では)。
ケビンクルーイッセン

3
@KevinCruijssenありがとう、あなたの説明は例に当てはまり、明確です。OPはそれを確認してテキストに編集する必要があります
ルイスメンドー

回答:


6

ガイア、25バイト

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

オンラインでお試しください!

2つのバグを指摘してくれたKevin Cruijssenに感謝します!

ṇ\				| 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

これはpythonのような整数に対して実装されて4ṛいるためです。これはのような整数を返します。zrandom.randint(1,z+1)N1<=N<=z+1


ここでランレングスエンコードは正しいですか?チャレンジを正しく理解している場合:4つのオプションは、ランダムに1〜5回繰り返され、4つのランダムに1つを選択する代わりに1〜5回選択する必要があります。最初の出力例SSSTSStrTrIiinIIngn[SSSTSS, trT, rI, iinII, ngn])はこれを反映しているようで、現在はプログラムの出力としては使用できません(私は思う)。
ケビンクルーッセン

@KevinCruijssen「リストからのランダムな回数の出力」をランレングスデコードと解釈しましたが、そうです、テストケースは他の解釈を示しているようです。修正するのはかなり簡単だと思う
ジュゼッペ

1
5ṛ6何らかの理由で結果を得ることができますオンラインで試してみてください?PS:Gaiaには、範囲リストへの整数や範囲forループはありませんか?
ケビンクルーッセン

1
@KevinCruijssen dang、ビジネスキャットは本当にオフバイワンエラーを修正する必要があります...私は本当にfor型構造があると思っていましたが、それはかなり確信していますそれはウィキページにも文書化されていないことは。
ジュゼッペ

4

APL(dzaima / APL)、23 バイト

匿名の暗黙の接頭辞関数。

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

オンラインでお試しください!

2()/ 各文字ペアの間に以下の中間語暗黙関数を適用します。

- switchcase
 の
, ペアの連結

,, ペアの連結をそれに追加します

{}⊇ その中から次の要素を選択します。

  ?5 範囲1〜5の乱数

  4⍴⍨ その四つ

  ? それらのランダムなインデックス

ϵ nlist(平坦化)


3

Perl 6、60バイト

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

オンラインでお試しください!

小文字/大文字の部分はちょっと面倒です。


私はPerlを知らないので、おそらくここで愚かなことを言っているのでしょう。しかし、$/$0一緒に連結して.lcその文字列で使用し.uc、その文字列のコピーを作成してを使用し、それら2つを連結することはどういうわけか可能ですか?わからないことも可能、または現在よりも短いなら$/.lc,$/.uc,$0.lc,$0.uc、それはあなたが使用したい意味するであろう$/$0.lc、および.uc各一回。
ケビンクルーッセン

1
悲しいかな、(.lc~.uc for $0~$/).comb長いです。Perl 6は本当に文字列とリストを区別したいので"abc"[0] eq "abc"(単一項目リストのふりをします)。
ヴェン

スリップし、匿名関数をリストに適用することで実行できます。- {.lc,|.uc}($/,|$0)5バイトの場合、{.lc,|.uc}(@$/)-8バイトの一致のリストを使用します。tio.run/...
フィル・H

@PhilHいいえ、動作しません。これらのソリューションは、それぞれの文字の1つ
Jo King


3

Bash、121バイト

ナウエルのおかげで-20バイト

ロブログのおかげで-9バイト

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つの可能性の配列を作成し、そのうちの1つを正確に5繰り返すように単純なループです。次に、その配列をシャッフルし、そこからn個の要素を選択します1および5。


欠落しているようですprintf %s "$c"
ナウエル・フイユル

1
doそしてdone文書化されていないと交換することができる{}
ナウエルFouilleul


1
@roblogicそれは賢いです。tyvm。
ヨナ

1
121バイトのソリューションは少し壊れやすい/バギーです。すべての印刷可能なASCII tio.runを
roblogic


2

05AB1E18 17 バイト

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

@GiuseppeのGaia answerに触発されました@Shaggyの
おかげで-1バイト

オンライン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はい、できます。たぶん私は今日のためにゴルフを停止する必要があり、私は混乱だ、笑...
ケビンCruijssen

あなたは混乱していますか?¨vNUy5LΩFy¹X>è«D.š«Ω?
マジックタコUr

1
@MagicOctopusUrnはかなり独創的なアプローチが、私はそれが挑戦の最初の箇条書き行いません怖い(「出力電流の文字を。」)、結果はと始めることができるのでtTまたはs入力のために"String"、あなたのプログラムでは、一方で常にで始まることになっていSます。
ケビンクルーッセン

1

、27バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

FLθ«

入力文字列のすべてのインデックスをループします。

F∧ι⊕‽⁵

最初のインデックスを除き、1から5までの乱数をループします...

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

...文字列から前の文字と次の文字を抽出し、大文字と小文字のバージョンを取り、4つのランダムな文字を選択します。

§θι

現在のインデックスの文字を印刷します。


1

perl 5(-p)、77バイト

s/(.)(?=(.))/$x=$1;'$x.=substr"\U$1$2\L$1$2",4*rand,1;'x(1+5*rand)/gee;s/.$//

TIO


あなたは使用して4つのバイトを保存することができます$&代わりに$1、およびchop+ -lの代わりにs/.$//
ダダ

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

C(GCC)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最初の行に必要だとは思わない。
ラムダベータ

また、バッファーSをパラメーターとして使用し、変数を引数リストに追加することで、多くの文字を節約できます。オンラインで試してください!
ラムダベータ

おうち@LambdaBetaターンが右うとしている0、それが持っている、それは価値がない作られ、#defineもう
rtpax


1

PowerShell154 105 103 95 87バイト

-止められない狂気のおかげで-67バイト

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

オンラインでお試しください!

素晴らしい方法ではありませんが、機能します。今ではかなり良いです。スプラッティングを介して入力を受け取ります


ああ、すごい、それはたくさんのバイトです。
MilkyWay90

1
@mazzy Dang dog。私は常にスプラッティングの習慣を身につける必要がありますが、そのようなワイルドカードのメンバーをホットスワップできるとは知りませんでした。
ヴェスカ

1
ごめんなさい87バイト
mazzy

0

スカラ 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 :: Nila::b::Nil?同じa :+a:+()または動作するa.:+()可能性があります
ヴェン

@Ven a::b::Nilはコンパイルエラーを引き起こします。+:リストで定義されているメソッドであるため、外側の括弧を削除することでスペースを節約できますか?
ソレン

ここにはelemが1つしかないので、とにかく自動タプリングではありません
Ven



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)

残念ながらオンラインで試してください。MSSQL Server Management Studioとは異なり、オンラインバージョンでは常に同じvarcharに対して同じ結果が表示されます。




0

C (gcc), 110 109 bytes

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);}

Try it online!

-1 thanks to 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
}

The number of characters printed (per input character) is not uniformly random:

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 bytes

With a lot of help from man zshexpn and man zshparam. Try it Online!

  • -6 by me, tweaking
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=;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.