ランダム大文字


37

タスク

あなたの仕事は、入力が与えられると、ランダム化された文字を大文字にして入力テキストを出力するプログラムまたは関数を作成することです。

小文字の大文字のあらゆる組み合わせが可能です。入力された場合、例えばabc、以下の組み合わせのいずれかを出力する非ゼロの確率があるはず:abcAbcaBcabCABcAbCaBCまたはABC

入力

入力は、たとえば、任意の数の印刷可能なASCII文字を含む文字列Hello Worldです。その入力に対する出力が含まれるHeLLo WoRlDHElLO WOrldなど

得点

これはコードゴルフですので、各言語で最短の答えが勝ちです!

回答:


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バイト(半分以上)がアルファベットを2回だけ格納していることです。

とにかく、アイデアは、文字列をループして、小文字を大文字に変換し、結果を文字列の最後に追加して、入力と出力の両方がに格納されるようにすることAnsです。私たちが去るときにFor(ループを、Iそう取って、元の文字列の長さより1つ多いですI-1から始まる文字をI出力を提供します。


アプリ「MirageOS」と「OmniCalc」はどちらも、アルファを2回押すだけで小文字を入力できます。また、他にも便利な機能があります。
ファビアンレーリング

@Fabianアセンブリスクリプトと、あなたが言及したアプリはどちらも基本的に同じ方法で動作します。オペレーティングシステムで「アルファを2回押して小文字にする」ことを可能にするフラグを設定します。
ミシャラヴロフ



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()同じになります)。
マッテオイタリア

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}一部のコンパイラ(-funsigned-char
定義

@ l4m2ありがとう!何らかの理由でそれは動作しません。動作する'a'ように変更する97uと、-funsigned-charフラグさえ必要ありません。
Steadybox

あなたが引くときと思われる'a'(これはsigned int、ありませんunsigned charから)*s(であるunsigned char*sに昇格ますsigned int代わりにunsigned int、したがって負の値が可能であると意図したように比較は動作しません、。
Steadybox

8

ゼリー、5バイト

別の1バイトは、dylnanのおかげです。

żŒ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のいずれかの組み合わせを出力する確率は0でなければなりません」がAbC、時間はそれほど変化しないため出力できません
l4m2

@ l4m2あなたが本当に遅いマシンを持っているなら、それはかもしれません;-)たぶん私はただその部分を削除するべきです
...-ETHproductions


6

Excel VBA、74 71 64バイト

Randomizeコールは常にVBAでのランダム出力は高価になり:(

範囲から入力を受け取り[A1]、VBEイミディエイトウィンドウに出力する匿名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

@remoel、残念ながら、[Rand()]通話のみで疑似ランダムと約10 ^ 13の周期長を有し、国連それが機能的に同一の製造RandomizeDのRnd呼び出し、実際に2つの使用同じシード(Randomize設定使用してtimer機能を出力)。
テイラースコット

@romoel、私はそれは私が削除できることをプロンプト上で明確化を与えられたとししかしんRandomize使う代わりに電話をしてRnd>.5
テイラー・スコット

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か?
アーナルド


いい仕事@displayname。ユーザーがスコアを改善すると、多くの場合<s>、「Ruby、<s> 46 </ s> 40 bytes。もちろん必須ではありません。
ヨルダン

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自由度が中央値0であるスチューデントのt分布から描画します(1可能な限り最小の数値なので選択しました)。


1
それは、ランダムに何かをする非常にRな方法です。
ミシャラヴロフ


@djhurioそれは素晴らしい。
ジュゼッペ

3

05AB1E6 5バイト

アドナン、-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

1
@ETHproductions Jellyが05AB1Eのような大文字用のシングルバイト演算子を持っているなら、我々はそうするでしょう!
ディルナン

Ooo ... random_pickの新しいコマンドeh?ε„luΩ.V私の試みでした!
魔法のタコUr

3
重複
Adnan

1
誰もが5を倒しますか?:P-
完全に人間



3

Java 8、46バイト

このラムダはIntStreamto IntStream(コードポイントのストリーム)です。

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

オンラインで試す

大文字の分布

文字を大文字にするかどうかは、以前はかなり賢明な条件でありMath.random()<.5、約半分の時間で満たされていました。Math.random()>0(バイトを節約する)の現在の条件では、大文字化はほぼ毎回発生し、テストプログラムは無意味になります。ただし、ランダム性の要件は満たします。

謝辞

  • オリビエ・グレゴワールのおかげで-1バイト

ストリームルートに行くと、コードポイントを使用して41バイトを実行できます
オリビエグレゴワール

入力に上記のASCII文字が含まれている場合、それは壊れzます。資格を持ってそれを投げることができました。
ヤコブ


3

ファンキー、55バイト

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

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

オプションのコンマのおかげで、それを行うのは1バイト短いです0s.upper意味し、テーブル定義でmath.randomランダムにどちらか選ぶだろう12やることよりも、math.random(0,1)持ってランダムではありませんで0


3

R60 59 58 57 56 63バイト

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

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

他の2つのRとは異なるアプローチがここここで答えます。ジュゼッペのおかげで改善および修正されました!


サンプリング関数がそのように動作することを知りませんでした!
ジュゼッペ

@Giuseppeただ、私は、これは...ダウンgolfedすることができなかったと思ったとき
JayCe


@Giuseppeこのゴルファーだけでなく、よりエレガントです!大好きです!
JayCe

2番目のビュー時に、これは上に印刷可能なASCII文字を動作しません90ように[、しかし、7バイトのため、この修正を djhurioの答えよりも、まだgolfierある
ジュゼッペ・

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

アリス17 15バイト

2バイトを節約してくれたLeoに感謝します。

/uRUwk
\i*&o.@/

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

説明

/...
\...@/

これは、完全に順序モードで動作する主に線形プログラムの通常のフレームワークです。

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.

私は最初にこれを完全にCardinalモードで試しましたが、文字コードだけに基づいた文字かどうかを判断するには、おそらくより多くのバイトが必要です。


2

Wolfram言語(Mathematica)52 49 44バイト

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

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

の演算子形式を使用します。StringReplaceルール(またはルールのリスト)を指定しますが、入力として指定した任意の文字列にそのルールを適用する関数を提供する文字列はありません。

RandomChoice@{#,Capitalize@#}&/@#&Mathematicaで他の言語にある唯一の種類の文字列であるため、文字のリストを入力として取得する(および出力として生成する)ことを決めた場合、はるかに優れた(34バイト)ことができます。しかし、それは面白くない。


M.スターンのおかげで-5バイト


を使用して1バイトを保存します Capitalize
M.スターンを

Random廃止されることを無視する場合は、独自に実装することでさらに4バイト節約できますRandomChoiceStringReplace[c_/;Random[]<.5:>Capitalize@c]
M.スターン

@ M.Stern Randomある時点で仕事を始めようとしていましたが、それを忘れていた/;ので、If声明に入れようとしました。ありがとう!
ミシャラヴロフ

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、暗黙の入力ゴルフをもう1バイト出力できるようにします。
スティーブンH.17年

2

PHP、 63 53バイト

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

Titusの提案に従って(部分的に)10バイトのコードを削減しました。


1
良いですね!前にスペースは必要ありません$awhile(~$a=$argn[$i++])代わりに試してくださいforeach(パイプとして実行)。
タイタス

そのコードを使用すると、「Uncaught Error:Unsupported operand types」エラーが発生しました。そして、なぜそうなるのかわかりませんが、〜が疑われます。(そしておそらく私はPHP7を使用しているため、メソッドが唯一の5.6のために働く)
RFSnake

2

PowerShell57 56バイト

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

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

ブリアンティストのおかげで-1バイト

入力を文字列として受け取り、$args配列を明示的に文字列にキャストし、char-array としてキャストしてから、文字をループに送ります。反復するたびに、50-50は文字をそのまま出力$_するか、大文字に変換します"$_".ToUpper()(それが("$_"|% *per)ゴミです)。それはRandom整数を取得してmodを取ることで2ます。

これらの文字はパイプラインに残され、その後-join単一の文字列に戻されます。それ自体がパイプラインに残され、出力は暗黙的です。


あなたは変化する1バイトを保存することができます"$_".ToUpper()("$_"|% *per)/ - :
briantist

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)

これを1行で機能させることはできませんでした。理由もわかりませんが、sとsがランダムに選択され2ḶXø³L¤Ð¡たリスト[None,1,0,..,1]を提供します。これが最初のリンクの理由です。01None

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.