Kapitalisasi Acak


37

Tugas

Tugas Anda adalah membuat program atau fungsi yang, jika diberi input, mengeluarkan teks input dengan huruf kapital acak, sambil tetap menggunakan huruf kapital dengan huruf kapital.

Setiap kombinasi kapitalisasi huruf kecil harus dimungkinkan. Sebagai contoh, jika input adalah abc, harus ada probabilitas non-nol keluaran salah satu kombinasi berikut: abc, Abc, aBc, abC, ABc, AbC, aBCatau ABC.

Memasukkan

Input Anda adalah string, yang berisi sejumlah karakter ASCII yang dapat dicetak, misalnya Hello World. Output untuk input yang meliputi HeLLo WoRlD, HElLO WOrld, dll

Mencetak gol

Ini kode-golf, jadi jawaban tersingkat di setiap bahasa menang!

Jawaban:


14

TI-Basic (83 series), 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

Dimasukkan input Ans, seperti yang diilustrasikan dalam tangkapan layar di bawah ini:

masukkan deskripsi gambar di sini

(Jika tangkapan layar terlihat berantakan, seperti yang terkadang terjadi pada saya, coba buka di tab baru ?)

TI-Basic (setidaknya versi TI-83 ... mungkin saya harus beralih ke TI-89 golf) adalah bahasa yang mengerikan untuk mencoba golf tantangan ini, karena:

  1. Ini sama sekali tidak memberikan dukungan untuk aritmatika dengan karakter, mengetahui versi huruf besar dari karakter huruf kecil, atau bahkan mengetahui alfabet.
  2. Setiap karakter huruf kecil membutuhkan 2 byte untuk disimpan. (Bahkan, saya harus menggunakan skrip perakitan hanya untuk dapat mengetik huruf kecil.)

Hasilnya adalah 78 byte dari program ini (lebih dari setengah) hanya menyimpan alfabet, dua kali .

Ngomong-ngomong, idenya adalah kita mengulang-ulang string, dengan kemungkinan mengubah huruf kecil menjadi huruf besar saat kita melangkah, dan menambahkan hasilnya ke akhir string sehingga input dan output disimpan Ans. Ketika kita meninggalkan For(loop, Iadalah satu lebih dari panjang string asli, jadi mengambil I-1karakter mulai Imemberi hasilnya.


Aplikasi "MirageOS" dan "OmniCalc" keduanya memungkinkan Anda mengetik huruf kecil hanya dengan menekan alpha dua kali. Dan mereka juga memiliki fitur bagus lainnya.
Fabian Röling

@Fabian Skrip perakitan, dan aplikasi yang Anda sebutkan, keduanya bekerja pada dasarnya dengan cara yang sama: mereka menetapkan bendera di sistem operasi yang memungkinkan "tekan alpha dua kali untuk huruf kecil".
Misha Lavrov

11

Japt , 6 byte

®m`«`ö

Uji secara online!

Penjelasan

®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

Berkat @ l4m2 untuk menghemat satu byte!

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

Cobalah online!

Akan menjadi 42 byte, jika dapat diasumsikan bahwa {|}~tidak muncul di input:

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

Cobalah online!


Perlu dicatat bahwa, mengingat implementasi tertentu, kapitalisasi adalah deterministik sempurna (standar C memberikan implisit srand(1)pada awal program, sehingga dalam setiap eksekusi urutan nilai yang dikembalikan oleh rand()akan sama).
Matteo Italia

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}untuk beberapa compiler (def. -funsigned-char) kerja
l4m2

@ l4m2 Terima kasih! Namun itu tidak berhasil karena suatu alasan. Berubah 'a'ke 97ukarya dan bahkan tidak memerlukan -funsigned-charbendera.
Steadybox

Tampaknya ketika Anda mengurangi 'a'(yang signed intbukan unsigned char) dari *s(yang unsigned char), *sdipromosikan menjadi signed intbukan unsigned int, maka nilai negatif menjadi mungkin dan perbandingan tidak berfungsi sebagaimana dimaksud.
Steadybox

8

Jelly , 5 byte

Satu lagi bytes debu berkat dylnan.

żŒuX€

Cobalah online!

Penjelasan

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

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

1
Saya perlu ŒṘlebih sering menggunakan untuk melihat bagaimana hal-hal diwakili di bawah tenda
dylnan


7

JavaScript (ES6), 56 byte

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

Jika keseragaman yang seragam tidak diperlukan, kami dapat menghemat 6 byte dengan menggunakan waktu saat ini sebagai sumber keacakan:

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

Ini cenderung huruf besar atau membiarkan semua huruf sekaligus.


"harus ada kemungkinan nol untuk mengeluarkan salah satu dari kombinasi berikut: abc, Abc, aBc, abC, ABC, AbC, aBC atau ABC", sedangkan milik Anda tidak dapat menghasilkan AbCkarena waktu tidak akan berubah begitu cepat
l4m2

@ l4m2 jika Anda memiliki mesin yang sangat lambat, mungkin ;-) Mungkin saya harus menghapus bagian itu ...
ETHproduksi

6

R , 66 byte

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

Cobalah online!

Jawaban R. lainnya .


Saya telah menulis terlalu banyak kode "biasa" dan bahkan tidak berpikir untuk mencoba for-loop! Bagus
Giuseppe

6

Excel VBA, 74 71 64 Bytes

The Randomizepanggilan selalu membuat keluaran acak mahal di VBA :(

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak [A1]dan keluaran ke jendela langsung VBE. Menghasilkan UCaseoutput 50% (rata-rata) d.

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

Halo, Pak. Anda dapat menyimpan 2 byte dengan menghapus Randomize:dan mengganti Rnddengan [RAND()>.5]. Atau abaikan saja. :)
remoel

@remoel, sayangnya, [Rand()]panggilan itu hanya psuedo-acak dan memiliki panjang periode kira-kira 10 ^ 13, membuatnya secara fungsional identik dengan panggilan un Randomized Rnd, pada kenyataannya keduanya menggunakan seed yang sama (yang diatur oleh Randomizecall menggunakan fungsi tersebut keluaran). timer
Taylor Scott

@romoel, namun saya kira itu memberikan klarifikasi pada prompt bahwa saya bisa menghapus Randomizepanggilan dan bukannya menggunakanRnd>.5
Taylor Scott

6

Arang , 8 7 byte

⭆S‽⁺↥ιι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

4

Ruby, 40 Bytes

Fungsi Lambda yang mengambil string. Disimpan 1 byte berkat Arnauld. Disimpan 5 byte berkat Snack.

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

1
Selamat datang di PPCG! Bisakah Anda menyimpan byte dengan <1bukan ==1?
Arnauld


@Displayname kerja bagus. FWIW ketika pengguna meningkatkan skor mereka, banyak yang suka "mencoret" skor lama dengan <s>tag, misalnya " Ruby, <s> 46 </s> 40 byte ." Tentu itu tidak wajib.
Jordan

3

APL + WIN, 37 byte

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

Meminta input layar, mengidentifikasi huruf kecil dan mengubahnya secara acak menjadi huruf besar.


3

R , 89 88 byte

kalah oleh djhurio!

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

Cobalah online!

Program ini mengambil setiap karakter, dan dengan probabilitas 1/2 mengubahnya menjadi huruf besar atau membiarkannya sendiri. Dimungkinkan untuk mengubah probabilitas ini dengan bermain dengan nilai dfdan0 .

rtmenarik dari distribusi-t Student, yang memiliki median 0 dengan tingkat kebebasan apa pun (saya memilih 1karena ini adalah jumlah terkecil yang mungkin).


1
Itu cara yang sangat R untuk melakukan sesuatu secara acak.
Misha Lavrov


@ Djurio itu brilian.
Giuseppe

3

05AB1E , 6 5 byte

Terima kasih Adnan untuk -1 byte

uø€ΩJ

Cobalah online!

Penjelasan

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

Metode diambil dari jawaban @ totallyhuman


1
Adakah yang akan mengalahkan 6? : P
ETHproduksi

1
@ ETHproductions Jika Jelly memiliki operator byte tunggal untuk huruf besar seperti 05AB1E kami akan!
dylnan

Ooo ... Perintah baru untuk random_pick eh? ε„luΩ.Vadalah usaha saya, bagus!
Magic Gurita Guci

3
Anda dapat meninggalkan duplikat :)
Adnan

1
Adakah yang akan mengalahkan 5? : P
totallyhuman


3

Swift 4, 86 byte

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

3
Selamat datang di PPCG!
Martin Ender

3

Java 8, 46 byte

Lambda ini dari IntStreamke IntStream(aliran poin kode).

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

Cobalah secara Online

Distribusi kapitalisasi

Apakah menggunakan huruf kapital dulu merupakan kondisi yang cukup masuk akal Math.random()<.5, yang dipenuhi sekitar separuh waktu. Dengan kondisi saat ini Math.random()>0(yang menghemat satu byte), kapitalisasi terjadi hampir setiap waktu, yang membuat program uji menjadi tidak berguna. Tapi itu memenuhi persyaratan keacakan.

Ucapan Terima Kasih

  • -1 byte terima kasih kepada Olivier Grégoire

Jika Anda pergi rute stream, Anda dapat menggunakan titik kode dan melakukan 41 byte .
Olivier Grégoire

Nah, itu pecah jika inputnya mengandung karakter ASCII di atas z. Aku bisa melemparnya dengan kualifikasi.
Jakob


3

Funky , 55 byte

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

Cobalah online!

Berkat koma opsional, ini satu byte lebih pendek untuk dilakukan 0s.upperdalam definisi tabel, yang berarti math.randomakan secara acak memilih salah satu 1atau 2, daripada melakukan math.random(0,1)secara acak dan tidak memiliki 0.


3

R , 60 59 58 57 56 63 byte

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

Cobalah online!

Pendekatan yang berbeda dari dua R lainnya menjawab di sini dan di sini . Lebih baik dan diperbaiki berkat Giuseppe!


Saya tidak tahu fungsi pengambilan sampel berperilaku seperti itu!
Giuseppe

@Giuseppe Tepat ketika saya pikir ini tidak bisa
digantikan


@ Giuseppe Tidak hanya pegolf ini tetapi juga lebih elegan! Suka!
JayCe

pada pandangan kedua, ini tidak akan berfungsi ketika karakter ascii yang dicetak di atas 90suka [, tetapi ini memperbaikinya untuk +7 byte yang masih lebih golf daripada jawaban djhurio
Giuseppe

2

Ouroboros , 25 byte

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

Coba di sini

Satu-satunya bagian yang mewah adalah aliran kontrol .b*),. Mari kita bicarakan sisanya dulu.

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

Kami kemudian kembali ke awal baris. Kontrol aliran melibatkan perubahan di mana ujung garis itu; jika dipindahkan ke kiri IP, eksekusi berakhir. Demikian:

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

Ketika charcode positif, )adalah no-op, karena ujung baris sejauh mungkin. Tetapi ketika semua karakter telah dibaca, iberikan -1. Kemudian kita memindahkan ujung -11karakter kode ke kanan - yaitu, 11 karakter ke kiri. Dibutuhkan beberapa iterasi, tetapi akhirnya IP melewati akhir kode dan program berhenti.



2

Brachylog , 5 byte

ụᶻṛᵐc

Cobalah online!

Penjelasan

Example input: "Test"

ụᶻ        Zip uppercase:      [["T","T"],["e","E"],["s","S"],["t","T"]]
  ṛᵐ      Map random element: ["T","e","S","T"]
    c     Concatenate:        "TeST"

2

Alice , 17 15 byte

Terima kasih kepada Leo karena telah menghemat 2 byte.

/uRUwk
\i*&o.@/

Cobalah online!

Penjelasan

/...
\...@/

Ini adalah kerangka kerja biasa untuk sebagian besar program linier yang beroperasi sepenuhnya dalam mode 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.

Saya pertama kali mencoba melakukan ini sepenuhnya dalam mode Kardinal, tetapi menentukan apakah sesuatu surat hanya berdasarkan kode karakter mungkin akan mengambil lebih banyak byte.


2

Bahasa Wolfram (Mathematica) , 52 49 44 byte

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

Cobalah online!

Menggunakan bentuk operator dari StringReplace : memberikan aturan (atau daftar aturan) tetapi tidak ada string yang memberikan fungsi yang menerapkan aturan itu ke string apa pun yang Anda berikan sebagai input.

Kita dapat melakukan jauh lebih baik ( RandomChoice@{#,Capitalize@#}&/@#&34 byte) jika kita memutuskan untuk mengambil sebagai input (dan menghasilkan sebagai output) daftar karakter, yang kadang-kadang orang berpendapat tidak apa-apa di Mathematica karena itu satu-satunya jenis string yang ada dalam bahasa lain. Tapi itu tidak menyenangkan.


-5 byte terima kasih kepada M. Stern


Simpan satu byte dengan menggunakanCapitalize
M. Stern

Jika Anda akan mengabaikan bahwa Randomsudah ditinggalkan Anda bisa menghemat empat byte dengan menerapkan Anda sendiri RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
M. Stern

@ M.Stern Saya mencoba untuk mulai Randombekerja pada satu titik, tetapi saya lupa tentang hal itu /;sehingga saya mencoba untuk membuat Ifpernyataan. Terima kasih!
Misha Lavrov

2

Pyth, 10 7 6 byte

smO,r1

Disimpan 3 byte berkat ovs dan 1 berkat Steven H.

Cobalah online

Penjelasan

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, memungkinkan Anda untuk memasukkan-input golf byte lain keluar.
Steven H.

2

PHP, 63 53 byte

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

Berhasil mengurangi kode dengan 10 byte oleh (sebagian) mengikuti saran Titus.


1
Yang bagus! Tidak perlu ruang sebelumnya $a. Coba while(~$a=$argn[$i++])alih-alih foreach(jalankan sebagai pipa).
Titus

Dengan menggunakan kode itu, saya mendapatkan kesalahan "Kesalahan Tidak Dicatat: jenis operan yang tidak didukung". Dan saya tidak bisa melihat mengapa ia melakukannya, tetapi saya curiga ~. (dan mungkin karena saya menggunakan PHP7 dan metode ini hanya berfungsi untuk 5.6)
RFSnake

2

PowerShell , 57 56 byte

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

Cobalah online!

-1 byte terima kasih kepada briantist

Mengambil input sebagai string, secara eksplisit melemparkan $argsarray ke string, melemparkannya sebagai char-array, lalu mengumpankan karakter melalui loop. Setiap iterasi, kami 50-50 menampilkan karakter apa adanya $_atau mengubahnya menjadi huruf besar "$_".ToUpper()(itu ("$_"|% *per)sampah). Itu dipilih dengan mendapatkan Randombilangan bulat dan membawanya mod 2.

Karakter-karakter tersebut dibiarkan di atas pipa dan kemudian -joindisatukan kembali menjadi satu string, yang dengan sendirinya ditinggalkan di dalam pipa dan hasilnya tersirat.


Anda dapat menyimpan satu byte perubahan "$_".ToUpper()ke ("$_"|% *per): - /
briantist

1
@ Briantist Untung kita tidak peduli tentang keterbacaan. ;-) Terima kasih!
AdmBorkBork

2

Julia , 35 byte

s->map(c->rand([c,uppercase(c)]),s)

Cobalah online!

Masih cukup mudah dibaca sebagai manusia. Dalam Julia rand (A) mengembalikan elemen acak dari A.


Selamat datang di PPCG!
Steadybox

1

Rebol , 61 byte

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

Uji:

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

1

Jelly , 16 byte

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

Cobalah online!

Penjelasan

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)

Saya tidak bisa membuat ini bekerja dalam satu baris. Saya juga tidak tahu mengapa, tetapi 2ḶXø³L¤Ð¡memberikan daftar [None,1,0,..,1]dengan 0s dan 1s yang dipilih secara acak. Inilah Nonealasan untuk tautan pertama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.