ssTTsSTtRrriinInnnnNNNIiinngg

18

Desafío

Para cada carácter de la cadena, excepto el último, haga lo siguiente:

  • Salida del personaje actual.

  • Seguido de la salida aleatoria de la siguiente lista un número aleatorio de veces entre 1 y 5 (inclusive):

    • El personaje actual
    • El siguiente caracter de la cadena
    • La versión del caso de cambio del personaje en el que estás actualmente
    • La versión del caso de cambio del siguiente carácter de la cadena.

Casos de prueba

String -> SSSTSStrTrIiinIIngn

, . , . , . Hello world! -> ,,, .. , ,, .... , , .. .. . HHH HHEeelLlLllooO wwOworOOrrrRllDd!!D

Programming Puzzles and Code Golf -> PrPPrRrOooooogggRgGraAraaaMMMmmmimMIiininGGgG PPPPuZzZZzZzzZzllLLEEeEsEsssS a aANnNddD C COCoooOOdeDe E GGGoOllFFf

Notas

  • Solo necesita aplicar la versión del caso de cambio de un carácter si el carácter es parte del alfabeto (AZ y az).
  • Su función aleatoria no necesita ser uniforme, pero aún debe tener la posibilidad de devolver cualquier elemento en la lista dada.
  • Puede usar cualquier formato de E / S estándar.
  • Puede suponer que la longitud de la entrada es mayor o igual que dos.
  • Puede suponer que la entrada solo consta de caracteres ASCII.
  • El título no es un caso de prueba (no es intencional si es un caso de prueba válido).
  • Switchcase significa convertir el carácter en minúsculas si está en mayúsculas y convertirlo en mayúsculas si está en minúsculas.
MilkyWay90
fuente
Además de '... no necesita ser uniforme', creo que probablemente desee especificar que, dada alguna entrada, en principio todas las salidas legales finitas deberían ser posibles de generar (de lo contrario, mi entero aleatorio no uniforme en [1 , 2,3,4,5] siempre será 2, y solo mostraré la cadena original).
Chas Brown
@ChasBrown Sí, editaré la pregunta
MilkyWay90
2
La especificación me parece confusa. ¿Puedes ser más explícito? Por ejemplo, averigüe cómo StringproduceSSSTSStrTrIiinIIngn
Luis Mendo
77
@LuisMendo No soy OP, pero creo que [S]SSTSS [t]rT, [r]I, [i]inII, [n]gn, donde los caracteres entre los bloques son los primeros puntos (" Mostrar el carácter actual "), y los otros caracteres son 1-5 veces al azar una de las cuatro opciones para eso personaje. Pero estoy de acuerdo, algunas explicaciones más explícitas serían apropiadas. Aparte del caso de prueba, no estaba particularmente claro, tenemos que elegir una opción aleatoria 1-5 veces. En lugar de elegir una opción aleatoria repetida 1-5 veces (como lo hace actualmente la respuesta de Gaia).
Kevin Cruijssen
3
@KevinCruijssen Gracias, su explicación se ajusta al ejemplo y es clara. El OP debe confirmar y editar eso en el texto
Luis Mendo

Respuestas:

6

Gaia , 25 bytes

ṇ\+†ṅ\⟨)₌¤:~+4ṛ⟨ṛ₌¤⟩ₓ\⟩¦$

Pruébalo en línea!

¡Gracias a Kevin Cruijssen por señalar 2 errores!

ṇ\				| delete the last character from the input
  +†				| push the input again and concatenate together, so for instance
				| 'abc' 'bc' becomes ['ab' 'bc' 'c']
    ṅ\				| delete the last element
       ⟨       		⟩¦	| for each of the elements, do:
	)₌			| take the first character and push again
	  ¤			| swap
	   :			| dup
	    ~			| swap case
	     +			| concatenate strings
	      4ṛ		| select a random integer from [1..5]
	        ⟨    ⟩ₓ		| and repeat that many times
		 ṛ₌¤		| select a random character from the string
		      \ 	| clean up stack
			   $	| convert to string

Tenga en cuenta que 4ṛes porque se implementa para un entero zcomo python random.randint(1,z+1), que devuelve un entero Ntal que 1<=N<=z+1.

Giuseppe
fuente
¿Estás seguro de que la codificación de longitud de ejecución es correcta aquí? Si entiendo el desafío correctamente: las cuatro opciones deben elegirse 1-5 veces al azar, en lugar de elegir una de las cuatro al azar, repetidas 1-5 veces. El primer ejemplo de salida SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) parece reflejar esto, y actualmente no es una salida posible en su programa (creo).
Kevin Cruijssen
@KevinCruijssen Interpreté "salida de la lista un número aleatorio de veces" para significar decodificación de longitud de ejecución, pero tiene razón, los casos de prueba parecen indicar la otra interpretación; Creo que debería ser bastante fácil de arreglar
Giuseppe
1
5ṛpuede resultar 6por alguna razón Pruébalo en línea ? PD: ¿No hay una lista de números enteros o for-loop en Gaia?
Kevin Cruijssen
1
@KevinCruijssen dang, Business Cat realmente necesita corregir los errores ocasionales ... Realmente pensé que había una forconstrucción de tipo, pero estoy bastante seguro de que ni siquiera está documentada en la página wiki.
Giuseppe
4

APL (dzaima / APL) , 23 bytes

Función de prefijo tácito anónimo.

2(⊣,{?4⍴⍨?5}⊇,,-⍤,)/

Pruébalo en línea!

2()/ Aplique la siguiente función tácita infija entre cada par de caracteres:

- la caja
 de cambio de
, la concatenación de la pareja

,, anteponer la concatenación de la pareja a ese

{... }⊇ seleccione los siguientes elementos de eso:

  ?5 número aleatorio en el rango 1 ... 5

  4⍴⍨ que cuantas patas

  ? índices aleatorios para aquellos

ϵ nlist (aplanar)

Adán
fuente
3

Perl 6 , 60 bytes

{S:g{.)>(.)}=$/~[~] roll ^5 .roll+1,$/.lc,$/.uc,$0.lc,$0.uc}

Pruébalo en línea!

La parte en minúscula / mayúscula es un poco molesta.

Jo King
fuente
No conozco a Perl, así que probablemente estoy diciendo algo estúpido aquí. Pero, ¿es posible de alguna manera concatenar $/y $0juntos y usar .lcen esa cadena, y luego crear una copia de esa cadena y usar .uc, y concatenar esos dos juntos? No estoy seguro si eso es posible, o más corto que el actual $/.lc,$/.uc,$0.lc,$0.uc, pero eso significaría que tendría que utilizar $/, $0, .lc, y .ucuna vez cada uno.
Kevin Cruijssen
1
Por desgracia, (.lc~.uc for $0~$/).combes más largo. Perl 6 realmente quiere distinguir cadenas y listas, por "abc"[0] eq "abc"lo tanto (pretende ser una lista de un solo elemento).
Ven el
Puede hacerlo deslizándose y una función anónima aplicada a una lista: {.lc,|.uc}($/,|$0)para -5 bytes, y simplemente use la lista de coincidencias {.lc,|.uc}(@$/)para -8 bytes. tio.run/…
Phil H
@ Phil No, eso no funciona. Esas soluciones solo capitalizan una de las letras cada una
Jo King
3

Golpetazo , 121 bytes

-20 bytes gracias a Nahuel

-9 bytes gracias a roblogic

for((i=0;i<${#1};i++)){
s=${1:i:1}
m=${1:i:2}
m=${m,,}${m^^}
for((t=0;t++<RANDOM%6;)){
s+=${m:RANDOM%4:1}
}
printf "$s"
}

Pruébalo en línea!

Respuesta original

Bash , 150 bytes

He hecho muy pocos golpes de golf e intentado mejorar mi golpe, así que cualquier comentario será bienvenido.

for((i=0;i<${#1}-1;i++));do
c=${1:$i:1}
n=${1:$((i+1)):1}
a=($n ${c,} ${c^} ${n,} ${n^})
shuf -e ${a[@]} -n "$(shuf -i 1-5 -n 1)"|xargs printf %s
done

Pruébalo en línea!

El código es un bucle directo a través de caracteres que configuran el carácter actual cy el siguiente n, luego crea una matriz de las 4 posibilidades, repite una de ellas para que haya exactamente 5. Luego barajamos esa matriz y luego elegimos n elementos de ella, donde n es aleatorio entre 1 y 5.

Jonás
fuente
parece que faltaprintf %s "$c"
Nahuel Fouilleul
1
doy donepuede ser reemplazado por indocumentado {y}
Nahuel Fouilleul
con algunos cambios
Nahuel Fouilleul
1
@roblogic eso es inteligente. tyvm.
Jonás
1
La solución de 121 bytes es un poco frágil / con errores, aquí hay una versión más robusta (133 bytes) que debería manejar todos los ASCII imprimibles, tio.run
roblogic
2

Python 2 , 107 bytes

f=lambda s:s and s[0]+''.join(sample((s[:2]+s[:2].swapcase())*5,randint(1,5)))+f(s[1:])
from random import*

Pruébalo en línea!

Chas Brown
fuente
2

05AB1E , 18 17 bytes

ü)vyн5LΩFyD.š«Ω]J

Inspirado por la respuesta de Gaia de @Giuseppe .
-1 byte gracias a @Shaggy .

Pruébelo en línea 10 veces o verifique todos los casos de prueba 10 veces .

Explicación:

ü)             # Create all pairs of the (implicit) input
               #  i.e. "Hello" → [["H","e"],["e","l"],["l","l"],["l","o"]]
  v            # Loop over each these pairs `y`:
   yн          #  Push the first character of pair `y`
   5LΩ         #  Get a random integer in the range [1,5]
      F        #  Inner loop that many times:
       y       #   Push pair `y`
        D.š«   #   Duplicate it, swap the cases of the letters, and merge it with `y`
            Ω  #   Then pop and push a random character from this list of four
  ]J           # After both loops: join the entire stack together to a single string
               # (which is output implicitly as result)
Kevin Cruijssen
fuente
No sé 05AB1E pero, en lugar de INè, ¿podrías salvar algo presionando al primer personaje de y?
Shaggy
@ Shaggy Sí, de hecho puedo ... ¡Gracias! Tal vez debería dejar de jugar golf por hoy, soy un desastre, jajaja ..
Kevin Cruijssen
Eres un desastre? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Urna mágica de pulpo
1
@MagicOctopusUrn Aunque es un enfoque bastante original, me temo que no hace el primer punto del desafío (" Mostrar el carácter actual "), ya que el resultado puede comenzar cont , To spara la entrada "String"en su programa, mientras se supone que siempre comienza con el S.
Kevin Cruijssen
1

Carbón , 27 bytes

FLθ«F∧ι⊕‽⁵‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ§θι

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

FLθ«

Recorra todos los índices de la cadena de entrada.

F∧ι⊕‽⁵

Excepto por el primer índice, repita un número aleatorio del 1 al 5 inclusive ...

‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ

... extraiga los caracteres anteriores y siguientes de la cadena, tome las versiones en mayúsculas y minúsculas, y elija un carácter aleatorio de los cuatro.

§θι

Imprime el carácter en el índice actual.

Neil
fuente
1

perl 5 ( -p), 77 bytes

s/(.)(?=(.))/$x=$1;'$x.=substr"\U$1$2\L$1$2",4*rand,1;'x(1+5*rand)/gee;s/.$//

TIO

Nahuel Fouilleul
fuente
Puede guardar 4 bytes utilizando en $&lugar de $1, y chop+ en -llugar des/.$//
Dada
1

Japt -P , 14 bytes

äÈ+Zu pv ö5ö Ä

Intentalo

äÈ+Zu pv ö5ö Ä     :Implicit input of string
ä                  :Take each consectutive pair of characters
 È                 :Pass them through the following function as Z
  +                :  Append to the first character of the pair
   Zu              :    Uppercase Z
      p            :    Append
       v           :      Lowercase
         ö         :    Get X random characters, where X is
          5ö       :      Random number in the range [0,5)
             Ä     :      Plus 1
                   :Implicitly join and output
Lanudo
fuente
1

Python 3 , 167 bytes

from random import*;c=choice
def f(s):
 i=0;r=""
 for i in range(len(s)-1):
  r+=s[i]
  for j in range(randrange(5)):r+=c([str.upper,str.lower])(c(s[i:i+2]))
 return r

Pruébalo en línea!

Sara J
fuente
1

Jalea , 14 bytes

;;;Œs$Xɗ¥5X¤¡Ɲ

Pruébalo en línea!

Explicación

             Ɲ | For each overlapping pair of letters
;              | Join the first letter to...
         5X¤¡  | Between 1 and 5 repetitions of...
      Xɗ¥      | A randomly selected character from...
 ;;Œs$         | A list of the two letters and the swapped case versions of both
Nick Kennedy
fuente
1

C (GCC) 175 162 bytes

-12 bytes de LambdaBeta

f(s,S,i,r,a)char*s,*S,*i;{srand(time(0));for(i=S;*(s+1);++s){*i++=*s;for(r=rand()%5+1;r--;*i++=rand()&1?a>96&a<123|a>64&a<91?a^32:a:a)a=rand()&1?*s:*(s+1);}*i=0;}

Pruébalo en línea

rtpax
fuente
No creo que necesites el 0en la primera línea.
LambdaBeta
También puede guardar muchos caracteres tomando el búfer Scomo parámetro y agregando sus variables a la lista de argumentos: ¡ Pruébelo en línea!
LambdaBeta
@LambdaBeta resulta que tienen razón sobre el 0, lo que hizo que no vale la pena tener la #definemás
rtpax
150 bytes
ceilingcat
1

PowerShell , 154 105 103 95 87 bytes

-67 bytes gracias a mazzy que no puede ser detenido

-join(($x=$args)|%{$_;$x[$i,++$i]*5|%{"$_"|% *wer;"$_"|% *per}|random -c(1..5|random)})

Pruébalo en línea!

No es un método fantástico pero funciona. Ahora está bastante bien. Toma entrada a través de salpicaduras

Veskah
fuente
Oh, wow, eso son muchos bytes.
MilkyWay90
1
@mazzy Dang perro. Necesito adquirir el hábito de salpicar todo el tiempo, pero no sabía que podría intercambiar los comodines de esa manera.
Veskah
1
Lo siento 87 bytes
mazzy
0

Scala 2.12.8, 214 bytes

Versión de golf:

val r=scala.util.Random;println(readLine.toList.sliding(2).flatMap{case a :: b :: Nil=>(a +: (0 to r.nextInt(5)).map{_=>((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)})}.mkString)

Golfizado con nuevas líneas y sangrías:

val r=scala.util.Random
println(readLine.toList.sliding(2).flatMap{
  case a :: b :: Nil=>
    (a +: (0 to r.nextInt(5)).map{_=>
      ((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)
    })
}.mkString)

Sin golf:

import scala.io.StdIn
import scala.util.Random

def gobble(input: String): String = {
  input.toList.sliding(2).flatMap {
    case thisChar :: nextChar :: Nil =>
      val numberOfAdditions = Random.nextInt(5)
      (thisChar +: (0 to numberOfAdditions).map { _ =>
        val char = if(Random.nextBoolean) thisChar else nextChar
        val cc = if(Random.nextBoolean) char.toUpper else char.ToLower
        cc
      })
  }.mkString
}

println(gobble(StdIn.readLine()))
Soren
fuente
1
No hay manera de convertir a :: b :: Nilen a::b::Nil? Lo mismo para a :+, a:+()o a.:+()podría funcionar
Ven
@Ven a::b::Nilprovoca un error de compilación. +:¿Es un método definido en la lista, por lo que podría ahorrar espacio al deshacerse de los parentes externos?
Soren
Solo tienes un elemento aquí, así que no es autotupling de todos modos
Ven
0

C # (compilador interactivo de Visual C #) , 236 213 209 bytes

a=>{int i=0,j;var m=new Random();var s="";var c = a.Select(x=>Char.IsLetter(x)?(char)(x^32):x).ToArray();for(;i<a.Length-1;i++)for(j=m.Next(1,5);j-->0;)s+=new[]{a[i],c[i],a[i+1],c[i+1]}[m.Next(0,3)];return s;}

Pruébalo en línea!

Datos caducados
fuente
No funciona con caracteres no alfanuméricos. char b=a[0]-> var b=a[0], espacio adicional en la declaración de dfor-loop
Encarnación de la ignorancia
0

Consulta T-SQL, 286 bytes

DECLARE @ char(999)='String'

SELECT @=stuff(@,n+2,0,s)FROM(SELECT
top 999*,substring(lower(c)+upper(c),abs(v%4)+1,1)s
FROM(SELECT*,number n,substring(@,number+1,2)c,cast(newid()as varbinary)v
FROM(values(1),(2),(3),(4),(5))F(h),spt_values)D
WHERE'P'=type and n<len(@)-1and h>v%3+2ORDER
BY-n)E
PRINT LEFT(@,len(@)-1)

Pruébelo en línea desafortunadamente, la versión en línea siempre muestra el mismo resultado para el mismo varchar, a diferencia de MS SQL Server Management Studio

t-clausen.dk
fuente
0

Japt -P , 43 16 bytes

äÈ+(Zv +Zu)ö5ö Ä

Acortado por mucho ahora!

Intentalo

Encarnación de la ignorancia
fuente
Esto parece devolver el mismo resultado cada vez.
Shaggy
@Shaggy lo arreglará. Además, äla descripción dice que da tres argumentos, siendo el último x+y. Pero como puede ver aquí , solo devuelve 1. ¿Es esto un error?
Encarnación de la ignorancia
0

C (gcc) , 110 109 bytes

i,p;g(char*_){for(i=rand(putchar(*_))%1024;p=_[i%2],putchar(i&2&&p>64&~-p%32<26?p^32:p),i/=4;);_[2]&&g(_+1);}

Pruébalo en línea!

-1 gracias a ceilingcat

i,p;g(char*_){
    for(i=rand(putchar(*_)) //print current char
         %1024;             // and get 10 random bits
        p=_[i%2],           //1st bit => current/next char
        putchar(i&2&&       //2nd bit => toggle case
            p>64&~-p%32<26  // if char-to-print is alphabetic
            ?p^32:p),
        i/=4;);             //discard two bits
    _[2]&&g(_+1);           //if next isn't last char, repeat with next char
}

El número de caracteres impresos (por carácter de entrada) no es uniformemente aleatorio:

1  if      i<   4 (  4/1024 = 1/256)
2  if   4<=i<  16 ( 12/1024 = 3/256)
3  if  16<=i<  64 ( 48/1024 = 3/ 64)
4  if  64<=i< 256 (192/1024 = 3/ 16)
5  if 256<=i<1024 (768/1024 = 3/  4)
attinat
fuente
0

Zsh, 113 107 bytes

Con mucha ayuda de man zshexpny man zshparam. Pruébalo en línea!

  • -6 por mí, retocando
for ((;i<#1;i++)){m=${1:$i:2};m=$m:l$m:u
for ((;t<RANDOM%5;t++))x+=${m[RANDOM%4]}
echo ${1[i]}$x\\c;t=;x=;}
roblogic
fuente