ssTTsSTtRrriinInnnnNNNIiinngg

18

Desafio

Para cada caractere da sequência, exceto o último, faça o seguinte:

  • Produz o caractere atual.

  • Seguido pela saída aleatória da lista a seguir um número aleatório de vezes entre 1 - 5 (inclusive):

    • O caractere atual
    • O próximo caractere da sequência
    • A versão do switchcase do personagem em que você está atualmente
    • A versão do switchcase do próximo caractere da sequência.

Casos de teste

String -> SSSTSStrTrIiinIIngn

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

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

Notas

  • Você só precisa aplicar a versão do switchcase de um caractere se ele fizer parte do alfabeto (AZ e az).
  • Sua função aleatória não precisa ser uniforme, mas ainda precisa ter a chance de retornar qualquer elemento da lista fornecida.
  • Você tem permissão para usar qualquer formato de E / S padrão.
  • Você pode assumir que o comprimento da entrada é maior ou igual a dois.
  • Você pode assumir que a entrada consiste apenas em caracteres ASCII.
  • O título não é um caso de teste (não é intencional se for um caso de teste válido).
  • Switchcase significa transformar o caractere em minúsculas, se estiver em maiúsculas, e em maiúsculas, se estiver em minúsculas.
MilkyWay90
fonte
Além de '... não precisa ser uniforme', acho que você provavelmente deseja especificar que, com alguma entrada, todas as saídas legais finitas devem, em princípio, ser possíveis de gerar (caso contrário, meu inteiro aleatório não uniforme em [1 , 2,3,4,5] sempre será 2, e eu apenas mostrarei a string original).
Chas Brown
@ChasBrown Sim, eu vou editar a pergunta
MilkyWay90
2
Acho a especificação confusa. Você pode ser mais explícito? Por exemplo, descubra como StringproduzSSSTSStrTrIiinIIngn
Luis Mendo
7
@LuisMendo Não sou OP, mas acho que: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnonde os caracteres entre os blocos são os primeiros marcadores (" Output the current character ") e os outros são de 1 a 5 vezes aleatoriamente, uma das quatro opções para isso personagem. Mas eu concordo, algumas explicações mais explícitas seriam apropriadas. Além do caso de teste, não estava particularmente claro que precisamos escolher uma escolha aleatória de 1 a 5 vezes. Em vez de escolher uma escolha aleatória repetida 1-5 vezes (como a resposta do Gaia atualmente faz).
Kevin Cruijssen 03/04
3
@KevinCruijssen Obrigado, sua explicação se encaixa no exemplo e é clara. O OP deve confirmar e editar isso no texto
Luis Mendo

Respostas:

6

Gaia , 25 bytes

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

Experimente online!

Obrigado a Kevin Cruijssen por apontar 2 bugs!

ṇ\				| 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

Observe que 4ṛé porque é implementado para um número inteiro zcomo o de python random.randint(1,z+1), que retorna um número inteiro Ncomo esse 1<=N<=z+1.

Giuseppe
fonte
Tem certeza de que a codificação de duração da execução está correta aqui? Se eu entendi o desafio corretamente: as quatro opções devem ser escolhidas 1 a 5 vezes aleatoriamente, em vez de escolher uma das quatro aleatoriamente, repetidas 1 a 5 vezes. O primeiro exemplo de output SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) parece refletir isso, e atualmente não é possível no seu programa (eu acho).
Kevin Cruijssen em
@KevinCruijssen Interpretei "saída da lista um número aleatório de vezes" para significar decodificação no comprimento da execução, mas você está certo, os casos de teste parecem indicar a outra interpretação; Eu acho que deve ser bem fácil de consertar
Giuseppe
1
5ṛpode resultar em 6algum motivo Experimente-o online ? PS: Não existe um número inteiro para a lista à distância ou loop for em Gaia?
Kevin Cruijssen em 3/04
1
@KevinCruijssen dang, o Business Cat realmente precisa corrigir erros off-by-one ... Eu realmente pensei que havia uma forconstrução de tipo, mas tenho certeza que é isso que nem sequer está documentado na página da wiki.
Giuseppe
4

APL (dzaima / APL) , 23 bytes

Função de prefixo tácito anônimo.

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

Experimente online!

2()/ Aplique a seguinte função tácita infix entre cada par de caracteres:

- a caixa
 de distribuição da
, concatenação do par

,, preceder a concatenação do par àquele

{}⊇ Escolha os seguintes elementos a partir disso:

  ?5 número aleatório no intervalo de 1 a 5

  4⍴⍨ que muitos quatros

  ? índices aleatórios para aqueles

ε nlist (achatar)

Adão
fonte
3

Perl 6 , 60 bytes

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

Experimente online!

A parte minúscula / maiúscula é meio irritante.

Brincadeira
fonte
Eu não conheço Perl, então provavelmente estou dizendo algo estúpido aqui. Mas é de alguma forma possível concaturar o $/e $0juntos e usá .lc-lo nessa sequência e, em seguida, criar uma cópia dessa sequência e usar .uce concaturar os dois juntos? Não tenho certeza se isso é mesmo possível, ou mais curto do que o atual $/.lc,$/.uc,$0.lc,$0.uc, mas isso significaria que você usaria $/, $0, .lc, e .ucuma vez cada.
Kevin Cruijssen 03/04
1
Infelizmente, (.lc~.uc for $0~$/).combé mais longo. O Perl 6 realmente quer distinguir strings e listas, então "abc"[0] eq "abc"(ele finge ser uma lista de item único).
Ven
Você pode fazer isso escorregando e uma função anônima aplicada a uma lista: {.lc,|.uc}($/,|$0)por -5 bytes, e apenas use a lista de correspondências {.lc,|.uc}(@$/)por -8 bytes. tio.run/…
Phil H
@ Philh Não, isso não funciona. Essas soluções apenas colocam letras maiúsculas em uma letra cada
Jo King
3

Bash , 121 bytes

-20 bytes graças a Nahuel

-9 bytes graças ao 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"
}

Experimente online!

Resposta original

Bater , 150 bytes

Fiz muito pouco esforço com o golfe e tentei melhorar minha festa, então qualquer comentário é bem-vindo.

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

Experimente online!

O código é um loop direto através de caracteres, configurando o caractere atual ce o próximo n, criando uma matriz das 4 possibilidades, repetindo uma delas para que haja exatamente 5. Em seguida, embaralhámos essa matriz e, em seguida, escolhe n elementos, onde n é aleatório entre si. 1 e 5.

Jonah
fonte
parece que está faltandoprintf %s "$c"
Nahuel Fouilleul 03/04
1
doe donepode ser substituído por não documentado {e}
Nahuel Fouilleul 03/04
com algumas mudanças
Nahuel Fouilleul 03/04
1
@roblogic isso é inteligente. tyvm.
Jonah
1
A solução de 121 bytes é um pouco frágil / com bugs, aqui está uma versão mais robusta (133 bytes) que deve lidar com todos os ASCII imprimíveis, 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*

Experimente online!

Chas Brown
fonte
2

05AB1E , 18 17 bytes

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

Inspirado na resposta Gaia de @Giuseppe .
-1 byte graças a @Shaggy .

Experimente on-line 10 vezes ou verifique todos os casos de teste 10 vezes .

Explicação:

ü)             # 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
fonte
Não sei 05AB1E, mas, em vez de INè, você poderia salvar alguma coisa pressionando o primeiro caractere de y?
Shaggy
@ Shaggy Sim, eu realmente posso .. Obrigado! Talvez eu deva parar de jogar hoje, estou uma bagunça, lol ..
Kevin Cruijssen 03/04
Você está uma bagunça? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Magic Octopus Urn
1
@MagicOctopusUrn Embora uma abordagem muito original, eu tenho medo que ele não faz o primeiro ponto do desafio ( " Output o caráter atual. "), Já que o resultado pode começar com t, Tou spara a entrada "String"em seu programa, enquanto deve começar sempre com o S.
Kevin Cruijssen 03/04
1

Carvão , 27 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

FLθ«

Faça um loop sobre todos os índices da sequência de entrada.

F∧ι⊕‽⁵

Exceto pelo primeiro índice, faça um loop sobre um número aleatório de 1 a 5, inclusive ...

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

... extrai os caracteres anteriores e seguintes da string, pega as versões em maiúsculas e minúsculas e escolhe um caractere aleatório dos quatro.

§θι

Imprima o caractere no índice atual.

Neil
fonte
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
fonte
Você pode salvar 4 bytes usando em $&vez de $1e chop+ em -lvez des/.$//
Dada
1

Japonês -P , 14 bytes

äÈ+Zu pv ö5ö Ä

Tente

äÈ+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
Shaggy
fonte
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

Experimente online!

Sara J
fonte
1

Gelatina , 14 bytes

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

Experimente online!

Explicação

             Ɲ | 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
fonte
1

C (GCC) 175 162 bytes

-12 bytes do 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;}

Experimente online

rtpax
fonte
Eu não acho que você precise 0da primeira linha.
LambdaBeta 03/04
Também pode salvar muitos caracteres usando o buffer Scomo parâmetro e adicionando suas variáveis ​​à lista de argumentos: Experimente online!
LambdaBeta 03/04
@LambdaBeta parece que você está certo sobre o 0que fez com que não valesse a pena ter #definemais
rtpax 04/04
150 bytes
ceilingcat
1

PowerShell , 154 105 103 95 87 bytes

-67 bytes graças ao mazzy que não pode ser parado

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

Experimente online!

Não é um método fantástico, mas funciona. Agora está muito bom. Recebe entrada via splatting

Veskah
fonte
Oh, uau, isso é muitos bytes.
MilkyWay90
1
@mazzy Dang dog. Eu preciso adquirir o hábito de respingar o tempo todo, mas não sabia que você poderia fazer hotswap com os membros curinga assim.
Veskah
1
Sinto muito 87 bytes
mazzy
0

Scala 2.12.8, 214 bytes

Versão Golfed:

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)

Jogou golfe com novas linhas e recuos:

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)

Ungolfed:

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
fonte
1
Não há forma de transformar a :: b :: Nilem a::b::Nil? Mesmo para a :+, a:+()ou a.:+()pode funcionar
Ven
@Ven a::b::Nilcausa um erro de compilação. +:é um método definido na lista, para economizar espaço ao se livrar das parênteses externas?
Soren
Você só tem apenas um elem aqui, então não é autotupling qualquer maneira
Ven
0

Perl 5 -n , 61 bytes

s/.(?=(.))/print$&,map{(map{lc,uc}$&,$1)[rand 4]}0..rand 5/ge

Experimente online!

dada
fonte
0

C # (Compilador interativo do 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;}

Experimente online!

Dados expirados
fonte
Não funciona com caracteres não alfanuméricos. char b=a[0]-> var b=a[0], espaço extra na declaração do dloop for
Modalidade de ignorância
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)

Experimente online infelizmente, a versão online sempre mostra o mesmo resultado para o mesmo varchar, ao contrário do MS SQL Server Management Studio

t-clausen.dk
fonte
0

Japonês -P , 43 16 bytes

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

Encurtado por muito agora!

Tente

Modalidade de ignorância
fonte
Isso parece retornar o mesmo resultado todas as vezes.
Shaggy
@Shaggy irá corrigir. Além disso, äa descrição diz que ele fornece três argumentos, sendo o último x+y. Mas como você pode ver aqui , ele retorna apenas 1. Isso é um bug?
Modalidade de ignorância
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);}

Experimente online!

-1 graças 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
}

O número de caracteres impressos (por caractere de entrada) não é uniformemente aleatório:

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
fonte
0

Zsh, 113 107 bytes

Com muita ajuda de man zshexpne man zshparam. Experimente Online!

  • -6 por mim, aprimorando
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
fonte