Случайная капитализация


36

Задание

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

Любая комбинация заглавных букв строчных букв должна быть возможной. Например, если входной сигнал был 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, как показано на скриншоте ниже:

введите описание изображения здесь

(Если скриншот выглядит зашифрованным, как это иногда бывает для меня, попробуйте открыть его в новой вкладке ?)

TI-Basic (по крайней мере, версия TI-83 ... может быть, мне стоит заняться игрой в гольф TI-89) - это ужасный язык, чтобы попытаться решить эту проблему, поскольку:

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

В результате 78 байтов этой программы (более половины) просто хранят алфавит, дважды .

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


Приложения «MirageOS» и «OmniCalc» позволяют печатать строчные буквы, просто дважды нажимая клавишу alpha. И у них также есть другие приятные особенности.
Фабиан

@Fabian Сценарий сборки и приложения, о которых вы упомянули, работают в основном одинаково: они устанавливают флаг в операционной системе, который позволяет «дважды нажать альфа для ввода строчных букв».
Миша Лавров

11

Japt , 6 байт

®m`«`ö

Проверьте это онлайн!

объяснение

®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 байтов

Спасибо @ l4m2 за сохранение байта!

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

Попробуйте онлайн!

Было бы 42 байта, если можно было бы предположить, что {|}~не появляется на входе:

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

Попробуйте онлайн!


Стоит отметить, что с учетом конкретной реализации, заглавные буквы являются совершенно детерминированными (стандарт C обеспечивает неявный srand(1)в начале программы, поэтому при каждом выполнении последовательность значений, возвращаемых с помощью, rand()будет одинаковой).
Matteo Italia

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 байт

Еще один байт пыли благодаря Dylnan.

żŒ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, к сожалению, [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. Впрочем, когда пользователи улучшают свои оценки, многие любят «вычеркивать» старые оценки с помощью <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

Метод взят из ответа @ totallyhuman


1
Кто-нибудь когда-нибудь побьет 6? : P
ETHпродукция

1
@ETHproductions Если бы у Jelly был однобайтовый оператор для верхнего регистра, такой как 05AB1E, мы бы!
Дилнан

Ооо ... Новая команда для random_pick а? ε„luΩ.Vбыла моя попытка, милая!
Волшебная Урна Осьминога

3
Вы можете оставить дубликат вне :)
Аднан

1
Кто-нибудь победит 5? : P
полностью человек

3

Рубин, 39 байт

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

Во многом вдохновлен ответом displayname . (Я не мог прокомментировать, чтобы предложить эту однобайтовую версию из-за отсутствия репутации, извините, отображаемое имя )


3
Добро пожаловать в PPCG!
Мартин Эндер

Я не ожидал приветствий, как приятно! Спасибо!
Жереми Бональ


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 байт, что все еще сложнее, чем ответ Джурио
Джузеппе

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

Если код положительный, )это запрет , так как конец строки находится настолько далеко, насколько это возможно. Но когда все символы были прочитаны, 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.

Сначала я попытался сделать это полностью в режиме Cardinal, но определение того, является ли что-либо буквой, основанной только на символьном коде, вероятно, заняло бы больше байтов.


2

Wolfram Language (Mathematica) , 52 49 44 байта

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

Попробуйте онлайн!

Использует форму оператора StringReplace : предоставление ему правила (или списка правил), но ни одна строка не дает функцию, которая применяет это правило к любой строке, которую вы задаете в качестве входных данных.

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


-5 байт благодаря М. Стерну


Сохраните один байт, используяCapitalize
М. Штерн

Если бы игнорировать , что 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: Unsupported Типы операндов». И я не могу понять, почему это так, но я подозреваю, что ~. (и, возможно, потому что я использую PHP7, а метод работает только для 5.6)
RFSnake

2

PowerShell , 57 56 байт

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

Попробуйте онлайн!

-1 байт благодаря бриантисту

Принимает ввод как строку, явно преобразует $argsмассив в строку, charпреобразует его как -array, а затем передает символы через цикл. На каждой итерации мы 50-50 либо выводим символ как есть, $_либо конвертируем его в верхний регистр "$_".ToUpper()(это ("$_"|% *per)мусор). Это выбирается, получая Randomцелое число и принимая его мод 2.

Эти символы остаются в конвейере, а затем -joinснова объединяются в одну строку, которая сама остается в конвейере и вывод неявен.


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

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.