ssTTsSTtRrriinInnnnNNNIiinngg

18

Wyzwanie

Dla każdego znaku ciągu oprócz ostatniego, wykonaj następujące czynności:

  • Wyjście bieżącego znaku.

  • Następnie losowo wyprowadza z poniższej listy losową liczbę razy od 1 do 5 (włącznie):

    • Obecna postać
    • Następny znak ciągu
    • Wersja postaci, w której aktualnie jesteś
    • Wersja rozdzielająca następnego znaku ciągu.

Przypadki testowe

String -> SSSTSStrTrIiinIIngn

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

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

Uwagi

  • Musisz zastosować wersję przełącznika znaku tylko wtedy, gdy znak jest częścią alfabetu (AZ i az).
  • Twoja losowa funkcja nie musi być jednolita, ale nadal musi mieć szansę na zwrócenie dowolnego elementu z podanej listy.
  • Możesz używać dowolnego standardowego formatu we / wy.
  • Możesz założyć, że długość danych wejściowych jest większa lub równa dwa.
  • Możesz założyć, że dane wejściowe składają się tylko ze znaków ASCII.
  • Tytuł nie jest przypadkiem testowym (jest niezamierzony, jeśli jest to prawidłowy przypadek testowy).
  • „Switchcase” oznacza, że ​​zamieniasz znak na małe litery, jeśli jest to wielkie litery, i zmienisz go na wielkie litery, jeśli jest małe.
MilkyWay90
źródło
Oprócz „... nie musi być jednolity”, myślę, że prawdopodobnie chcesz sprecyzować, że biorąc pod uwagę dane wejściowe, wszystkie skończone legalne dane wyjściowe powinny w zasadzie być możliwe do wygenerowania (w przeciwnym razie moja niejednolita losowa liczba całkowita w [1 , 2,3,4,5] zawsze będzie 2, a ja po prostu wyślę oryginalny ciąg znaków).
Chas Brown
@ChasBrown Tak, zmienię pytanie
MilkyWay90
2
Uważam, że specyfikacja jest myląca. Czy możesz być bardziej wyraźny? Na przykład dowiedz się, jak StringprodukujeSSSTSStrTrIiinIIngn
Luis Mendo
7
@LuisMendo Nie jestem OP, ale myślę: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gngdzie postacie między blokami są pierwszymi punktorami („ Wyjście bieżącego znaku ”), a pozostałe postacie są 1-5 razy losowo jedną z czterech opcji do wyboru postać. Ale zgadzam się, że bardziej precyzyjne wyjaśnienia byłyby odpowiednie. Poza przypadkiem testowym nie było szczególnie jasne, że musimy wybrać losowy wybór 1-5 razy. Zamiast wybierać losowy wybór powtarzany 1-5 razy (jak obecnie robi odpowiedź Gai).
Kevin Cruijssen
3
@KevinCruijssen Dzięki, Twoje wyjaśnienie pasuje do przykładu i jest jasne. OP powinien potwierdzić i edytować to w tekście
Luis Mendo

Odpowiedzi:

6

Gaia , 25 bajtów

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

Wypróbuj online!

Dzięki Kevin Cruijssen za wskazanie 2 błędów!

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

Zauważ, że dzieje się tak, 4ṛponieważ jest zaimplementowany dla liczby całkowitej takiej zjak python random.randint(1,z+1), która zwraca liczbę całkowitą Ntaką, że 1<=N<=z+1.

Giuseppe
źródło
Czy jesteś pewien, że kodowanie długości przebiegu jest tutaj poprawne? Jeśli dobrze rozumiem wyzwanie: cztery opcje należy wybrać losowo 1-5 razy, zamiast losowo wybrać jedną z czterech, powtórzyć 1-5 razy. Pierwszy przykładowy wynik SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) wydaje się to odzwierciedlać i obecnie nie jest możliwym wyjściem w twoim programie (tak myślę).
Kevin Cruijssen
@ KevinCruijssen Zinterpretowałem „wynik z listy losowo kilka razy”, co oznacza dekodowanie długości przebiegu, ale masz rację, przypadki testowe wydają się wskazywać na inną interpretację; Myślę, że powinno to być dość łatwe do naprawienia
Giuseppe
1
5ṛmoże wynikać 6z jakiegoś powodu Wypróbuj online ? PS: Czy nie ma liczb całkowitych do listy dystansowej, czy też dla Gai dla pętli dystansowej?
Kevin Cruijssen
1
@ KevinCruijssen dang, Business Cat naprawdę musi naprawiać błędy jeden po drugim ... Naprawdę myślałem, że istnieje forkonstrukcja typu, ale jestem prawie pewien, że nie jest to nawet udokumentowane na stronie wiki.
Giuseppe
4

APL (dzaima / APL) , 23 bajty

Anonimowa ukryta funkcja prefiksu.

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

Wypróbuj online!

2()/ Zastosuj następującą ukrytą funkcję dla każdej pary znaków:

- switchcase
 z
, konkatenacji pary

,, przygotuj konkatenację pary do tego

{… Wybierz z }⊇ tego następujące elementy:

  ?5 liczba losowa w zakresie 1… 5

  4⍴⍨ tyle czwórek

  ? losowe wskaźniki dla nich

ε nlist (spłaszczyć)

Adám
źródło
3

Perl 6 , 60 bajtów

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

Wypróbuj online!

Mała / duża część jest dość denerwująca.

Jo King
źródło
Nie znam Perla, więc prawdopodobnie mówię tutaj coś głupiego. Ale czy w jakiś sposób można połączyć $/i $0połączyć i użyć .lcna tym ciągu, a następnie utworzyć kopię tego ciągu i użyć .uci połączyć te dwa razem? Nie jestem pewien, czy to w ogóle możliwe, czy krótszy niż dotychczasowe $/.lc,$/.uc,$0.lc,$0.uc, ale oznaczałoby to byłoby użyć $/, $0, .lc, i .ucpo każdej z nich.
Kevin Cruijssen
1
Niestety, (.lc~.uc for $0~$/).combjest dłuższy. Perl 6 naprawdę chce rozróżniać ciągi i listy, więc "abc"[0] eq "abc"(udaje, że jest listą pojedynczego elementu).
Ven
Możesz to zrobić przez przesunięcie i anonimową funkcję zastosowaną do listy: {.lc,|.uc}($/,|$0)dla -5 bajtów, i po prostu użyj listy dopasowań {.lc,|.uc}(@$/)dla -8 bajtów. tio.run/…
Phil H
@PhilH Nie, to nie działa. Te rozwiązania wykorzystują tylko jedną literę
Jo King
3

Bash , 121 bajtów

-20 bajtów dzięki Nahuelowi

-9 bajtów dzięki 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"
}

Wypróbuj online!

Oryginalna odpowiedź

Bash , 150 bajtów

Zrobiłem bardzo mało uderzeń w golfa i próbuję poprawić swój bash, więc wszelkie komentarze są mile widziane.

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

Wypróbuj online!

Kod jest prostą pętlą przez znaki ustawiające bieżący ci następny nznak, a następnie tworząc tablicę 4 możliwości, powtarzając jedną z nich, tak aby było dokładnie 5. Następnie przetasowujemy tę tablicę, a następnie wybieramy n elementów z niej, gdzie n jest losowe między 1 i 5.

Jonasz
źródło
wygląda na to, że go brakujeprintf %s "$c"
Nahuel Fouilleul
1
doi donemożna je zastąpić dokumentem nieudokumentowanym {i}
Nahuel Fouilleul
z pewnymi zmianami
Nahuel Fouilleul
1
@roblogic, który jest sprytny. tyvm.
Jonasz
1
121-bajtowe rozwiązanie jest nieco kruche / błędne, oto bardziej niezawodna (133-bajtowa) wersja, która powinna obsługiwać wszystkie ASCII do wydruku, tio.run
roblogic
2

Python 2 , 107 bajtów

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

Wypróbuj online!

Chas Brown
źródło
2

05AB1E , 18 17 bajtów

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

Zainspirowany odpowiedzią Gaia @Giuseppe .
-1 bajt dzięki @Shaggy .

Wypróbuj online 10 razy lub sprawdź wszystkie przypadki testowe 10 razy .

Wyjaśnienie:

ü)             # 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
źródło
Nie znam 05AB1E, ale INèczy mógłbyś cokolwiek uratować, popychając pierwszą postać y?
Kudłaty
@Shaggy Tak, naprawdę mogę .. Dzięki! Może powinienem przestać grać w golfa na dziś, jestem bałaganem, lol ..
Kevin Cruijssen
Jesteś bałaganem? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Urna Magicznej Ośmiornicy
1
@MagicOctopusUrn Mimo dość oryginalne podejście, obawiam się, że nie robi pierwszy podpunkt wyzwania ( „ Wyjście prądu znaków. ”), Ponieważ wynik może zacząć t, Talbo sdo wejścia "String"w programie, natomiast powinno zawsze zaczynać się od S.
Kevin Cruijssen
1

Węgiel drzewny , 27 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

FLθ«

Pętla nad wszystkimi indeksami ciągu wejściowego.

F∧ι⊕‽⁵

Z wyjątkiem pierwszego indeksu, zapętlaj losową liczbę od 1 do 5 włącznie ...

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

... wyodrębnij poprzednie i następne znaki z ciągu, weź małe i duże wersje i wybierz losowy znak z czterech.

§θι

Wydrukuj znak przy bieżącym indeksie.

Neil
źródło
1

perl 5 ( -p), 77 bajtów

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

TIO

Nahuel Fouilleul
źródło
Możesz zapisać 4 bajty, używając $&zamiast $1i chop+ -lzamiasts/.$//
Dada
1

Japt -P , 14 bajtów

äÈ+Zu pv ö5ö Ä

Spróbuj

äÈ+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
Kudłaty
źródło
1

Python 3 , 167 bajtów

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

Wypróbuj online!

Sara J.
źródło
1

Galaretka , 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

             Ɲ | 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
źródło
1

C (GCC) 175 162 bajtów

-12 bajtów z 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;}

Wypróbuj online

rtpax
źródło
Nie sądzę, że potrzebujesz 0pierwszej linii.
LambdaBeta
Można również zapisać wiele znaków, biorąc bufor Sjako parametr i dodając zmienne do listy argumentów: Wypróbuj online!
LambdaBeta
@LambdaBeta okazuje masz rację o 0, co sprawiło, że nie warto mieć #defineanymore
rtpax
150 bajtów
pułapkap
1

PowerShell , 154 105 103 95 87 bajtów

-67 bajtów dzięki mazzy, którego nie można zatrzymać

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

Wypróbuj online!

Nie jest to fantastyczna metoda, ale działa. Teraz jest całkiem dobrze. Pobiera dane wejściowe przez rozpryskiwanie

Veskah
źródło
Och, wow, to dużo bajtów.
MilkyWay90
1
@mazzy Dang dog. Muszę cały czas przyzwyczaić się do bryzgania, ale nie wiedziałem, że można tak wymieniać członków symboli wieloznacznych.
Veskah
1
Przepraszam 87 bajtów
mazzy
0

Scala 2.12.8, 214 bajtów

Wersja golfowa:

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)

Gra w golfa z nowymi liniami i wcięciami:

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)

Nie golfowany:

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
źródło
1
Nie możesz a :: b :: Nilsię zmienić a::b::Nil? Sam dla a :+, a:+()lub a.:+()może działać
Ven
@Ven a::b::Nilpowoduje błąd kompilacji. +:jest metodą zdefiniowaną na liście, więc może zaoszczędzić miejsce, pozbywając się zewnętrznych parens?
Soren
Masz tylko jeden element, więc i tak nie jest to automatyczne uzupełnianie
Ven
0

Perl 5 -n , 61 bajtów

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

Wypróbuj online!

Dada
źródło
0

C # (interaktywny kompilator Visual C #) , 236 213 209 bajtów

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

Wypróbuj online!

Wygasły dane
źródło
Nie działa ze znakami niealfanumerycznymi. char b=a[0]-> var b=a[0], dodatkowe miejsce w deklaracji dw pętli for
Embodiment of Ignorance
0

Zapytanie T-SQL, 286 bajtów

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)

Wypróbuj online niestety wersja online zawsze pokazuje ten sam wynik dla tego samego varchara, w przeciwieństwie do MS SQL Server Management Studio

t-clausen.dk
źródło
0

Japt -P , 43 16 bajtów

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

Teraz znacznie skrócony!

Spróbuj

Wcielenie ignorancji
źródło
To wydaje się zwracać ten sam wynik za każdym razem.
Kudłaty
@Shaggy naprawi. Ponadto w äopisie podano trzy argumenty, przy czym ostatni z nich x+y. Ale jak widać tutaj , zwraca tylko 1. Czy to błąd?
Wcielenie nieznajomości
0

C (gcc) , 110 109 bajtów

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

Wypróbuj online!

-1 dzięki pułapkowi cat

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
}

Liczba drukowanych znaków (na znak wejściowy) nie jest jednolicie losowa:

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
źródło
0

Zsh, 113 107 bajtów

Z dużą pomocą man zshexpni man zshparam. Wypróbuj online!

  • -6 przeze mnie, poprawianie
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
źródło