Rasgele büyük harf


37

Görev

Göreviniz, bir giriş verildiğinde, giriş metnini, büyük harfleri büyük harflerle tutarken, rastgele harflerle büyük harflerle yazdıran bir program veya işlev oluşturmaktır.

Küçük harflerin her büyük harfle yazılması mümkün olmalıdır. Giriş olarak, örneğin, abcaşağıdaki kombinasyonların herhangi çıkış olmayan bir sıfır olasılığı olmalıdır: abc, Abc, aBc, abC, ABc, AbC, aBCya da ABC.

Giriş

Girişiniz, örneğin herhangi bir sayıda yazdırılabilir ASCII karakteri içeren bir dizedir Hello World. Bu giriş için çıkışlar bulunmaktadır HeLLo WoRlD, HElLO WOrldvs.

puanlama

Bu kod golf, yani her dilde en kısa cevap kazanır!

Yanıtlar:


14

TI-Basic (83 serisi), 137 bayt

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

AnsAşağıdaki ekran görüntüsünde gösterildiği gibi girdi alır :

görüntü tanımını buraya girin

(Ekran görüntüsü karıştırılmış gibi görünüyorsa, bazen benim için olduğu gibi, yeni bir sekmede açmayı deneyin ?)

TI-Basic (en azından TI-83 versiyonu ... belki de TI-89 golf oynamaya dalmalıyım), bu zorluğun üstesinden gelmek için korkunç bir dil, çünkü:

  1. Karakterli, küçük harfli karakterin büyük harfli versiyonunu ve hatta alfabeyi bile bilen herhangi bir aritmetik için kesinlikle destek sağlamaz.
  2. Her küçük harfli karakterin saklanması 2 bayt alır. (Aslında, sadece küçük harfleri yazabilmek için bir montaj betiği kullanmak zorunda kaldım .)

Sonuç olarak, bu programın 78 baytı (yarısından fazlası) iki kez alfabeyi saklıyor .

Her neyse, fikir, ilerledikçe küçük harf karakterlerini büyük harflere çevirme şansı vererek ve sonucu hem girişin hem de çıkışın saklanacağı dizgenin sonuna ekleyebilmemizdir Ans. Biz ayrılırken For(döngü, Iböylece alarak orijinal dize uzunluğu birden fazla I-1başlayarak karakterleri Içıkış verir.


Hem "MirageOS" hem de "OmniCalc" uygulamaları, yalnızca alfa tuşuna iki kez basarak küçük harfleri yazmanıza olanak tanır. Ayrıca diğer güzel özelliklere de sahipler.
Fabian Röling

@Fabian Montaj betiği ve bahsettiğiniz uygulamalar, ikisi de esasen aynı şekilde çalışır: işletim sisteminde "küçük harf için iki kez alfa basma" sağlayan bir bayrak koyarlar.
Misha Lavrov

11

Japt , 6 bayt

®m`«`ö

Çevrimiçi test edin!

açıklama

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

Bir bayt tasarrufu için @ l4m2 teşekkürler!

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

Çevrimiçi deneyin!

Girdide {|}~görünmediği varsayılabilirse, 42 bayt olur :

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

Çevrimiçi deneyin!


Belirli bir uygulama yapıldığında, büyük harf kullanımı tamamen belirleyicidir (C standardı srand(1)programın başlangıcında bir örtülü sağlar , bu nedenle her uygulamada, döndürülen değerlerin sırası rand()aynı olacaktır).
Matteo Italia

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}bazı derleyici (def. -funsigned-char) çalışmaları için
l4m2

@ l4m2 Teşekkürler! Bazı nedenlerden dolayı olsa işe yaramaz. Değişen 'a'için 97uişler ve hatta gerektirmez -funsigned-charbayrağı.
Steadybox

Öyle görünüyor ki 'a'(ki signed intdeğil unsigned char) olandan *s(ki unsigned char), bunun yerine *sterfi eder , dolayısıyla negatif değerlerin mümkün olması ve karşılaştırmanın amaçlandığı gibi çalışmadığı görülür. signed intunsigned int
Steadybox

8

Jöle , 5 bayt

Bir diğeri dylnan sayesinde tozu byte eder.

żŒuX€

Çevrimiçi deneyin!

açıklama

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

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

1
ŒṘ
Olayların


7

JavaScript (ES6), 56 bayt

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

Eğer düzgün rastlantısallık gerekli değilse, mevcut zamanı rastgele kaynak olarak kullanarak 6 bayt tasarruf edebiliriz:

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

Bu, bir kerede tüm harfleri büyük veya yalnız bırakma eğilimindedir.


"Aşağıdaki kombinasyonlardan herhangi çıkışı olmayan bir sıfır olasılık olmalıdır: abc, ABC, abc ABC, abc ABC, abc veya ABC" sizinki çıktı atamazken, AbCzaman çok hızlı değiştirmeyecek çünkü
l4m2

@ l4m2 eğer gerçekten yavaş bir makineniz varsa, olabilir ;-) Belki de sadece bu kısmı
çıkarmalıyım

6

R , 66 bayt

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

Çevrimiçi deneyin!

Başka bir R cevap.


Çok fazla "normal" R kodu yazıyordum ve bir fordöngü denemeyi bile düşünmedim ! Güzel bir.
Giuseppe

6

Excel VBA, 74 71 64 Bayt

Bu Randomizeçağrı her zaman VBA’da pahalı bir rastgele çıktı yapar :(

Menzilden girdi alan [A1]ve VBE acil durum penceresine çıkan anonim VBE acil durum pencere işlevi . % 50 (ortalama) UCased çıktı üretir.

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

Merhaba efendim. ile kaldırarak Randomize:ve değiştirerek 2 bayt kaydedebilirsiniz . Ya da sadece görmezden gelin. :)Rnd[RAND()>.5]
17:17

@remoel, ne yazık ki, [Rand()]arama sadece psödo-rastlantısal ve BM için fonksiyonel olarak özdeş hale ^ 13 yaklaşık 10 bir süre uzunluğu Randomized Rndiki kullanım aslında, aynı tohum (çağrı olan Randomizearama setleri kullanarak timerişlev çıktı).
Taylor Scott

@romoel, bunu ben görevden alabileceğini istemi üzerine açıklamalar verilmiştir varsayalım ancak do Randomizekullanmak yerine çağrı veRnd>.5
Taylor Scott

6

Kömür , 8 7 bayt

⭆S‽⁺↥ιι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

4

Ruby, 40 Bayt

Bir dize alır Lambda işlevi. Arnauld sayesinde 1 byte kurtarıldı. Snack sayesinde 5 byte kurtarıldı.

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

1
PPCG'ye Hoşgeldiniz! Bir bayt <1yerine kaydedebilir misiniz ==1?
Arnauld,


Güzel iş @displayname. FWIW, kullanıcılar puanlarını geliştirdiğinde, çoğu <s>, " Ruby, <s> 46 </s> 40 bytes " etiketiyle eski puanı "aşmak" ister . Elbette gerekli değil.
Jordan

3

APL + WIN, 37 bayt

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

Ekran girişi için uyarılar, küçük harfleri tanımlar ve rastgele olarak büyük harfe dönüştürür.


3

R , 89 88 bayt

djhurio tarafından aşıldı!

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

Çevrimiçi deneyin!

Bu program her karakteri alır ve olasılık 1/2 ile büyük harfe dönüştürür veya onu tek başına bırakır. Farklı değerleri ile oynayarak bu olasılık çimdik mümkündür dfve 0.

rt0 herhangi bir serbestlik derecesine sahip ortanca 0 olan Öğrenci t dağılımından gelir ( 1mümkün olan en küçük sayı olduğundan seçtim ).


1
Bu rastgele bir şey yapmanın çok R yoludur.
Misha Lavrov


@ djhurio bu harika.
Giuseppe

3

05AB1E , 6 5 bayt

-1 bayt için teşekkür ederim Adnan

uø€ΩJ

Çevrimiçi deneyin!

açıklama

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'ın yanıtından alınan yöntem


1
Biri 6'yı yenecek mi? : P
ETHProductions

1
@ETHproductions Jelly'in 05AB1E gibi büyük harf için tek bir bayt operatörü olsaydı, biz yapardık!
dylnan

Ooo ... random_pick eh için yeni komut? ε„luΩ.Vbenim girişimdi, iyi olan!
Magic Octopus Urn

3
Kopyayı bırakabilirsiniz :)
Adnan

1
Biri 5'i yenecek mi? : P
tamamen insanlık


3

Swift 4, 86 bayt

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

3
PPCG'ye Hoşgeldiniz!
Martin Ender,

3

Java 8, 46 bayt

Bu lambda IntStreamila IntStream(kod noktalarının akışları) ile

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

Çevrimiçi Deneyin

Büyük harf kullanımı dağılımı

Bir mektubu büyük harfle yazıp yazmamak Math.random()<.5, zamanın yarısı kadar tatmin olmuş oldukça mantıklı bir durumdu . Şu anki durumu Math.random()>0(bir bayttan tasarruf sağlayan), büyük harf kullanımı hemen hemen her seferinde gerçekleşir ve bu da bir test programını anlamsız kılar. Ancak rastgelelik şartını yerine getiriyor.

Teşekkür

  • Olivier Grégoire sayesinde -1 bayt

Akış yoluna giderseniz, kod noktalarını kullanabilir ve 41 bayt kullanabilirsiniz .
Olivier Grégoire

Peki, giriş yukarıda ASCII karakterleri içeriyorsa kırılır z. Yine de bir yeterlilikle onu atabilirim.
Jakob


3

Funky , 55 bayt

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

Çevrimiçi deneyin!

İsteğe bağlı virgül sayesinde, daha kısa 's bir byte yapmak 0s.upperanlamına gelir Tablo tanımında, math.randomrastgele ya bulacaktır 1veya 2yapmak yerine, math.random(0,1)rastgele ve yok 0.


3

R , 60 59 58 57 56 63 bayt

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

Çevrimiçi deneyin!

Diğer iki R'den farklı yaklaşım burada ve burada cevaplar . Giuseppe sayesinde iyileştirildi ve düzeltildi!


Örnekleme fonksiyonlarının böyle davrandığını bilmiyordum!
Giuseppe

@Giuseppe Tam da bunun golf oynayamayacağını düşündüğümde ...
JayCe


@Giuseppe Sadece bu golfçü değil, aynı zamanda daha şık! Sevdim!
JayCe

ikinci bakış açısına göre, yukarıda basılabilir ascii karakterleri gibi 90göründüğü zaman bu işe yaramaz [, ancak bu hala djhurio'nun cevabından daha golfçu olan +7 bayt için düzeltir
Giuseppe

2

Ouroboros , 25 bayt

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

Burada dene

Tek süslü kısım kontrol akışıdır .b*). Önce gerisi hakkında konuşalım.

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

Daha sonra satırın başına geri döneriz. Kontrol akışı, hattın sonunun nerede olduğunu değiştirmeyi içerir; IP'nin soluna taşınırsa, yürütme sonlandırılır. Böylece:

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

Karakter kodu pozitif olduğunda ), no- op'dur , çünkü satırın sonu gidebildiği kadar doğrudur. Ancak tüm karakterler okunduğunda, iverir -1. Sonra kod -11karakterlerinin sonunu sağa, yani 11 karakter sola taşırız. Birkaç yineleme alır, ancak sonunda IP kodun sonundan önce gelir ve program durur.



2

Brachylog , 5 bayt

ụᶻṛᵐc

Çevrimiçi deneyin!

açıklama

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 bayt

Leo'ya 2 bayt kaydettiği için teşekkürler.

/uRUwk
\i*&o.@/

Çevrimiçi deneyin!

açıklama

/...
\...@/

Bu, tamamen Sıralı modda çalışan büyük ölçüde doğrusal programlar için olağan çerçevedir.

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.

Öncelikle bunu tamamen Kardinal modunda yapmaya çalıştım, ancak bir şeyin sadece karakter kodunu temel alan bir harf olup olmadığına karar vermek muhtemelen daha fazla bayt alacaktır.


2

Wolfram Dili (Mathematica) , 52 49 44 bayt

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

Çevrimiçi deneyin!

İşleç formunu kullanır StringReplace: ona bir kural (veya bir kurallar listesi) sağlar, ancak hiçbir dize bu kuralı girdi olarak verdiğiniz herhangi bir dizeye uygulayan bir işlev vermez.

RandomChoice@{#,Capitalize@#}&/@#&İnsanların Mathematica'da bazen iyi olduğunu iddia ettiği bir karakter listesini girmeye (ve çıktı olarak üretmeye) karar verirsek çok daha iyisini yapabiliriz ( 34 bayt). Ama bu eğlenceli değil.


M. Stern sayesinde -5 bayt


Kullanarak bir byte kazanınCapitalize
M. Stern

Bunu görmezden istiyorsanız Randomkullanımdan kaldırıldı kendi uygulayarak başka dört bayt kurtarabilecek RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
M. Stern

@ M.Stern RandomBir noktada çalışmaya çalışıyordum , ama bir /;şey ifade etmeye çalıştığımı unuttum If. Teşekkürler!
Misha Lavrov

2

Pyth, 10 7 6 bayt

smO,r1

Ovs sayesinde 3 bayt, Steven H sayesinde 1 teşekkür edildi

Çevrimiçi deneyin

açıklama

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, giriş-çıkış golfünü başka bir bayt çıkışı yapmanıza izin veren.
Steven H.

2

PHP, 63 53 bayt

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

Titus'un önerisini takiben kodu 10 byte ile (kısmi) düşürmeyi başardı.


1
Güzel bir! Daha önce boşluğa gerek yok $a. while(~$a=$argn[$i++])Bunun yerine deneyin foreach(pipo olarak çalıştırın).
Titus

Bu kodu kullanarak "Yakalanmamış Hata: Desteklenmeyen işlenen türleri" hatası alıyorum. Ve neden böyle yaptığını anlayamıyorum, ancak ben ~ şüpheleniyorum. (ve belki de PHP7 kullandığımdan ve yöntem yalnızca 5.6'da çalıştığım için)
RFSnake

2

PowerShell , 57 56 bayt

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

Çevrimiçi deneyin!

Britanist sayesinde -1 bayt

Girdiyi dizge olarak alır, $argsdiziyi açıkça dizgeye chargönderir, diziyi a-dizisi olarak geçirir, ardından karakterleri bir döngüden geçirir. Her yinelemede, 50-50 karakterini olduğu gibi verir $_veya büyük harfe dönüştürür "$_".ToUpper()( ("$_"|% *per)çöp). Bir Randomtamsayı alıp mod alarak seçildi 2.

Bu karakterler, boru hattında bırakılır ve daha sonra -jointekrar tek bir dizgeye geri gönderilir;


Sen değişen tek bir bayt kaydedebilirsiniz "$_".ToUpper()için ("$_"|% *per)/ -:
briantist

1
@briantist Okunabilirliği umursamıyoruz. ;-) Teşekkürler!
AdmBorkBork


1

Rebol , 61 bayt

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

Ölçek:

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

1

Jöle , 16 bayt

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

Çevrimiçi deneyin!

açıklama

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)

Bunun tek bir çizgide çalışmasını sağlayamadım. Ben de neden bilmiyorum, ama yok 2ḶXø³L¤Ð¡listesini verir [None,1,0,..,1]ile 0s ve 1rastgele seçilmiş s. NoneNedeni ilk linkte.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.