ssTTsSTtRrriinInnnnNNNIiinngg

18

Herausforderung

Führen Sie für jedes Zeichen der Zeichenfolge mit Ausnahme des letzten die folgenden Schritte aus:

  • Aktuelles Zeichen ausgeben.

  • Anschließend wird eine zufällige Anzahl von Malen zwischen 1 und 5 (einschließlich) aus der folgenden Liste ausgegeben:

    • Der aktuelle Charakter
    • Das nächste Zeichen der Zeichenfolge
    • Die Switchcase-Version des Charakters, in dem Sie sich gerade befinden
    • Die Switchcase-Version des nächsten Zeichens der Zeichenfolge.

Testfälle

String -> SSSTSStrTrIiinIIngn

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

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

Anmerkungen

  • Sie müssen die Switchcase-Version eines Zeichens nur anwenden, wenn das Zeichen Teil des Alphabets ist (AZ und az).
  • Ihre Zufallsfunktion muss nicht einheitlich sein, muss jedoch die Möglichkeit haben, ein Element in der angegebenen Liste zurückzugeben.
  • Sie dürfen jedes Standard-E / A-Format verwenden.
  • Sie können davon ausgehen, dass die Länge der Eingabe größer oder gleich zwei ist.
  • Sie können davon ausgehen, dass die Eingabe nur aus ASCII-Zeichen besteht.
  • Der Titel ist kein Testfall (es ist unbeabsichtigt, wenn es sich um einen gültigen Testfall handelt).
  • Switchcase bedeutet, das Zeichen in Kleinbuchstaben umzuwandeln, wenn es sich um Großbuchstaben handelt, und in Großbuchstaben umzuwandeln, wenn es sich um Kleinbuchstaben handelt.
MilkyWay90
quelle
Zusätzlich zu "... muss nicht einheitlich sein" möchten Sie wahrscheinlich angeben, dass bei bestimmten Eingaben im Prinzip alle endlichen legalen Ausgaben generiert werden können sollten (andernfalls wird meine uneinheitliche Zufallszahl in [1 , 2,3,4,5] wird immer 2 sein, und ich gebe nur die ursprüngliche Zeichenfolge aus).
Chas Brown
@ChasBrown Ja, ich werde die Frage bearbeiten
MilkyWay90
2
Ich finde die Spezifikation verwirrend. Können Sie präziser sein? Zum Beispiel herausfinden, wie StringproduziertSSSTSStrTrIiinIIngn
Luis Mendo
7
@LuisMendo Ich bin kein OP, aber ich denke:, [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnwo die Zeichen zwischen den Blöcken die ersten Aufzählungspunkte sind (" Aktuelles Zeichen ausgeben "), und die anderen Zeichen sind 1-5 mal zufällig eine der vier Auswahlmöglichkeiten dafür Charakter. Aber ich stimme zu, einige explizitere Erklärungen wären angebracht. Abgesehen vom Testfall war es nicht besonders klar, dass wir 1-5 Mal eine zufällige Auswahl treffen müssen. Anstatt eine zufällige Auswahl zu treffen, wird diese 1-5 Mal wiederholt (wie es die Gaia-Antwort derzeit tut).
Kevin Cruijssen
3
@ KevinCruijssen Danke, deine Erklärung passt zum Beispiel und ist klar. Das OP sollte dies bestätigen und in den Text
einfügen

Antworten:

6

Gaia , 25 Bytes

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

Probieren Sie es online!

Vielen Dank an Kevin Cruijssen für den Hinweis auf 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

Beachten Sie, dass dies so 4ṛist, weil es für eine Ganzzahl zwie python's implementiert ist random.randint(1,z+1), die eine Ganzzahl Nwie folgt zurückgibt 1<=N<=z+1.

Giuseppe
quelle
Sind Sie sicher, dass die Lauflängencodierung hier korrekt ist? Wenn ich die Herausforderung richtig verstehe, sollten die vier Optionen 1-5 mal zufällig ausgewählt werden, anstatt eine der vier zufällig auszuwählen, und 1-5 mal wiederholt werden. Das erste Beispiel output SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) scheint dies widerzuspiegeln, und derzeit ist keine Ausgabe in Ihrem Programm möglich (glaube ich).
Kevin Cruijssen
@ KevinCruijssen Ich interpretierte "Ausgabe von der Liste eine zufällige Anzahl von Malen" als Lauflängendekodierung, aber Sie haben Recht, die Testfälle scheinen die andere Interpretation anzuzeigen. Ich denke, es sollte ziemlich einfach zu beheben sein
Giuseppe
1
5ṛkann 6aus irgendeinem Grund führen Versuchen Sie es online ? PS: Gibt es in Gaia nicht eine Ganzzahl für die Ranging-Liste oder eine Ranging-for-Schleife?
Kevin Cruijssen
1
@KevinCruijssen Mist, Business Cat muss wirklich einzelne Fehler beheben ... Ich dachte wirklich, dass es ein Typkonstrukt gibt for, aber ich bin mir ziemlich sicher, dass es das ist, was nicht einmal auf der Wiki-Seite dokumentiert ist.
Giuseppe
4

APL (Dzaima / APL) , 23 Byte

Anonyme implizite Präfixfunktion.

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

Probieren Sie es online!

2()/ Zwischen jedem Zeichenpaar die folgende implizite Infixfunktion anwenden:

- der Schaltschrankbau
 von
, der Verkettung des Paares

,, stellen Sie dem die Verkettung des Paares voran

{}⊇ Wähle die folgenden Elemente aus:

  ?5 Zufallszahl im Bereich 1… 5

  4⍴⍨ so viele viere

  ? Zufallsindizes für diese

ϵ nlist (Abflachen)

Adam
quelle
3

Perl 6 , 60 Bytes

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

Probieren Sie es online!

Das Klein- / Großschreibungsteil ist irgendwie nervig.

Scherzen
quelle
Ich kenne Perl nicht, also sage ich hier wahrscheinlich etwas Dummes. Aber ist es irgendwie möglich, das $/und $0zusammen zu verbinden und .lcauf diese Zeichenfolge anzuwenden und dann eine Kopie dieser Zeichenfolge zu erstellen und zu verwenden .ucund diese beiden zusammen zu verbinden? Nicht sicher , ob das überhaupt möglich, oder kürzer als die aktuellen $/.lc,$/.uc,$0.lc,$0.uc, aber es würde bedeuten , die Sie verwenden würden $/, $0, .lc, und .ucjeweils einmal.
Kevin Cruijssen
1
Ach, (.lc~.uc for $0~$/).combist länger. Perl 6 möchte wirklich Zeichenfolgen und Listen unterscheiden, also "abc"[0] eq "abc"(es gibt vor, eine Liste mit einzelnen Elementen zu sein).
Ven
Sie können dies tun, indem Sie einen Slip ausführen und eine anonyme Funktion auf eine Liste anwenden: {.lc,|.uc}($/,|$0)für -5 Bytes, und verwenden Sie einfach die Liste der Übereinstimmungen {.lc,|.uc}(@$/)für -8 Bytes. tio.run/…
Phil H
@PhilH Nein, das funktioniert nicht. Bei diesen Lösungen wird nur einer der Buchstaben in Großbuchstaben geschrieben
Jo King,
3

Bash , 121 Bytes

-20 Bytes dank Nahuel

-9 Bytes dank 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"
}

Probieren Sie es online!

Ursprüngliche Antwort

Bash , 150 Bytes

Ich habe nur sehr wenig Golf gespielt und versucht, meinen Bash zu verbessern. Kommentare sind daher willkommen.

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

Probieren Sie es online!

Code ist eine einfache Schleife durch Zeichen, die das aktuelle cund das nächste nZeichen setzt, dann ein Array der 4 Möglichkeiten erstellt und eines davon wiederholt, sodass es genau 5 gibt. Als Nächstes mischen wir dieses Array und wählen dann n Elemente aus, wobei n selbst zufällig ist 1 und 5.

Jona
quelle
scheint es fehltprintf %s "$c"
Nahuel Fouilleul
1
dound donekann mit undokumentiert {und ersetzt werden}
Nahuel Fouilleul
mit einigen Änderungen
Nahuel Fouilleul
1
@roblogic das ist schlau. Tyvm.
Jonah
1
Die 121-Byte-Lösung ist ein bisschen zerbrechlich / fehlerhaft. Hier ist eine robustere (133-Byte) Version, die alle druckbaren ASCII- Dateien
verarbeiten
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*

Probieren Sie es online!

Chas Brown
quelle
2

05AB1E , 18 17 Bytes

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

Inspiriert von @ Giuseppes Gaia-Antwort .
-1 Byte dank @Shaggy .

Versuchen Sie es 10 Mal online oder überprüfen Sie alle Testfälle 10 Mal .

Erläuterung:

ü)             # 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
quelle
Ich kenne 05AB1E nicht, aber können Sie stattdessen INèetwas retten, indem Sie das erste Zeichen von drücken y?
Shaggy
@ Shaggy Ja, ich kann in der Tat .. Danke! Vielleicht sollte ich heute aufhören zu
golfen
Du bist ein Chaos? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Magic Octopus Urn
1
@MagicOctopusUrn Obwohl ein ziemlich origineller Ansatz, ich fürchte , es nicht das erste Aufzählungspunkt der Herausforderung macht ( „ Output das aktuelle Zeichen. “), Da das Ergebnis mit beginnen können t, Toder sfür die Eingabe "String"in Ihrem Programm, während es soll immer mit dem beginnen S.
Kevin Cruijssen
1

Kohle , 27 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

FLθ«

Durchlaufen Sie alle Indizes der Eingabezeichenfolge.

F∧ι⊕‽⁵

Schleifen Sie mit Ausnahme des ersten Index über eine Zufallszahl von 1 bis einschließlich 5 ...

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

... extrahieren Sie die vorherigen und nächsten Zeichen aus der Zeichenfolge, nehmen Sie die Groß- und Kleinschreibung und wählen Sie ein zufälliges Zeichen aus den vier.

§θι

Gibt das Zeichen am aktuellen Index aus.

Neil
quelle
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
quelle
Sie können 4 Bytes sparen, indem Sie $&anstelle von $1und chop+ -lanstelle vons/.$//
Dada
1

Japt -P , 14 Bytes

äÈ+Zu pv ö5ö Ä

Versuch es

äÈ+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
Zottelig
quelle
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

Probieren Sie es online!

Sara J
quelle
1

Jelly , 14 Bytes

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

Probieren Sie es online!

Erläuterung

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

C (GCC) 175 162 Bytes

-12 Bytes von 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;}

Probieren Sie es online aus

rtpax
quelle
Ich glaube nicht, dass du das 0in der ersten Zeile brauchst .
LambdaBeta
Sie können auch viele Zeichen speichern, indem Sie den Puffer Sals Parameter verwenden und Ihre Variablen zur Argumentliste hinzufügen: Probieren Sie es online aus!
LambdaBeta
@LambdaBeta fällt Sie haben Recht , über das 0, was es nicht wert , machte es die haben #definemehr
rtpax
150 Bytes
Ceilingcat
1

PowerShell , 154 105 103 95 87 Byte

-67 Bytes dank mazzy, die nicht gestoppt werden können

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

Probieren Sie es online!

Keine fantastische Methode, aber es funktioniert. Jetzt ist es ziemlich gut. Übernimmt die Eingabe per Splatting

Veskah
quelle
Oh, wow, das sind viele Bytes.
MilkyWay90
1
@ mazzy Dang Hund. Ich muss mich daran gewöhnen, die ganze Zeit zu plätschern, wusste aber nicht, dass man die Wildcard-Mitglieder so austauschen kann.
Veskah
1
Es tut mir leid 87 Bytes
mazzy
0

Scala 2.12.8, 214 Bytes

Golf Version:

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)

Golfen mit Zeilenumbrüchen und Einrückungen:

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
quelle
1
Kein Weg zu machen a :: b :: Nilin a::b::Nil? Das Gleiche gilt für a :+, a:+()oder a.:+()arbeiten könnte
Ven
@Ven a::b::Nilverursacht einen Kompilierungsfehler. +:Ist eine Methode in der Liste definiert, sodass Platz gespart werden kann, wenn die äußeren Parens entfernt werden?
Soren
Sie haben nur nur ein Elem hier so nicht , es autotupling sowieso
Ven
0

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

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

Probieren Sie es online!

Abgelaufene Daten
quelle
Funktioniert nicht mit nicht alphanumerischen Zeichen. char b=a[0]-> var b=a[0]zusätzlicher Platz in der Deklaration der dfor-Schleife
Ausführungsform der Ignoranz
0

T-SQL-Abfrage, 286 Byte

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)

Probieren Sie es online aus, leider zeigt die Online-Version im Gegensatz zu MS SQL Server Management Studio immer das gleiche Ergebnis für den gleichen Varchar

t-clausen.dk
quelle
0

Japt -P , 43 16 Bytes

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

Jetzt viel gekürzt!

Versuch es

Verkörperung der Ignoranz
quelle
Dies scheint jedes Mal das gleiche Ergebnis zu liefern.
Shaggy
@ Shaggy wird behoben. Auch ädie Beschreibung besagt, dass es drei Argumente gibt, wobei das letzte ist x+y. Aber wie Sie hier sehen können , gibt es nur 1 zurück. Ist das ein Fehler?
Verkörperung der Ignoranz
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);}

Probieren Sie es online!

-1 dank 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
}

Die Anzahl der gedruckten Zeichen (pro eingegebenem Zeichen) ist nicht einheitlich zufällig:

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

Zsh, 113 107 Bytes

Mit viel Hilfe von man zshexpnund man zshparam. Probieren Sie es online!

  • -6 von mir, zwicken
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
quelle