Losowa kapitalizacja

37

Zadanie

Twoim zadaniem jest stworzenie programu lub funkcji, która po wprowadzeniu danych wyjściowych wyprowadzi tekst z losowymi literami wielkimi literami, zachowując już wielkie litery.

Powinna być możliwa każda kombinacja wielkich liter małych liter. Na przykład, jeśli sygnał wejściowy był abcnie powinno być niezerowy prawdopodobieństwo wyprowadzanie dowolnej z następujących kombinacji: abc, Abc, aBc, abC, ABc, AbC, aBCi ABC.

Wkład

Dane wejściowe to ciąg znaków, zawierający na przykład dowolną liczbę drukowalnych znaków ASCII Hello World. Sygnały wyjściowe dla tego sygnału obejmują HeLLo WoRlD, HElLO WOrlditp

Punktacja

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w każdym języku!

Brecert
źródło

Odpowiedzi:

14

TI-Basic (seria 83), 137 bajtów

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

Pobiera dane wejściowe Ans, jak pokazano na zrzucie ekranu poniżej:

wprowadź opis zdjęcia tutaj

(Jeśli zrzut ekranu wygląda na zakodowany, jak to czasem bywa dla mnie, spróbuj otworzyć go w nowej karcie ?)

TI-Basic (przynajmniej wersja TI-83 ... może powinienem rozwinąć się w golfa TI-89) to straszny język, w którym można spróbować zagrać w golfa, ponieważ:

  1. Nie zapewnia absolutnie żadnego wsparcia dla arytmetyki ze znakami, znając wielką literę małej litery, a nawet znając alfabet.
  2. Przechowywanie każdej pojedynczej małej litery zajmuje 2 bajty. (W rzeczywistości musiałem użyć skryptu asemblera, aby móc wpisywać małe litery).

W rezultacie 78 bajtów tego programu (więcej niż połowa) zapisuje tylko dwa razy alfabet .

W każdym razie chodzi o to, że pętlujemy przez łańcuch, z szansą na zamianę małych liter w wielkie litery i dodawanie wyniku na końcu łańcucha, aby zarówno wejście, jak i wyjście były przechowywane Ans. Kiedy opuszczamy For(pętlę, Ijest ona większa niż długość oryginalnego łańcucha, więc wzięcie I-1znaków zaczynających się od Idaje wynik.

Misza Ławrow
źródło
Zarówno aplikacje „MirageOS”, jak i „OmniCalc” umożliwiają wpisywanie małych liter po dwukrotnym naciśnięciu przycisku alfa. Mają też inne fajne funkcje.
Fabian Röling,
@Fabian Skrypt asemblera i wspomniane aplikacje działają zasadniczo w ten sam sposób: ustawiają flagę w systemie operacyjnym, która umożliwia „dwukrotne naciśnięcie klawisza alfa”.
Misha Lavrov,
11

Japt , 6 bajtów

®m`«`ö

Przetestuj online!

Wyjaśnienie

®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
ETHprodukcje
źródło
10

C,  47  46 bajtów

Dzięki @ l4m2 za uratowanie bajtu!

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

Wypróbuj online!

Wynosi 42 bajty, jeśli można założyć, że {|}~nie pojawiają się na wejściu:

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

Wypróbuj online!

Steadybox
źródło
Warto zauważyć, że przy konkretnej implementacji wielkość liter jest całkowicie deterministyczna (standard C zapewnia domyślnie srand(1)na początku programu, więc w każdym wykonaniu sekwencja zwracanych wartości rand()będzie taka sama).
Matteo Italia
f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}jakiegoś kompilatora (def. -funsigned-char) pracy
l4m2
@ l4m2 Dzięki! Z jakiegoś powodu to nie działa. Zmiana 'a'na 97udziała i nawet nie wymaga -funsigned-charflagi.
Steadybox
Wydaje się, że po odjęciu 'a'(co jest signed int, nie unsigned char) od *s(co jest unsigned char), *sawansuje się signed intna unsigned int, dlatego możliwe są wartości ujemne i porównanie nie działa zgodnie z przeznaczeniem.
Steadybox
8

Galaretka , 5 bajtów

Kolejny bajtuje kurz dzięki Dylnan.

żŒuX€

Wypróbuj online!

Wyjaśnienie

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

żŒu    zip s with s uppercased  ["HH", "eE", "lL", "lL", "oO", "  ", ...]
   X€  map random choice        "HeLLo woRlD"
całkowicie ludzki
źródło
1
Muszę ŒṘczęściej używać, aby zobaczyć, jak rzeczy są reprezentowane pod maską
dylnan
7

Perl 5 , 23 bajtów

Kod 22 bajtów + 1 dla -p.

s/./rand>.5?uc$&:$&/ge

Wypróbuj online!

Dom Hastings
źródło
7

JavaScript (ES6), 56 bajtów

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

Jeśli jednolita losowość nie jest wymagana, możemy zaoszczędzić 6 bajtów, wykorzystując bieżący czas jako źródło losowości:

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

Zwykle jest to pisanie wielkimi literami lub pozostawienie samych liter jednocześnie.

ETHprodukcje
źródło
„powinno być niezerowe prawdopodobieństwo wyprowadzenia którejkolwiek z następujących kombinacji: abc, Abc, aBc, abC, ABc, AbC, aBC lub ABC”, podczas gdy twoje nie może wyprowadzić, AbCponieważ czas nie zmieni się tak szybko
l4m2
@ l4m2, jeśli masz naprawdę wolną maszynę, może ;-) Może powinienem po prostu usunąć tę część ...
ETHproductions
6

R , 66 bajtów

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

Wypróbuj online!

Kolejna odpowiedź R.

djhurio
źródło
Pisałem za dużo „zwykłego” kodu R i nawet nie pomyślałem o wypróbowaniu forpętli! Niezłe.
Giuseppe,
6

Excel VBA, 74 71 64 bajtów

RandomizeWezwanie zawsze sprawia, że wyjście losowo kosztowne w VBA :(

Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z zakresu [A1]i wyjścia do bezpośredniego okna VBE. Wytwarza 50% (średnio) UCasemocy wyjściowej.

For i=1To[Len(A1)]:a=Mid([A1],i,1):?IIf(Rnd>.5,a,UCase(a));:Next
Taylor Scott
źródło
Dzień dobry Panu. możesz zapisać 2 bajty, usuwając Randomize:i zmieniając za Rndpomocą [RAND()>.5]. Lub po prostu zignoruj ​​to. :)
remoel
@remoel, niestety, [Rand()]wywołanie jest tylko losowe psuedo i ma długość okresu około 10 ^ 13, co czyni go funkcjonalnie identycznym z wywołaniem un Randomized Rnd, w rzeczywistości obie używają tego samego ziarna (które to Randomizewywołanie ustawia za pomocą timerfunkcji wydajność).
Taylor Scott,
@romoel, przypuszczam jednak, że biorąc pod uwagę wyjaśnienia w monicie, że mogę usunąć Randomizepołączenie i zamiast tego użyćRnd>.5
Taylor Scott
6

Węgiel , 8 7 bajtów

⭆S‽⁺↥ιι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 S          Input string
      ι     Character
    ↥ι      Uppercase character
   ⁺        Concatenate
  ‽         Random element
⭆           Map over each character and join the result
            Implicitly print
Neil
źródło
4

Rubin, 40 bajtów

Funkcja Lambda, która pobiera ciąg. Oszczędność 1 bajtu dzięki Arnauldowi. Zaoszczędź 5 bajtów dzięki Snack.

->s{s.gsub(/./){|x|[x,x.upcase].sample}}
wyświetlana nazwa
źródło
1
Witamy w PPCG! Czy możesz zapisać bajt <1zamiast ==1?
Arnauld
1
40 bajtów
Przekąska
Dobra robota @ nazwa wyświetlana. FWIW, gdy użytkownicy poprawiają swój wynik, wielu lubi „wykreślić” stary wynik ze <s>znacznikiem, np. „ Ruby, <s> 46 </s> 40 bajtów ”. Oczywiście nie jest to wymagane.
Jordania
3

APL + WIN, 37 bajtów

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

Monituje o wprowadzenie ekranu, identyfikuje małe litery i losowo konwertuje je na duże.

Graham
źródło
3

R , 89 88 bajtów

outgolfed przez djhurio!

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

Wypróbuj online!

Ten program bierze każdą postać i z prawdopodobieństwem 1/2 przekształca ją na wielkie litery lub pozostawia w spokoju. Możliwe jest dostosowanie tego prawdopodobieństwa, grając z różnymi wartościami dfi 0.

rtczerpie z rozkładu t Studenta, który ma medianę 0 z dowolnym stopniem swobody (wybrałem, 1ponieważ jest to najmniejsza możliwa liczba).

Giuseppe
źródło
1
To bardzo R sposób na zrobienie czegoś losowo.
Misza Ławrow
@djhurio, który jest genialny.
Giuseppe
3

05AB1E , 6 5 bajtów

Dziękuję Adnan za -1 bajt

uø€ΩJ

Wypróbuj online!

Wyjaśnienie

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

Metoda zaczerpnięta z odpowiedzi @ całkowicieludzkiej

dylnan
źródło
1
Czy ktokolwiek kiedykolwiek pokona 6? : P
ETHproductions
1
@ETHproductions Gdyby Jelly miał operator jednobajtowy dla wielkich liter, takich jak 05AB1E, zrobilibyśmy to!
dylnan
Ooo ... Nowe polecenie dla random_pick co? ε„luΩ.Vbyła moja próba, miła!
Magic Octopus Urn
3
Możesz pominąć duplikat :)
Adnan
1
Czy ktoś pokona 5? : P
totalnie ludzki,
3

Rubin, 39 bajtów

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

W dużej mierze zainspirowany odpowiedzią na nazwę wyświetlaną . (Nie mogłem skomentować tej jednobajtowej wersji z powodu braku reputacji, przepraszam, wyświetlana nazwa )

Jérémie Bonal
źródło
3
Witamy w PPCG!
Martin Ender,
Nie spodziewałam się pozdrowienia, jakie to miłe! Dziękuję Ci!
Jérémie Bonal
3

Swift 4, 86 bajtów

s.map{let s="\($0)",u=s.uppercased();return u==s ? u:arc4random()%2==0 ? u:s}.joined()
Au Ris
źródło
3
Witamy w PPCG!
Martin Ender,
3

Java 8, 46 bajtów

Ta lambda jest od IntStreamdo IntStream(strumienie punktów kodowych).

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

Wypróbuj online

Dystrybucja wielkich liter

To, czy napisać wielką literą, było dość rozsądnym warunkiem Math.random()<.5, który był spełniony w połowie czasu. Przy obecnym stanie Math.random()>0(który oszczędza bajt), wielkie litery pojawiają się praktycznie za każdym razem, co sprawia, że ​​program testowy jest bezcelowy. Ale spełnia wymagania dotyczące losowości.

Podziękowanie

  • -1 bajt dzięki Olivier Grégoire
Jakob
źródło
Jeśli wybierzesz trasę strumienia, możesz użyć punktów kodowych i zrobić 41 bajtów .
Olivier Grégoire
Cóż, to się psuje, jeśli dane wejściowe zawierają znaki ASCII powyżej z. Mógłbym jednak wrzucić to z kwalifikacjami.
Jakob
1
Napraw jeszcze 6 bajtów .
Olivier Grégoire
3

Funky , 55 bajtów

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

Wypróbuj online!

Dzięki opcjonalnym przecinkom jest o jeden bajt krótszy do zrobienia 0s.upperw definicji tabeli, co oznacza, że math.randomlosowo wybierze albo, 1albo 2, niż zrobić math.random(0,1)losowo i nie ma 0.

ATaco
źródło
3

R , 60 59 58 57 56 63 bajtów

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

Wypróbuj online!

Odmienne podejście od pozostałych dwóch odpowiedzi R tutaj i tutaj . Ulepszony i naprawiony dzięki Giuseppe!

JayCe
źródło
Nie wiedziałem, że tak działają funkcje próbkowania!
Giuseppe
@Giuseppe Właśnie wtedy, gdy pomyślałem, że nie da się tego
pograć w
57 bajtów
Giuseppe
@Giuseppe Ten golfista jest nie tylko bardziej elegancki, ale także bardziej elegancki! Kocham to!
JayCe
na drugim zdaniem, to nie będzie działać, gdy znaków ASCII powyżej 90jak [, ale to rozwiąże go do +7 bajtów która nadal golfier niż odpowiedzi djhurio za
Giuseppe
2

Ouroboros , 25 bajtów

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

Wypróbuj tutaj

Jedyną częścią wyobraźnia jest przepływ sterowania .b*). Porozmawiajmy najpierw o reszcie.

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

Następnie wracamy do początku linii. Przepływ sterowania polega na zmianie miejsca końca linii; jeśli zostanie przeniesiony na lewo od adresu IP, wykonanie zostanie zakończone. A zatem:

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

Gdy kod znaków jest dodatni, )oznacza to brak możliwości, ponieważ koniec wiersza jest jak najbardziej w prawo. Ale kiedy wszystkie postacie zostaną przeczytane, idaje -1. Następnie przesuwamy koniec -11znaków kodu w prawo - czyli 11 znaków w lewo. Trwa kilka iteracji, ale w końcu adres IP znajduje się za końcem kodu i program zatrzymuje się.

DLosc
źródło
2

Brachylog , 5 bajtów

ụᶻṛᵐc

Wypróbuj online!

Wyjaśnienie

Example input: "Test"

ụᶻ        Zip uppercase:      [["T","T"],["e","E"],["s","S"],["t","T"]]
  ṛᵐ      Map random element: ["T","e","S","T"]
    c     Concatenate:        "TeST"
Fatalizować
źródło
2

Alice , 17 15 bajtów

Dzięki Leo za oszczędność 2 bajtów.

/uRUwk
\i*&o.@/

Wypróbuj online!

Wyjaśnienie

/...
\...@/

Jest to zwykła struktura dla programów w dużej mierze liniowych działających całkowicie w trybie porządkowym.

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.

Najpierw próbowałem zrobić to całkowicie w trybie kardynalnym, ale ustalenie, czy coś jest literą opartą tylko na kodzie znaków, prawdopodobnie zabrałoby więcej bajtów.

Martin Ender
źródło
2

Wolfram Language (Mathematica) , 52 49 44 bajtów

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

Wypróbuj online!

Używa formy operatora StringReplace: podając jej regułę (lub listę reguł), ale żaden ciąg nie podaje funkcji, która stosuje tę regułę do dowolnego ciągu, który podajesz jako dane wejściowe.

Moglibyśmy zrobić znacznie lepiej ( RandomChoice@{#,Capitalize@#}&/@#&34 bajty), gdybyśmy zdecydowali się wziąć jako dane wejściowe (i wygenerować jako dane wyjściowe) listę znaków, co ludzie czasem twierdzą, że w Mathematica jest w porządku, ponieważ jest to jedyny ciąg znaków w innych językach. Ale to nie jest fajne.


-5 bajtów dzięki M. Stern

Misza Ławrow
źródło
Zaoszczędź jeden bajt, używającCapitalize
M. Stern
Jeśli chcesz ignorować faktu, że Randomjest przestarzała można zaoszczędzić kolejne cztery bajty wdrażając własny RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
monsieur Stern
@ M.Stern W pewnym momencie próbowałem dostać się Randomdo pracy, ale zapomniałem o tym, /;więc starałem się umieścić w Ifoświadczeniu. Dzięki!
Misza Ławrow
2

Pyth, 10 7 6 bajtów

smO,r1

Zaoszczędzono 3 bajty dzięki ovs i 1 dzięki Stevenowi H.

Wypróbuj online

Wyjaśnienie

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.
Mnemoniczny
źródło
r1d= rd1, pozwalając ci na niejawne wejście w golfa na inny bajt.
Steven H.,
2

PHP, 63 53 bajty

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

Udało się zmniejszyć kod o 10 bajtów (częściowo) zgodnie z sugestią Tytusa.

RFSnake
źródło
1
Niezłe! Nie ma potrzeby wcześniejszego miejsca $a. Spróbuj while(~$a=$argn[$i++])zamiast foreach(uruchom jako potok).
Tytus
Korzystając z tego kodu, otrzymałem błąd „Nieprzechwycony błąd: nieobsługiwane typy operandów”. I nie rozumiem, dlaczego tak się dzieje, ale podejrzewam, że ~. (a może dlatego, że używam PHP7, a metoda działa tylko dla 5.6)
RFSnake
2

PowerShell , 57 56 bajtów

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

Wypróbuj online!

-1 bajt dzięki briantist

Pobiera dane wejściowe jako ciąg znaków, jawnie rzutuje $argstablicę na ciąg znaków, charrzutuje ją jako -array, a następnie przekazuje znaki przez pętlę. W każdej iteracji, 50-50 albo wypisujemy postać taką, jaka jest$_ przekształcamy go na wielkie litery "$_".ToUpper()(to ("$_"|% *per)śmieci). Jest to wybierane przez uzyskanie Randomliczby całkowitej i przyjęcie jej mod 2.

Te znaki są pozostawione w potoku, a następnie z -joinpowrotem połączone w pojedynczy ciąg, który sam zostaje w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
Możesz zapisać jeden bajt zmieniając "$_".ToUpper()na ("$_"|% *per): - /
briantist
1
@ briantist Dobrze, że nie dbamy o czytelność. ;-) Dzięki!
AdmBorkBork,
2

Julia , 35 bajtów

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

Wypróbuj online!

Nadal jest łatwy do odczytania jako człowiek. W Julii rand (A) zwraca losowy element z A.

Łukasza
źródło
Witamy w PPCG!
Steadybox
1

Rebol , 61 bajtów

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

Test:

>>c: "Test sTring"
>>u c
Test sTriNg
Galen Iwanow
źródło
1

Galaretka , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

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)

Nie mogłem tego uruchomić w jednej linii. Ja też nie wiem dlaczego, ale 2ḶXø³L¤Ð¡daje listę [None,1,0,..,1]z 0s i 1s wybierane losowo. To Nonejest powód pierwszego linku.

dylnan
źródło