Viết hoa ngẫu nhiên


37

Nhiệm vụ

Nhiệm vụ của bạn là tạo ra một chương trình hoặc một chức năng, được đưa ra một đầu vào, xuất văn bản đầu vào với các chữ cái ngẫu nhiên được viết hoa, trong khi vẫn giữ các chữ cái viết hoa viết hoa.

Mọi sự kết hợp viết hoa của các chữ cái viết thường nên có thể. Ví dụ, nếu đầu vào là abc, cần có một xác suất khác không xuất ra bất kỳ kết hợp sau: abc, Abc, aBc, abC, ABc, AbC, aBChoặc ABC.

Đầu vào

Ví dụ, đầu vào của bạn là một chuỗi, chứa bất kỳ số lượng ký tự ASCII có thể in nào Hello World. Đầu ra cho đầu vào bao gồm HeLLo WoRlD, HElLO WOrldvv

Chấm điểm

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!

Câu trả lời:


14

TI-Basic (sê-ri 83), 137 byte

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

Đưa đầu vào vào Ans, như được minh họa trong ảnh chụp màn hình bên dưới:

nhập mô tả hình ảnh ở đây

(Nếu ảnh chụp màn hình trông có vẻ bị xáo trộn, như đôi khi đối với tôi, hãy thử mở nó trong một tab mới ?)

TI-Basic (ít nhất là phiên bản TI-83 ... có lẽ tôi nên mở rộng ra chơi golf TI-89) là một ngôn ngữ khủng khiếp để thử đánh golf thử thách này, kể từ:

  1. Nó hoàn toàn không hỗ trợ cho bất kỳ số học nào với các ký tự, biết phiên bản chữ hoa của ký tự chữ thường hoặc thậm chí biết bảng chữ cái.
  2. Mỗi ký tự chữ thường mất 2 byte để lưu trữ. (Trên thực tế, tôi đã phải sử dụng tập lệnh lắp ráp chỉ để có thể nhập các chữ cái viết thường.)

Kết quả là 78 ​​byte của chương trình này (hơn một nửa) chỉ lưu trữ bảng chữ cái, hai lần .

Dù sao, ý tưởng là chúng ta lặp qua chuỗi, với cơ hội biến các ký tự chữ thường thành chữ hoa khi chúng ta đi và thêm kết quả vào cuối chuỗi để cả đầu vào và đầu ra được lưu trữ Ans. Khi chúng ta rời khỏi For(vòng lặp, Isẽ dài hơn một lần so với độ dài của chuỗi gốc, do đó, việc lấy các I-1ký tự bắt đầu từ đầu Ira.


Các ứng dụng "MirageOS" và "OmniCalc" đều cho phép bạn nhập các chữ cái thường chỉ bằng cách nhấn alpha hai lần. Và họ cũng có các tính năng tốt đẹp khác.
Fabian Röling

@Fabian Kịch bản lắp ráp và các ứng dụng bạn đã đề cập, cả hai đều hoạt động theo cùng một cách: chúng đặt cờ trong hệ điều hành cho phép "nhấn alpha hai lần cho chữ thường".
Misha Lavrov

11

Japt , 6 byte

®m`«`ö

Kiểm tra nó trực tuyến!

Giải trình

®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 byte

Cảm ơn @ l4m2 vì đã tiết kiệm một byte!

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

Hãy thử trực tuyến!

Sẽ là 42 byte, nếu có thể giả sử là {|}~không xuất hiện trong đầu vào:

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

Hãy thử trực tuyến!


Đáng lưu ý rằng, với một triển khai cụ thể, viết hoa là hoàn toàn xác định (tiêu chuẩn C cung cấp ẩn srand(1)khi bắt đầu chương trình, do đó, trong mỗi lần thực hiện, chuỗi các giá trị được trả về rand()sẽ giống nhau).
Matteo Italia

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}đối với một số trình biên dịch (def. -funsigned-char) hoạt động
l4m2

@ l4m2 Cảm ơn! Điều đó không làm việc mặc dù vì một số lý do. Thay đổi 'a'thành 97ucông trình và thậm chí không yêu cầu -funsigned-charcờ.
Steadybox

Có vẻ như khi bạn trừ 'a'(mà signed intkhông phải unsigned char) từ *s(đó là unsigned char), *ssẽ được thăng cấp signed intthay vì unsigned int, do đó các giá trị âm là có thể và so sánh không hoạt động như dự định.
Steadybox

8

Thạch , 5 byte

Một byte khác bụi nhờ dylnan.

żŒuX€

Hãy thử trực tuyến!

Giải trình

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

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

1
Tôi cần sử dụng ŒṘthường xuyên hơn để xem mọi thứ được thể hiện như thế nào dưới mui xe
dylnan


7

JavaScript (ES6), 56 byte

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

Nếu không yêu cầu tính ngẫu nhiên đồng nhất, chúng ta có thể lưu 6 byte bằng cách sử dụng thời gian hiện tại làm nguồn ngẫu nhiên:

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

Điều này có xu hướng hoặc viết hoa hoặc để lại tất cả các chữ cái cùng một lúc.


"nên có xác suất khác không khi xuất ra bất kỳ kết hợp nào sau đây: abc, Abc, aBc, abC, ABc, AbC, aBC hoặc ABC", trong khi thời gian của bạn AbCkhông thể thay đổi vì thời gian sẽ không thay đổi quá nhanh
l4m2

@ l4m2 nếu bạn có một máy thực sự chậm, nó có thể ;-) Có lẽ tôi chỉ nên xóa phần đó mặc dù ...
ETHproductions

6

R , 66 byte

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

Hãy thử trực tuyến!

Một câu trả lời R khác .


Tôi đã viết quá nhiều mã R "thông thường" và thậm chí không nghĩ sẽ thử một for-loop! Đẹp một.
Giuseppe

6

VBA Excel, 74 71 64 byte

Cuộc Randomizegọi luôn khiến đầu ra ngẫu nhiên tốn kém trong VBA :(

Chức năng cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra cho cửa sổ ngay lập tức VBE. Tạo ra một sản lượng 50% (trung bình) UCased.

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

Xin chào ngài. bạn có thể lưu 2 byte bằng cách loại bỏ Randomize:và thay đổi Rndbằng [RAND()>.5]. Hoặc bỏ qua nó. :)
làm lại

@remoel, thật không may, [Rand()]cuộc gọi chỉ là psuedo-Random và có độ dài khoảng 10 ^ 13, khiến nó có chức năng giống hệt với cuộc gọi un Randomized Rnd, trên thực tế cả hai sử dụng cùng một hạt giống (mà Randomizecuộc gọi đặt bằng cách sử dụng timerchức năng đầu ra).
Taylor Scott

@romoel, tuy nhiên, tôi cho rằng đã đưa ra lời giải thích rõ ràng về lời nhắc rằng tôi có thể xóa Randomizecuộc gọi và thay vào đó sử dụngRnd>.5
Taylor Scott

6

Than , 8 7 byte

⭆S‽⁺↥ιι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

4

Ruby, 40 byte

Hàm Lambda có một chuỗi. Đã lưu 1 byte nhờ Arnauld. Đã lưu 5 byte nhờ Snack.

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

1
Chào mừng đến với PPCG! Bạn có thể lưu một byte với <1thay vì ==1?
Arnauld


Làm tốt lắm @displayname. FWIW khi người dùng cải thiện điểm số của mình, nhiều người muốn "gạch bỏ" điểm số cũ bằng <s>thẻ, ví dụ: " Ruby, <s> 46 </ s> 40 byte ". Tất nhiên là không bắt buộc.
Jordan

3

APL + THẮNG, 37 byte

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

Nhắc nhở nhập màn hình, xác định chữ cái viết thường và chuyển đổi ngẫu nhiên chúng thành chữ hoa.


3

R , 89 88 byte

vượt trội bởi djhurio!

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

Hãy thử trực tuyến!

Chương trình này nhận mỗi ký tự và với xác suất 1/2 chuyển đổi nó thành chữ hoa hoặc để nó một mình. Có thể điều chỉnh xác suất này bằng cách chơi với các giá trị khác nhau df0.

rtrút ra từ phân phối t của Học sinh, có trung vị 0 với bất kỳ mức độ tự do nào (tôi đã chọn 1vì đó là số nhỏ nhất có thể).


1
Đó là một cách rất R để làm một cái gì đó ngẫu nhiên.
Misha Lavrov


@djhurio thật tuyệt vời.
Giuseppe

3

05AB1E , 6 5 byte

Cảm ơn bạn Adnan cho -1 byte

uø€ΩJ

Hãy thử trực tuyến!

Giải trình

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

Phương pháp lấy từ câu trả lời của @ perfecthuman


1
Bất cứ ai cũng sẽ đánh bại 6? : P
Sản phẩm ETH

1
@ETHproductions Nếu Jelly có một toán tử byte đơn cho chữ hoa như 05AB1E thì chúng tôi sẽ làm!
dylnan

Ooo ... Lệnh mới cho Random_pick eh? ε„luΩ.Vlà nỗ lực của tôi, một trong những tốt đẹp!
Bạch tuộc ma thuật Urn

3
Bạn có thể để lại bản sao :)
Adnan

1
Có ai đánh bại 5 không? : P
hoàn toàn là


3

Swift 4, 86 byte

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

3
Chào mừng đến với PPCG!
Martin Ender

3

Java 8, 46 byte

Lambda này là từ IntStreamđến IntStream(dòng điểm mã).

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

Dùng thử trực tuyến

Phân phối vốn hóa

Có nên viết hoa một chữ cái từng là điều kiện khá hợp lý Math.random()<.5mà đã được thỏa mãn khoảng một nửa thời gian. Với điều kiện hiện tại là Math.random()>0(tiết kiệm một byte), việc viết hoa hầu như xảy ra mọi lúc, điều này làm cho một chương trình thử nghiệm trở nên vô nghĩa. Nhưng nó đáp ứng yêu cầu ngẫu nhiên.

Lời cảm ơn

  • -1 byte nhờ Olivier Grégoire

Nếu bạn đi theo luồng, bạn có thể sử dụng các điểm mã và thực hiện 41 byte .
Olivier Grégoire

Chà, nó sẽ phá vỡ nếu đầu vào chứa các ký tự ASCII ở trên z. Tôi có thể ném nó với một trình độ mặc dù.
Jakob


3

Funky , 55 byte

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

Hãy thử trực tuyến!

Nhờ các dấu phẩy tùy chọn, nó ngắn hơn một byte 0s.uppertrong định nghĩa bảng, có nghĩa là math.randomsẽ chọn ngẫu nhiên 1hoặc 2, hơn là làm math.random(0,1)ngẫu nhiên và không có 0.


3

R , 60 59 58 57 56 63 byte

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

Hãy thử trực tuyến!

Cách tiếp cận khác nhau từ hai câu trả lời R khác ở đâyđây . Cải thiện và sửa chữa nhờ Giuseppe!


Tôi không biết các chức năng lấy mẫu hành xử như vậy!
Giuseppe

@Giuseppe Chỉ khi tôi nghĩ điều này không thể đánh gôn ...
JayCe


@Giuseppe Không chỉ golf này mà còn thanh lịch hơn! Yêu nó!
JayCe

theo quan điểm thứ hai, điều này sẽ không hoạt động khi các ký tự ascii có thể in ở trên 90thích [, nhưng điều này sửa nó thành 7 byte vẫn còn hơn cả câu trả lời của djhurio
Giuseppe

2

Ouroboros , 25 byte

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

Hãy thử nó ở đây

Phần ưa thích duy nhất là dòng điều khiển .b*),. Trước tiên hãy nói về phần còn lại.

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

Chúng tôi sau đó lặp trở lại đầu dòng. Dòng điều khiển liên quan đến việc thay đổi nơi kết thúc của dòng; nếu nó được di chuyển sang bên trái của IP, việc thực thi chấm dứt. Như vậy:

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

Khi charcode là dương, )là không có op, vì cuối dòng là càng xa càng tốt. Nhưng khi tất cả các nhân vật đã được đọc, icho -1. Sau đó, chúng tôi di chuyển phần cuối của các -11ký tự mã sang phải - nghĩa là 11 ký tự sang trái. Phải mất một vài lần lặp, nhưng cuối cùng IP đã qua phần cuối của mã và chương trình tạm dừng.




2

Alice , 17 15 byte

Cảm ơn Leo vì đã tiết kiệm được 2 byte.

/uRUwk
\i*&o.@/

Hãy thử trực tuyến!

Giải trình

/...
\...@/

Đây là khung thông thường cho các chương trình phần lớn tuyến tính hoạt động hoàn toàn ở chế độ 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.

Lần đầu tiên tôi đã thử làm điều này hoàn toàn trong chế độ Cardinal, nhưng xác định xem một cái gì đó là một chữ cái chỉ dựa trên mã ký tự có thể sẽ mất nhiều byte hơn.


2

Ngôn ngữ Wolfram (Mathicala) , 52 49 44 byte

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

Hãy thử trực tuyến!

Sử dụng dạng toán tử của StringReplace: cung cấp cho nó một quy tắc (hoặc một danh sách các quy tắc) nhưng không có chuỗi nào cung cấp một hàm áp dụng quy tắc đó cho bất kỳ chuỗi nào bạn cung cấp cho nó làm đầu vào.

Chúng tôi có thể làm tốt hơn rất nhiều ( RandomChoice@{#,Capitalize@#}&/@#&là 34 byte) nếu chúng tôi quyết định lấy đầu vào (và sản xuất làm đầu ra) một danh sách các ký tự, mà mọi người đôi khi tranh luận là ổn trong Mathicala vì đó là loại chuỗi duy nhất có trong các ngôn ngữ khác. Nhưng đó không phải là niềm vui.


-5 byte nhờ M. Stern


Lưu một byte bằng cách sử dụngCapitalize
M. Stern

Nếu bạn bỏ qua điều đó Randomkhông được chấp nhận, bạn có thể tiết kiệm bốn byte khác bằng cách tự thực hiện RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
M. Stern

@ M.Stern Tôi đã cố gắng để Randomlàm việc tại một thời điểm, nhưng tôi quên mất /;vì vậy tôi đã cố gắng đưa vào một Iftuyên bố. Cảm ơn!
Misha Lavrov

2

Bình thường, 10 7 6 byte

smO,r1

Đã lưu 3 byte nhờ vào ovs và 1 nhờ Steven H.

Dùng thử trực tuyến

Giải trình

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, cho phép bạn nhập vào một byte khác.
Steven H.

2

PHP 63 53 byte

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

Được quản lý để giảm mã với 10 byte bằng (một phần) theo đề xuất của Titus.


1
Đẹp quá Không cần một không gian trước $a. Hãy thử while(~$a=$argn[$i++])thay vì foreach(chạy như đường ống).
Tít

Sử dụng mã đó tôi đã gặp lỗi "Uncaught Error: Các loại toán hạng không được hỗ trợ". Và tôi không thể thấy lý do tại sao nó làm điều đó, nhưng tôi nghi ngờ ~. (và có thể vì tôi sử dụng PHP7 và phương thức này chỉ hoạt động trong 5.6)
RFSnake

2

PowerShell , 57 56 byte

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

Hãy thử trực tuyến!

-1 byte nhờ briantist

Đưa đầu vào dưới dạng một chuỗi, chuyển rõ ràng $argsmảng thành một chuỗi, biến nó thành một chuỗi char-array, sau đó đưa các ký tự qua một vòng lặp. Mỗi lần lặp lại, chúng ta 50-50 xuất ký tự nguyên trạng $_hoặc chuyển đổi nó thành chữ hoa "$_".ToUpper()(đó là ("$_"|% *per)rác). Điều đó được chọn bằng cách lấy một Randomsố nguyên và lấy nó mod 2.

Các ký tự đó được để lại trên đường ống và sau đó -joined lại với nhau thành một chuỗi, chính nó được để lại trên đường ống và đầu ra là ẩn.


Bạn có thể lưu một byte thay đổi "$_".ToUpper()thành ("$_"|% *per): - /
briantist

1
@briantist Điều tốt là chúng tôi không quan tâm đến khả năng đọc. ;-) Cảm ơn!
admBorkBork


1

Rebol , 61 byte

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

Kiểm tra:

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

1

Thạch , 16 byte

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

Hãy thử trực tuyến!

Giải trình

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)

Tôi không thể làm điều này để làm việc trong một dòng duy nhất. Tôi cũng không biết tại sao, nhưng 2ḶXø³L¤Ð¡đưa ra danh sách [None,1,0,..,1]với 0s và 1s được chọn ngẫu nhiên. Đây Nonelà lý do cho các liên kết đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.