ssTTsSTtRrriinInnnnNNNIiinngg

18

Défi

Pour chaque caractère de la chaîne, à l'exception du dernier, procédez comme suit:

  • Sortez le caractère actuel.

  • Suivi de la sortie aléatoire de la liste suivante un nombre aléatoire de fois entre 1 et 5 (inclus):

    • Le personnage actuel
    • Le caractère suivant de la chaîne
    • La version Switchcase du personnage sur lequel vous vous trouvez actuellement
    • La version switchcase du caractère suivant de la chaîne.

Cas de test

String -> SSSTSStrTrIiinIIngn

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

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

Remarques

  • Vous devez uniquement appliquer la version switchcase d'un caractère si le caractère fait partie de l'alphabet (AZ et az).
  • Votre fonction aléatoire n'a pas besoin d'être uniforme, mais elle doit toujours avoir une chance de retourner n'importe quel élément de la liste donnée.
  • Vous êtes autorisé à utiliser n'importe quel format d'E / S standard.
  • Vous pouvez supposer que la longueur de l'entrée est supérieure ou égale à deux.
  • Vous pouvez supposer que l'entrée se compose uniquement de caractères ASCII.
  • Le titre n'est pas un cas de test (il n'est pas intentionnel s'il s'agit d'un cas de test valide).
  • Switchcase signifie mettre le caractère en minuscule s'il est en majuscule et le mettre en majuscule s'il est en minuscule.
MilkyWay90
la source
En plus de '... n'a pas besoin d'être uniforme', je pense que vous voudrez probablement spécifier que, étant donné certaines entrées, toutes les sorties légales finies devraient en principe être possibles à générer (sinon, mon entier aléatoire non uniforme dans [1 , 2,3,4,5] va toujours être 2, et je vais juste sortir la chaîne d'origine).
Chas Brown
@ChasBrown Ouais, je vais modifier la question
MilkyWay90
2
Je trouve la spécification déroutante. Pouvez-vous être plus explicite? Par exemple, déterminez comment StringproduitSSSTSStrTrIiinIIngn
Luis Mendo
7
@LuisMendo Je ne suis pas OP, mais je pense:, [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnoù les caractères entre les blocs sont les premiers points (" Sortie du caractère actuel "), et les autres caractères sont 1-5 fois au hasard l'un des quatre choix pour cela personnage. Mais je suis d'accord, des explications plus explicites seraient appropriées. Mis à part le cas de test, il n'était pas particulièrement clair que nous devions choisir un choix aléatoire 1-5 fois. Au lieu de choisir un choix aléatoire répété 1 à 5 fois (comme le fait actuellement la réponse Gaia).
Kevin Cruijssen
3
@KevinCruijssen Merci, Votre explication correspond à l'exemple et est claire. Le PO devrait confirmer et modifier cela dans le texte
Luis Mendo

Réponses:

6

Gaia , 25 octets

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

Essayez-le en ligne!

Merci à Kevin Cruijssen d' avoir signalé 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

Notez que 4ṛc'est parce que est implémenté pour un entier zcomme python random.randint(1,z+1), qui retourne un entier Ntel que 1<=N<=z+1.

Giuseppe
la source
Etes-vous sûr que le codage de longueur est correct ici? Si je comprends bien le défi: les quatre options doivent être choisies 1 à 5 fois au hasard, au lieu de choisir l'une des quatre au hasard, répétées 1 à 5 fois. Le premier exemple de sortie SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) semble refléter cela, et n'est actuellement pas une sortie possible dans votre programme (je pense).
Kevin Cruijssen
@KevinCruijssen J'ai interprété "sortie de la liste un nombre aléatoire de fois" pour signifier un décodage de longueur, mais vous avez raison, les cas de test semblent indiquer l'autre interprétation; Je pense que cela devrait être assez facile à corriger
Giuseppe
1
5ṛpeut entraîner 6pour une raison quelconque Essayez-le en ligne ? PS: N'y a-t-il pas un entier à la liste à distance, ou une boucle à distance à Gaia?
Kevin Cruijssen
1
@KevinCruijssen dang, Business Cat a vraiment besoin de corriger les erreurs ponctuelles ... Je pensais vraiment qu'il y avait une forconstruction de type, mais je suis presque sûr que ce n'est même pas documenté sur la page wiki.
Giuseppe
4

APL (dzaima / APL) , 23 octets

Fonction de préfixe tacite anonyme.

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

Essayez-le en ligne!

2()/ Appliquer la fonction tacite d'infixe suivante entre chaque paire de caractères:

- le boîtier
 de commutation de
, la concaténation de la paire

,, ajouter la concaténation de la paire à celle

{}⊇ Choisissez parmi les éléments suivants:

  ?5 nombre aléatoire dans la plage 1… 5

  4⍴⍨ autant de quatre

  ? indices aléatoires pour ceux

ϵ nlist (aplatir)

Adam
la source
3

Perl 6 , 60 octets

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

Essayez-le en ligne!

La partie minuscule / majuscule est un peu ennuyeuse.

Jo King
la source
Je ne connais pas Perl, donc je dis probablement quelque chose de stupide ici. Mais est-il possible de concaténer le $/et $0ensemble et de l'utiliser .lcsur cette chaîne, puis de créer une copie de cette chaîne et de l'utiliser .uc, et de concaténer ces deux ensemble? Je ne sais pas si cela est même possible, ou plus court que votre position actuelle $/.lc,$/.uc,$0.lc,$0.uc, mais cela signifierait que vous utiliseriez $/, $0, .lcet .ucune fois chacun.
Kevin Cruijssen
1
Hélas, (.lc~.uc for $0~$/).combc'est plus long. Perl 6 veut vraiment distinguer les chaînes et les listes, donc "abc"[0] eq "abc"(il prétend être une liste à un seul élément).
Ven
Vous pouvez le faire en glissant et en appliquant une fonction anonyme à une liste: {.lc,|.uc}($/,|$0)pour -5 octets, et en utilisant simplement la liste des correspondances {.lc,|.uc}(@$/)pour -8 octets. tio.run/…
Phil H
@PhilH Non, cela ne fonctionne pas. Ces solutions ne mettent chacune en majuscule
Jo King
3

Bash , 121 octets

-20 octets grâce à Nahuel

-9 octets grâce à 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"
}

Essayez-le en ligne!

Réponse originale

Bash , 150 octets

J'ai fait très peu de coups de golf et essayé d'améliorer ma bash, donc tout commentaire est le bienvenu.

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

Essayez-le en ligne!

Le code est une boucle simple à travers les caractères définissant le caractère actuel cet suivant n, puis créant un tableau des 4 possibilités, répétant l'une d'entre elles pour en avoir exactement 5. Ensuite, nous mélangeons ce tableau, puis choisissons n éléments, où n lui-même est aléatoire entre 1 et 5.

Jonas
la source
semble qu'il manqueprintf %s "$c"
Nahuel Fouilleul
1
doet donepeut être remplacé par non documenté {et}
Nahuel Fouilleul
avec quelques changements
Nahuel Fouilleul
1
@roblogic c'est intelligent. tyvm.
Jonah
1
La solution de 121 octets est un peu fragile / boguée, voici une version plus robuste (133 octets) qui devrait gérer tous les ASCII imprimables, tio.run
roblogic
2

Python 2 , 107 octets

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

Essayez-le en ligne!

Chas Brown
la source
2

05AB1E , 18 17 octets

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

Inspiré par la réponse Gaia de @Giuseppe .
-1 octet grâce à @Shaggy .

Essayez-le en ligne 10 fois ou vérifiez tous les cas de test 10 fois .

Explication:

ü)             # 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
la source
Je ne sais pas 05AB1E mais, au lieu de INè, pourriez-vous enregistrer quelque chose en appuyant sur le premier caractère de y?
Shaggy
@Shaggy Oui, je peux en effet .. Merci! Peut-être que je devrais arrêter de jouer au golf pour aujourd'hui, je suis un bordel, lol ..
Kevin Cruijssen
Tu es un bordel? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Magic Octopus Urn
1
@MagicOctopusUrn Bien qu'une approche assez originale, je crains que cela ne fait pas le premier point du défi ( « Sortie le caractère actuel. »), Puisque le résultat peut commencer t, Tou spour l' entrée "String"dans votre programme, alors que il est censé toujours commencer par le S.
Kevin Cruijssen
1

Fusain , 27 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

FLθ«

Faites une boucle sur tous les indices de la chaîne d'entrée.

F∧ι⊕‽⁵

Sauf pour le premier index, boucle sur un nombre aléatoire de 1 à 5 inclus ...

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

... extraire les caractères précédent et suivant de la chaîne, prendre les versions majuscules et minuscules et choisir un caractère aléatoire des quatre.

§θι

Imprime le caractère à l'index actuel.

Neil
la source
1

perl 5 ( -p), 77 octets

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

TIO

Nahuel Fouilleul
la source
Vous pouvez enregistrer 4 octets en utilisant $&au lieu de $1, et chop+ -lau lieu des/.$//
Dada
1

Japt -P , 14 octets

äÈ+Zu pv ö5ö Ä

Essayez-le

äÈ+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
Hirsute
la source
1

Python 3 , 167 octets

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

Essayez-le en ligne!

Sara J
la source
1

Gelée , 14 octets

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

Essayez-le en ligne!

Explication

             Ɲ | 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
la source
1

C (GCC) 175 162 octets

-12 octets 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;}

Essayez-le en ligne

rtpax
la source
Je ne pense pas que vous ayez besoin 0de la première ligne.
LambdaBeta
Peut également économiser beaucoup de caractères en prenant le tampon Scomme paramètre et en ajoutant vos variables à la liste des arguments: Essayez-le en ligne!
LambdaBeta du
@LambdaBeta s'avère que vous avez raison sur le 0, ce qui ne valait pas la peine d'en avoir #defineplus
rtpax
150 octets
plafondcat
1

PowerShell , 154 105 103 103 95 87 octets

-67 octets grâce à mazzy qui ne peut pas être arrêté

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

Essayez-le en ligne!

Pas une méthode fantastique mais ça marche. Maintenant c'est plutôt bien. Prend entrée via splatting

Veskah
la source
Oh, wow, c'est beaucoup d'octets.
MilkyWay90
1
@mazzy Dang dog. Je dois prendre l'habitude d'éclabousser tout le temps, mais je ne savais pas que vous pouviez échanger les membres génériques comme ça.
Veskah
1
Je suis désolé 87 octets
mazzy
0

Scala 2.12.8, 214 octets

Version golfée:

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)

Golfé avec des nouvelles lignes et des retraits:

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)

Non 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
la source
1
Pas moyen de a :: b :: Nildevenir a::b::Nil? Idem pour a :+, a:+()ou a.:+()pourrait fonctionner
Ven
@Ven a::b::Nilprovoque une erreur de compilation. +:est une méthode définie dans la liste, donc elle pourrait économiser de l'espace en se débarrassant des parens externes?
Soren
Vous n'avez qu'un seul elem ici, donc ce n'est pas l'auto-échantillonnage de toute façon
Ven
0

C # (Visual C # Interactive Compiler) , 236 213 209 octets

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

Essayez-le en ligne!

Données expirées
la source
Ne fonctionne pas avec des caractères non alphanumériques. char b=a[0]-> var b=a[0], espace supplémentaire dans la déclaration de la dboucle for
Embodiment of Ignorance
0

Requête T-SQL, 286 octets

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)

Essayez-le en ligne, malheureusement, la version en ligne affiche toujours le même résultat pour le même varchar, contrairement à MS SQL Server Management Studio

t-clausen.dk
la source
0

Japt -P , 43 16 octets

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

Raccourci de beaucoup maintenant!

Essayez-le

Incarnation de l'ignorance
la source
Cela semble retourner le même résultat à chaque fois.
Shaggy
@Shaggy va corriger. De plus, äla description de 's donne trois arguments, le dernier étant x+y. Mais comme vous pouvez le voir ici , il retourne juste 1. Est-ce un bug?
Incarnation de l'ignorance
0

C (gcc) , 110 109 octets

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

Essayez-le en ligne!

-1 grâce au plafond

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
}

Le nombre de caractères imprimés (par caractère saisi) n'est pas uniformément aléatoire:

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
la source
0

Zsh, 113 107 bytes

Avec beaucoup d'aide de man zshexpnet man zshparam. Essayez-le en ligne!

  • -6 par moi, peaufinage
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
la source