무작위 대문자


37

작업

당신의 임무는 입력시 주어진 대문자를 무작위 문자로 출력하고 이미 대문자 문자를 대문자로 유지하는 프로그램이나 함수를 만드는 것입니다.

소문자의 모든 대문자 조합이 가능해야합니다. 입력이었던 경우, 예를 들어 abc, 다음의 조합 중 하나를 출력하는 영이 아닌 확률이 있어야한다 : abc, Abc, aBc, abC, ABc, AbC, aBC또는 ABC.

입력

입력 내용은 인쇄 가능한 ASCII 문자를 포함하는 문자열입니다 (예 :) Hello World. 그 입력에 대한 출력을 포함하는 HeLLo WoRlD, HElLO WOrld

채점

이것은 코드 골프이므로 각 언어에서 가장 짧은 답변이 이깁니다!

답변:


14

TI 기본 (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"앱을 사용하면 알파를 두 번 눌러 소문자를 입력 할 수 있습니다. 그리고 다른 멋진 기능도 있습니다.
Fabian Röling

@Fabian 어셈블리 스크립트와 언급 한 앱은 모두 본질적으로 동일한 방식으로 작동합니다. 운영 체제에서 "소문자를 위해 알파를 두 번 누르십시오"를 설정하는 플래그를 설정합니다.
Misha Lavrov

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;);}일부 컴파일러 (def. -funsigned-char) 작업
l4m2

@ l4m2 감사합니다! 어떤 이유로 든 작동하지 않습니다. 작동 'a'하도록 변경 97u하고 -funsigned-char플래그가 필요하지 않습니다 .
Steadybox

당신이 뺄 때 보인다 'a'(인 signed int,하지 unsigned char에서) *s(인 unsigned char) *s으로 승격됩니다 signed int대신에 unsigned int따라서 음의 값을 사용할 수있는 의도 한대로 비교가 작동하지 않습니다.
Steadybox

8

젤리 , 5 바이트

다른 하나는 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

자바 스크립트 (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


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

안녕하세요 선생님. 을 제거 Randomize:하고 변경 Rnd하여 2 바이트를 절약 할 수 있습니다 [RAND()>.5]. 아니면 그냥 무시하십시오. :)
remoel '12

@remoel, 불행하게도, [Rand()]통화가 아니라 사이비 - 랜덤 및 유엔하기가 기능적으로 동일하게 ^ 13 약 10의 기간 길이가 RandomizeD의 Rnd두 사용을 사실상 동일 시드 (호출되는 Randomize설정 은 USING 의해 timer기능 산출).
Taylor Scott

@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

루비, 40 바이트

문자열을 취하는 Lambda 함수 Arnauld 덕분에 1 바이트를 절약했습니다. 스낵 덕분에 5 바이트를 절약했습니다.

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

1
PPCG에 오신 것을 환영합니다! <1대신에 바이트를 저장할 수 ==1있습니까?
Arnauld


@displayname 잘하셨습니다. 사용자가 점수를 향상시킬 때 FWIW는 많은 사람들이 <s>태그를 사용 하여 이전 점수를 "교차"하는 것을 좋아합니다 ( 예 : " Ruby, <s> 46 </ s> 40 bytes) . 물론 필요하지 않습니다.
Jordan

3

APL + WIN, 37 바이트

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

화면 입력을위한 프롬프트가 소문자를 식별하고 임의로 대문자로 변환합니다.


3

R , 89 88 바이트

djhurio에 의해 outgolfed!

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

온라인으로 사용해보십시오!

이 프로그램은 각 문자를 취하며, 1/2 확률로 대문자로 변환하거나 그대로 둡니다. df및의 다른 값으로 재생하여이 확률을 조정할 수 0있습니다.

rt자유도가 0 인 중앙값이 0 인 스튜던트 t- 분포에서 도출합니다 ( 1가능한 가장 작은 수이므로 선택 했습니다).


1
그것은 무작위로 무언가를하는 매우 R 방법입니다.
Misha Lavrov


@djhurio 훌륭합니다.
주세페

3

05AB1E , 6 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와 같은 대문자를위한 단일 바이트 연산자가 있다면 우리는 할 것입니다!
dylnan

우 ... random_pick eh의 새로운 명령? ε„luΩ.V내 시도, 좋은 하나였다!
매직 문어 Urn

3
당신은 중복 아웃 : 남길 수 있습니다
아드 난

1
누구든지 5를 이길 것인가? : P
완전히 인간적인

3

루비, 39 바이트

->s{s.gsub(/./){[$&,$&.upcase].sample}}

표시 이름 의 답변 에서 크게 영감을 받았습니다 . (I 평판의 부족이 1 바이트가없는 버전을 제안 언급하지 수, 유감 표시 이름 )


3
PPCG에 오신 것을 환영합니다!
Martin Ender

나는 인사말을 기대하지 않았다, 얼마나 멋지다! 고맙습니다!
Jérémie Bonal

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

자바 8, 46 바이트

이 람다는 IntStream~ IntStream(스트림의 코드 포인트)입니다.

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

온라인으로 사용해보십시오

대문자 분포

문자를 대문자로 표기할지 여부 Math.random()<.5는 이전의 절반 정도만 만족스러운 상당히 합리적인 조건 이었습니다. 현재 상태 Math.random()>0(바이트를 절약)는 거의 항상 대문자를 사용하므로 테스트 프로그램을 무의미하게 만듭니다. 그러나 임의성 요구 사항을 충족시킵니다.

감사의 말

  • Olivier Grégoire 덕분에 -1 바이트

스트림 경로로 이동하면 코드 포인트를 사용하고 41 바이트를 수행 할 수 있습니다 .
Olivier Grégoire

입력에 위의 ASCII 문자가 포함되어 있으면 중단됩니다 z. 그래도 자격으로 그것을 넣을 수 있습니다.
Jakob


3

펑키 , 55 바이트

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

온라인으로 사용해보십시오!

옵션 쉼표 덕분에, 짧은 그것의 1 바이트 수행하는 0s.upper(가) 의미 테이블 정의에 math.random무작위로 하나 선택할 것 1또는 2수행하는 것보다, math.random(0,1)임의의과가 없습니다 0.


3

R , 60 59 58 57 56 63 바이트

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

온라인으로 사용해보십시오!

다른 두 R 답변 과 다른 접근 방식은 여기여기에 있습니다 . 주세페 덕분에 개선되고 수정되었습니다!


샘플링 기능이 그렇게 동작하는지 몰랐습니다!
주세페

@Giuseppe 방금 골프를 타지 못했다고 생각했을 때 ...
JayCe


@Giuseppe이 골퍼 일뿐만 아니라 더욱 우아합니다! 그것을 사랑하십시오!
JayCe

두 번째로 보았을 때 , 위와 90같은 인쇄 가능한 ASCII 문자 일 때는 작동하지 [않지만 djhurio의 대답보다 여전히 골치 거리 인 +7 바이트로 수정합니다.
Giuseppe

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

문자 코드가 양수이면 )줄 끝이 가능한 한 옳기 때문에 no-op입니다. 그러나 모든 문자를 읽으면을 i제공합니다 -1. 그런 다음 코드 -11문자 의 끝을 오른쪽으로, 즉 11 문자를 왼쪽으로 이동합니다. 몇 번의 반복이 필요하지만 결국 IP가 코드 끝을지나 프로그램이 중지됩니다.




2

Alice , 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.

먼저 카디널 모드 에서이 작업을 완전히 시도했지만 문자 코드를 기반으로 한 문자인지 확인하는 데 더 많은 바이트가 필요합니다.


2

Wolfram Language (Mathematica) , 52 49 44 바이트

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

온라인으로 사용해보십시오!

연산자 형식 StringReplace: 규칙 (또는 규칙 목록)을 제공하지만 문자열이 없으면 입력으로 제공 한 문자열에 해당 규칙을 적용하는 기능을 제공합니다.

우리가 RandomChoice@{#,Capitalize@#}&/@#&문자 목록을 입력으로 (및 출력으로 생성) 결정하기로 결정하면 훨씬 더 잘 할 수 있습니다 (출력으로 생성). 사람들은 종종 Mathematica에서 다른 언어에있는 유일한 종류의 문자열이기 때문에 Mathematica에서 괜찮다고 주장합니다. 그러나 그것은 재미 없다.


M. Stern 덕분에 -5 바이트


사용하여 하나의 바이트를 저장Capitalize
M. 스턴을

당신이를 무시한다면 Random사용되지 않습니다 당신은 당신의 자신의를 구현하여 또 다른 4 바이트를 절약 할 수있다 RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
M. 스턴에게

@ 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, 다른 바이트 아웃 골프를 암시 적으로 입력 할 수 있습니다.
Steven 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

해당 코드를 사용하여 "Uncaught Error : Unsupported operand types"오류가 발생했습니다. 그리고 왜 그런지 알 수 없지만 ~를 의심합니다. (아마도 PHP7을 사용하고 메소드가 5.6에서만 작동하기 때문에)
RFSnake

2

PowerShell , 57 56 바이트

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

온라인으로 사용해보십시오!

briantist 덕분에 -1 바이트

입력을 문자열로 받아서 명시 적으로 $args배열을 문자열로 캐스트하고 char-array 로 캐스트 한 다음 루프를 통해 문자를 공급합니다. 각 반복마다 50-50은 문자를 그대로 출력 $_하거나 대문자로 변환합니다 "$_".ToUpper()( ("$_"|% *per)가비지입니다). Random정수를 가져 와서 mod를 선택하여 선택합니다 2.

이러한 문자는 파이프 라인에 남은 다음 -join단일 문자열로 다시 연결되어 자체적으로 파이프 라인에 남고 출력은 암시 적입니다.


다음과 같이 변경 "$_".ToUpper()하여 단일 바이트를 저장할 수 있습니다 ("$_"|% *per):-/
briantist

1
@briantist 가독성에 신경 쓰지 않는 것이 좋습니다. ;-) 감사!
AdmBorkBork


1

Rebol , 61 바이트

u:func[t][n: random length? t t/(n): uppercase t/(n) print t]

테스트:

>>c: "Test sTring"
>>u c
Test sTriNg

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)

한 줄로 작동시키지 못했습니다. 나는 또한 이유를 모르지만 s와 s가 무작위로 선택된 2ḶXø³L¤Ð¡목록 [None,1,0,..,1]을 제공합니다 . 는 에 대한 이유 첫 번째 링크입니다.01None

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.