Capitalización aleatoria

36

La tarea

Su tarea es crear un programa o una función que, dada una entrada, emite el texto de entrada con letras al azar en mayúscula, mientras mantiene las letras ya en mayúscula en mayúscula.

Toda combinación de mayúsculas y minúsculas debería ser posible. Por ejemplo, si la entrada era abc, no debe haber una probabilidad no cero de la salida de cualquiera de las siguientes combinaciones: abc, Abc, aBc, abC, ABc, AbC, aBCo ABC.

Entrada

Su entrada es una cadena, que contiene cualquier número de caracteres ASCII imprimibles, por ejemplo Hello World. Las salidas para que la entrada incluyen HeLLo WoRlD, HElLO WOrld, etc.

Tanteo

Este es el código de golf, por lo que gana la respuesta más corta en cada idioma.

Brecert
fuente

Respuestas:

14

TI-Basic (serie 83), 137 bytes

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

Toma entrada Ans, como se ilustra en la siguiente captura de pantalla:

ingrese la descripción de la imagen aquí

(Si la captura de pantalla parece codificada, como a veces lo hace para mí, ¿intentas abrirla en una nueva pestaña ?)

TI-Basic (al menos la versión TI-83 ... tal vez debería diversificarme en el golf TI-89) es un lenguaje terrible para intentar jugar este desafío, ya que:

  1. No proporciona absolutamente ningún soporte para ninguna aritmética con caracteres, conociendo la versión en mayúscula de un carácter en minúscula, o incluso conociendo el alfabeto.
  2. Cada carácter en minúscula toma 2 bytes para almacenar. (De hecho, tuve que usar un script de ensamblaje solo para poder escribir las letras minúsculas).

El resultado es que 78 bytes de este programa (más de la mitad) solo almacenan el alfabeto, dos veces .

De todos modos, la idea es que recorramos la cadena, con la posibilidad de convertir caracteres en minúsculas en mayúsculas a medida que avanzamos, y agregar el resultado al final de la cadena para que tanto la entrada como la salida se almacenen Ans. Cuando dejamos el For(bucle, Ies uno más que la longitud de la cadena original, por lo que tomar los I-1caracteres que comienzan en Ida la salida.

Misha Lavrov
fuente
Las aplicaciones "MirageOS" y "OmniCalc" le permiten escribir letras minúsculas simplemente presionando alfa dos veces. Y también tienen otras características agradables.
Fabian Röling
@Fabian El script de ensamblaje y las aplicaciones que mencionó, ambas funcionan esencialmente de la misma manera: establecen una marca en el sistema operativo que permite "presionar alfa dos veces en minúsculas".
Misha Lavrov
11

Japt , 6 bytes

®m`«`ö

¡Pruébelo en línea!

Explicación

®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
ETHproducciones
fuente
10

C,  47  46 bytes

¡Gracias a @ l4m2 por guardar un byte!

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

Pruébalo en línea!

Sería 42 bytes, si se puede suponer que {|}~no aparecen en la entrada:

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

Pruébalo en línea!

Steadybox
fuente
Vale la pena señalar que, dada una implementación particular, la capitalización es perfectamente determinista (el estándar C proporciona una implícita srand(1)al inicio del programa, por lo que en cada ejecución la secuencia de valores devueltos por rand()será la misma).
Matteo Italia
f(char*s){for(;*s++-=(*s-'a'<26&rand())*32;);}para algunos trabajos de compilación (def. -funsigned-char)
l4m2
@ l4m2 ¡Gracias! Sin embargo, eso no funciona por alguna razón. Cambia 'a'a 97uobras y ni siquiera requiere la -funsigned-charbandera.
Steadybox
Parece que cuando resta 'a'(que es signed int, no unsigned char) de *s(que es unsigned char), *sse promueve en signed intlugar de unsigned int, por lo tanto, los valores negativos son posibles y la comparación no funciona según lo previsto.
Steadybox
8

Jalea , 5 bytes

Otro bytes el polvo gracias a dylnan.

żŒuX€

Pruébalo en línea!

Explicación

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

żŒu    zip s with s uppercased  ["HH", "eE", "lL", "lL", "oO", "  ", ...]
   X€  map random choice        "HeLLo woRlD"
totalmente humano
fuente
1
Necesito usar ŒṘmás a menudo para ver cómo se representan las cosas bajo el capó
dylnan
7

JavaScript (ES6), 56 bytes

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

Si no se requiere una aleatoriedad uniforme, podemos ahorrar 6 bytes utilizando la hora actual como fuente de aleatoriedad:

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

Esto tiende a mayúsculas o dejar solo todas las letras a la vez.

ETHproducciones
fuente
"debería haber una probabilidad distinta de cero de generar cualquiera de las siguientes combinaciones: abc, Abc, aBc, abC, ABc, AbC, aBC o ABC", mientras que la suya no puede emitir AbCporque el tiempo no cambiará tan rápido
l4m2
@ l4m2 si tiene una máquina realmente lenta, podría ;-) Tal vez debería eliminar esa parte, aunque ...
ETHproductions
6

R , 66 bytes

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

Pruébalo en línea!

Otra respuesta de R.

djhurio
fuente
¡He estado escribiendo demasiado código R "regular" y ni siquiera pensé en probar un forbucle! Buena esa.
Giuseppe
6

Excel VBA, 74 71 64 Bytes

La Randomizellamada siempre hace que la salida aleatoria sea costosa en VBA :(

Función de ventana inmediata anónima de VBE que toma entrada del rango [A1]y salidas a la ventana inmediata de VBE. Produce un 50% (en promedio) de UCasesalida d.

For i=1To[Len(A1)]:a=Mid([A1],i,1):?IIf(Rnd>.5,a,UCase(a));:Next
Taylor Scott
fuente
Hola señor. puede guardar 2 bytes quitando Randomize:y cambiando Rndcon [RAND()>.5]. O simplemente ignóralo. :)
remoel
@remoel, desafortunadamente, la [Rand()]llamada es solo psuedo-random y tiene una duración de aproximadamente 10 ^ 13, lo que la hace funcionalmente idéntica a la llamada un Randomized Rnd, de hecho, los dos usan la misma semilla (que la Randomizellamada establece mediante la timerfunción salida).
Taylor Scott
@romoel, sin embargo, supongo que, dadas las aclaraciones en el aviso, podría eliminar la Randomizellamada y usar en su lugarRnd>.5
Taylor Scott el
6

Carbón , 8 7 bytes

⭆S‽⁺↥ιι

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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

Rubí, 40 bytes

Función lambda que toma una cadena. Guardado 1 byte gracias a Arnauld. Guardado 5 bytes gracias a Snack.

->s{s.gsub(/./){|x|[x,x.upcase].sample}}
nombre para mostrar
fuente
1
Bienvenido a PPCG! ¿Podría guardar un byte con en <1lugar de ==1?
Arnauld
1
40 bytes
Snack
@Displayname buen trabajo. Fwiw cuando los usuarios a mejorar su puntuación, al igual que muchos de "tachar" la vieja cuenta con la <s>etiqueta, por ejemplo, " Ruby, <s> 46 </ s> 40 bytes ." Por supuesto que no es necesario.
Jordan
3

APL + WIN, 37 bytes

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

Solicita entrada de pantalla, identifica letras minúsculas y las convierte aleatoriamente a mayúsculas.

Graham
fuente
3

R , 89 88 bytes

superado por djhurio!

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

Pruébalo en línea!

Este programa toma cada carácter y, con probabilidad, 1/2 lo convierte a mayúsculas o lo deja solo. Es posible ajustar esta probabilidad jugando con diferentes valores de dfy 0.

rtse basa en la distribución t de Student, que tiene una mediana de 0 con cualquier grado de libertad (seleccioné 1ya que es el número más pequeño posible).

Giuseppe
fuente
1
Esa es una forma muy R de hacer algo al azar.
Misha Lavrov
@djhurio eso es genial.
Giuseppe
3

05AB1E , 6 5 bytes

Gracias Adnan por -1 byte

uø€ΩJ

Pruébalo en línea!

Explicación

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

Método tomado de la respuesta de @ totallyhuman

dylnan
fuente
1
¿Alguien alguna vez vencerá a 6? : P
ETHproductions
1
@ETHproductions Si Jelly tuviera un operador de un solo byte para mayúsculas como 05AB1E, ¡lo tendríamos!
dylnan
Ooo ... Nuevo comando para random_pick eh? ε„luΩ.Vfue mi intento, agradable!
Urna mágica del pulpo
3
Puedes dejar el duplicado :)
Adnan
1
¿Alguien vencerá a 5? : P
totalmente humano
3

Ruby, 39 bytes

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

En gran parte inspirado de la respuesta de displayname . (No pude comentar para sugerir esta versión de un byte por falta de reputación, lo siento, nombre para mostrar )

Jérémie Bonal
fuente
3
Bienvenido a PPCG!
Martin Ender
No esperaba saludos, ¡qué lindo! ¡Gracias!
Jérémie Bonal
3

Swift 4, 86 bytes

s.map{let s="\($0)",u=s.uppercased();return u==s ? u:arc4random()%2==0 ? u:s}.joined()
Au Ris
fuente
3
Bienvenido a PPCG!
Martin Ender
3

Java 8, 46 bytes

Esta lambda es de IntStreama IntStream(secuencias de puntos de código).

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

Pruébalo en línea

Distribución de capitalización

Solía ​​ser mayúscula o minúscula una condición bastante sensata Math.random()<.5, que se cumplía la mitad del tiempo. Con la condición actual de Math.random()>0(que ahorra un byte), las mayúsculas se producen prácticamente todo el tiempo, lo que hace que un programa de prueba sea inútil. Pero sí satisface el requisito de aleatoriedad.

Expresiones de gratitud

  • -1 byte gracias a Olivier Grégoire
Jakob
fuente
Si sigue la ruta de la transmisión, puede usar puntos de código y hacer 41 bytes .
Olivier Grégoire
Bueno, eso se rompe si la entrada contiene caracteres ASCII arriba z. Sin embargo, podría lanzarlo con una calificación.
Jakob
1
Arreglo para 6 bytes más .
Olivier Grégoire
3

Funky , 55 bytes

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

Pruébalo en línea!

Gracias a las comas opcionales, es un byte más corto para hacer 0s.upperen la definición de la tabla, lo que significa que math.randomelegirá aleatoriamente 1o 2, que hacer math.random(0,1)en el azar y no tener el 0.

Un taco
fuente
3

R , 60 59 58 57 56 63 bytes

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

Pruébalo en línea!

Enfoque diferente de las otras dos respuestas R aquí y aquí . ¡Mejorado y reparado gracias a Giuseppe!

JayCe
fuente
¡No sabía que las funciones de muestreo se comportaban así!
Giuseppe
@Giuseppe Justo cuando pensaba que esto no podía ser superado ...
JayCe
57 bytes
Giuseppe
@Giuseppe ¡No solo es más golfista sino también más elegante! ¡Quiéralo!
JayCe
al segundo punto de vista, esto no funcionará caracteres ASCII imprimibles cuando anteriormente 90como [, pero esto soluciona por +7 bytes que todavía Golfier es que la respuesta de djhurio
Giuseppe
2

Ouroboros , 25 bytes

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

Pruébalo aquí

La única parte de fantasía es el flujo de control, .b*). Hablemos primero del resto.

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

Luego volvemos al principio de la línea. El flujo de control implica cambiar dónde está el final de la línea; Si se mueve a la izquierda de la IP, la ejecución termina. Así:

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

Cuando el código de char es positivo, )no funciona, ya que el final de la línea está lo más a la derecha posible. Pero cuando todos los personajes han sido leídos, ida -1. Luego, movemos el final de los -11caracteres del código a la derecha, es decir, 11 caracteres a la izquierda. Toma un par de iteraciones, pero finalmente la IP ha pasado el final del código y el programa se detiene.

DLosc
fuente
2

Brachylog , 5 bytes

ụᶻṛᵐc

Pruébalo en línea!

Explicación

Example input: "Test"

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

Alice , 17 15 bytes

Gracias a Leo por guardar 2 bytes.

/uRUwk
\i*&o.@/

Pruébalo en línea!

Explicación

/...
\...@/

Este es el marco habitual para programas en gran medida lineales que operan completamente en modo 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.

Primero intenté hacer esto completamente en modo Cardinal, pero determinar si algo es una letra basada en el código de caracteres probablemente tomaría más bytes.

Martin Ender
fuente
2

Wolfram Language (Mathematica) , 52 49 44 bytes

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

Pruébalo en línea!

Utiliza la forma del operador de StringReplace : proporcionándole una regla (o una lista de reglas) pero ninguna cadena proporciona una función que aplica esa regla a cualquier cadena que le dé como entrada.

Podríamos hacerlo mucho mejor ( RandomChoice@{#,Capitalize@#}&/@#&es 34 bytes) si decidiéramos tomar como entrada (y producir como salida) una lista de caracteres, que la gente a veces argumenta que está bien en Mathematica porque es el único tipo de cadena que hay en otros idiomas. Pero eso no es divertido.


-5 bytes gracias a M. Stern

Misha Lavrov
fuente
Guardar un byte utilizandoCapitalize
M. Stern,
Si desea ignorar que Randomestá en desuso podría ahorrar otros cuatro bytes mediante la implementación de su propio RandomChoice: StringReplace[c_/;Random[]<.5:>Capitalize@c],
M. Stern,
@ M.Stern Estaba tratando de llegar Randomal trabajo en un momento, pero me olvidé de eso, /;así que estaba tratando de hacer una Ifdeclaración. ¡Gracias!
Misha Lavrov
2

Pyth, 10 7 6 bytes

smO,r1

Guardado 3 bytes gracias a ovs y 1 gracias a Steven H.

Pruébalo en línea

Explicación

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.

fuente
r1d= rd1, lo que le permite ingresar golf de forma implícita a otro byte.
Steven H.
2

PHP 63 53 bytes

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

Logramos reducir el código con 10 bytes siguiendo (parcialmente) siguiendo la sugerencia de Titus.

RFSnake
fuente
1
¡Buena esa! No hay necesidad de un espacio antes $a. Intente en while(~$a=$argn[$i++])lugar de foreach(ejecutar como tubería).
Titus
Al usar ese código, recibí el error "Error no detectado: tipos de operandos no compatibles". Y no puedo ver por qué hace eso, pero sospecho que ~. (y tal vez porque uso PHP7 y el método solo funciona para 5.6)
RFSnake
2

PowerShell , 57 56 bytes

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

Pruébalo en línea!

-1 byte gracias a briantist

Toma la entrada como una cadena, convierte explícitamente la $argsmatriz en una cadena, la charconvierte como una matriz y luego alimenta los caracteres a través de un bucle. En cada iteración, 50-50 da como resultado el carácter tal cual $_o lo convertimos a mayúsculas "$_".ToUpper()(esa es la ("$_"|% *per)basura). Eso se elige al obtener un Randomnúmero entero y tomarlo mod 2.

Esos caracteres se dejan en la tubería y luego se -joinvuelven a unir en una sola cadena, que se deja en la tubería y la salida es implícita.

AdmBorkBork
fuente
Puede guardar un solo byte cambiando "$_".ToUpper()a ("$_"|% *per): - /
briantist el
1
@briantist Lo bueno es que no nos importa la legibilidad. ;-) ¡Gracias!
AdmBorkBork
2

Julia , 35 bytes

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

Pruébalo en línea!

Todavía es bastante fácil de leer como humano. En Julia rand (A) devuelve un elemento aleatorio de A.

Lucas
fuente
Bienvenido a PPCG!
Steadybox
1

Rebol , 61 bytes

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

Prueba:

>>c: "Test sTring"
>>u c
Test sTriNg
Galen Ivanov
fuente
1

Jalea , 16 bytes

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

Pruébalo en línea!

Explicación

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)

No pude hacer que esto funcione en una sola línea. Asimismo, no sé por qué, pero 2ḶXø³L¤Ð¡da la lista [None,1,0,..,1]con 0s y 1S elegido al azar. El Nonees el motivo de la en el primer enlace.

dylnan
fuente