Випадкова капіталізація


37

Завдання

Ваше завдання - створити програму або функцію, яка, даючи введення, виводить текст вводу випадковими літерами з великої літери, зберігаючи вже великі літери з великої літери.

Кожна комбінація великих літер повинна бути можливою. Наприклад, якщо вхідний сигнал був abc, не повинна бути ненульовий ймовірністю виведення будь-яких з наступних комбінацій: abc, Abc, aBc, abC, ABc, AbC, aBCабо ABC.

Вхідні дані

Ваш вхід - це рядок, який містить, наприклад, будь-яку кількість символів ASCII для друку Hello World. Виходи для цього входу включають в себе HeLLo WoRlD, HElLO WOrldі т.д.

Оцінка балів

Це код-гольф, тому найкоротша відповідь на кожній мові виграє!

Відповіді:


14

TI-Basic (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, як показано на скріншоті нижче:

enter image description here

(Якщо скріншот виглядає зашифрованим, як це буває для мене, спробуйте відкрити його на новій вкладці ?)

TI-Basic (принаймні версія TI-83 ... можливо, я повинен розгалужитися на гольф TI-89) - це жахлива мова, щоб спробувати пограти в цю проблему, оскільки:

  1. Він абсолютно не підтримує арифметику з символами, знаючи велику версію малого символу або навіть знаючи алфавіт.
  2. Кожен окремий малий символ зберігає 2 байти. (Насправді мені довелося використовувати сценарій складання лише для того, щоб можна було вводити малі літери.)

У результаті виходить, що 78 байт цієї програми (більше половини) просто зберігають алфавіт, двічі .

У будь-якому випадку, ідея полягає в тому, що ми переходимо через рядок, маючи можливість перетворити символи малих літер у великі регістри, і ми додамо результат на кінець рядка, щоб і вхід, і вихід зберігалися Ans. Коли ми залишаємо For(цикл, Iце на один більший, ніж довжина початкового рядка, тому взяття I-1символів, починаючи з, Iдає вихід.


Програми "MirageOS" та "OmniCalc" дозволяють набирати малі літери лише натисканням альфа двічі. І вони також мають інші приємні риси.
Фабіан Рьолінг

@Fabian Сценарій складання та згадані вами програми працюють по суті однаково: вони встановлюють прапор в операційній системі, що дозволяє "двічі натискати альфа для малих літер".
Міша Лавров



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;);}

Спробуйте в Інтернеті!


Варто зауважити, що, зважаючи на конкретну реалізацію, використання srand(1)великих літер є цілком детермінованим (стандарт C надає неявний на початку програми, тому в кожному виконанні послідовність повернених значень rand()буде однаковою).
Маттео Італія

f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}для деякої компіляторної (деф. -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 байт

Ще один байт пилу завдяки ділнан.

żŒ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

JavaScript (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 :(

Анонімна функція негайного вікна VBE, яка приймає вхід із діапазону [A1]та виводить у безпосереднє вікно VBE. Дає 50% (в середньому) UCased вихід.

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

Вітаю, сер. Ви можете зберегти 2 байти шляхом видалення Randomize:і зміни Rndз [RAND()>.5]. Або просто ігнорувати це. :)
remoel

@remoel, на жаль, [Rand()]виклик є лише псеедо-випадковим і має тривалість періоду приблизно 10 ^ 13, що робить його функціонально ідентичним виклику un Randomized Rnd, адже вони використовують одне і те ж насіння (яке Randomizeвиклик встановлює за допомогою timerфункції вихід).
Тейлор Скотт

@romoel, але я вважаю, що з огляду на підказки про те, що я можу зняти Randomizeвиклик і замість цього використатиRnd>.5
Тейлор Скотт


4

Рубін, 40 байт

Функція лямбда, яка займає рядок. Збережено 1 байт завдяки Арнольду. Збережено 5 байт завдяки Snack.

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

1
Ласкаво просимо до PPCG! Чи не могли б ви зберегти байт з <1замість ==1?
Арнольд


Приємна робота @displayname. FWIW, коли користувачі покращують свою оцінку, багато хто любить "закреслити" стару оцінку <s>тегом, наприклад, " Ruby, <s> 46 </s> 40 байт ". Звичайно, це не потрібно.
Йорданія

3

APL + WIN, 37 байт

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

Запрошує ввести екран, ідентифікує малі літери та випадково перетворює їх у великі регістри.


3

R , 89 88 байт

перевершив джуріо!

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

Спробуйте в Інтернеті!

Ця програма приймає кожного персонажа і з вірогідністю 1/2 перетворює його в великі регістри або залишає його в спокої. Цю ймовірність можна змінити, граючи з різними значеннями dfта 0.

rtвиводить із t-розподілу Стьюдента, який має медіану 0 з будь-яким ступенем свободи (я вибрав, 1оскільки це найменша можлива кількість).


1
Це дуже R спосіб робити щось навмання.
Міша Лавров


@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

Метод, взятий з відповіді @ totalhuman


1
Хтось коли-небудь битиме 6? : P
ETHproductions

1
@ETHproductions Якби в Jelly був єдиний байт-оператор для верхнього регістру, як 05AB1E, ми б!
ділнан

Ооо ... Нова команда для random_pick так? ε„luΩ.Vбула моя спроба, приємна!
Чарівний восьминіг Урна

3
Ви можете залишити дублікат :)
Аднан

1
Хтось поб'є 5? : P
повністюлюдський

3

Рубін, 39 байт

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

Багато в чому надихнув відповідь displayname . (Я не міг прокоментувати цю однобайтну версію за відсутності репутації, вибачте ім'я )


3
Ласкаво просимо до PPCG!
Мартін Ендер

Я не чекав привітань, як приємно! Дякую!
Jérémie Bonal


3

Java 8, 46 байт

Це лямбда від IntStreamдо IntStream(потоків кодових точок).

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

Спробуйте в Інтернеті

Розподіл капіталізації

Чи то велика літера з великої літери раніше була цілком розумною умовою Math.random()<.5, яку задовольняли близько половини часу. При поточному стані Math.random()>0(що економить байт) капіталізація відбувається практично кожного разу, що робить тестову програму безглуздою. Але це задовольняє вимогу випадковості.

Подяка

  • -1 байт завдяки Олів’є Грегоаре

Якщо ви йдете маршрутом потоку, ви можете використовувати кодові точки і робити 41 байт .
Олів'є Грегоар

Ну, це перерви, якщо вхід містить символи ASCII вище z. Я міг би кинути це з кваліфікацією, хоча.
Якоб


3

Фанки , 55 байт

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

Спробуйте в Інтернеті!

Завдяки необов'язковім комам 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

з другого погляду, це не буде працювати, коли надруковані символи ascii вище, 90як [, але це фіксує його на +7 байт, який все ще є гравцем, ніж відповідь djhurio
Джузеппе

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

Коли charcode позитивний, ) це не-op, оскільки кінець рядка максимально правильний. Але коли всі персонажі прочитані, iдає -1. Потім переміщуємо кінець -11символів коду праворуч - тобто 11 символів зліва. Це займає кілька ітерацій, але врешті-решт IP проходить кінець коду і програма зупиняється.




2

Аліса , 17 15 байт

Дякуємо Лео за збереження 2 байтів.

/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

Мова Вольфрама (Mathematica) , 52 49 44 байт

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

Спробуйте в Інтернеті!

Використовує форму оператора StringReplace: надання йому правила (або списку правил), але жодна рядок не дає функції, яка застосовує це правило до будь-якого рядка, який ви надаєте як вхідний.

Ми могли б зробити набагато краще ( RandomChoice@{#,Capitalize@#}&/@#&це 34 байти), якби вирішили взяти за вхід (і створити як вихід) список символів, який люди іноді стверджують, що добре в Mathematica, тому що це єдиний вид рядка в інших мовах. Але це не весело.


-5 байт завдяки М. Стерну


Збережіть один байт, скориставшисьCapitalize
M. Stern

Якби ігнорувати , що Randomзасуджується ви могли б заощадити ще чотири байти, реалізувавши свій власний RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
М. Штерн

@ M.Stern Я намагався Randomв один момент приступити до роботи, але забув про це, /;тому намагався вкласти Ifзаяву. Спасибі!
Міша Лавров

2

Pyth, 10 7 6 байт

smO,r1

Збережено 3 байти завдяки ovs та 1 завдяки Steven H.

Спробуйте в Інтернеті

Пояснення

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, що дозволяє імпліцитно ввести гольф ще один байт.
Стівен Х.

2

PHP, 63 53 байти

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

Вдалося зменшити код на 10 байт (частково) за пропозицією Тіта.


1
Хороший! Раніше не потрібно було місця $a. Спробуйте while(~$a=$argn[$i++])замість foreach(запустити як трубу).
Тит

Використовуючи цей код, я отримав помилку "Uncaught Error: Neпідтримувані типи операндів". І я не бачу, чому це робить, але я підозрюю ~. (а може тому, що я використовую PHP7 і метод працює лише для 5.6)
RFSnake

2

PowerShell , 57 56 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки брианісту

Приймає введення як рядок, явно відкидає $argsмасив до рядка, charпередає його як- масив, а потім подає символи через цикл. Кожну ітерацію ми 50-50 або виводимо символ як є, $_або перетворюємо його у верхній регістр "$_".ToUpper()(це ("$_"|% *per)сміття). Це вибрано, отримавши Randomціле число і взявши його за мод 2.

Ці символи залишаються на конвеєрі, а потім -joinповторно з'єднуються в єдиний рядок, який сам залишається на конвеєрі, і вихід неявний.


Ви можете зберегти один байт, змінивши "$_".ToUpper()на ("$_"|% *per): - /
британіст

1
@briantist Добре, що ми не піклуємося про читабельність. ;-) Спасибі!
AdmBorkBork



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)

Я не міг змусити це працювати в одному рядку. Я також не знаю чому, але 2ḶXø³L¤Ð¡подає список [None,1,0,..,1]з 0s та 1s, вибраними випадковим чином. NoneЄ причиною для в першій ланці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.