ssTTsSTtRrriinInnnnNNNIiinngg


18

Meydan okuma

Dizenin sonuncusu hariç her karakteri için aşağıdakileri yapın:

  • Geçerli karakteri çıktılar.

  • Ardından, aşağıdaki listeden 1 - 5 (dahil) arasında rasgele sayıda çıktı rastgele verilir:

    • Mevcut karakter
    • Dizenin sonraki karakteri
    • Şu anda bulunduğunuz karakterin anahtar kutusu sürümü
    • Dizenin bir sonraki karakterinin anahtar kutusu sürümü.

Test Durumları

String -> SSSTSStrTrIiinIIngn

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

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

notlar

  • Bir karakterin anahtar kutusu sürümünü yalnızca karakter alfabenin bir parçasıysa (AZ ve az) uygulamanız gerekir.
  • Rastgele işlevinizin aynı olması gerekmez, ancak yine de verilen listedeki herhangi bir öğeyi döndürme şansına sahip olması gerekir.
  • Herhangi bir standart G / Ç biçimini kullanmanıza izin verilir.
  • Giriş uzunluğunun ikiden büyük veya ona eşit olduğunu varsayabilirsiniz.
  • Girişin yalnızca ASCII karakterlerden oluştuğunu varsayabilirsiniz.
  • Başlık bir test senaryosu değildir (geçerli bir test senaryosu olması istenmez).
  • Şalter, büyük harf ise karakteri küçük harfe, küçük harf ise büyük harfe çevirmek anlamına gelir.

'... tekdüze olması gerekmez' 'e ek olarak, muhtemelen bazı girdiler verildiğinde, tüm sonlu yasal çıktıların prensipte (aksi takdirde, tekdüze olmayan rasgele tam sayımı [1] , 2,3,4,5] her zaman 2 olacak ve ben sadece orijinal dize çıktı).
Chas Brown

@ChasBrown Evet, soruyu düzenleyeceğim
MilkyWay90

2
Şartnameyi kafa karıştırıcı buluyorum. Daha açık olabilir misin? Örneğin, nasıl Stringürettiğini öğreninSSSTSStrTrIiinIIngn
Luis Mendo

7
@LuisMendo Ben OP değilim, ama bence: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnbloklar arasındaki karakterler ilk kurşun noktalarıdır (" Mevcut karakteri çıkar ") ve diğer karakterler bunun için dört seçenekten rastgele 1-5 kattadır karakter. Ancak katılıyorum, bazı daha açık açıklamalar uygun olacaktır. Test durumundan ayrı olarak 1-5 kez rastgele bir seçim seçmemiz gerektiği belli değildi. Rastgele bir seçim seçmek yerine 1-5 kez tekrarlandı (Gaia cevabının şu anda yaptığı gibi).
Kevin Cruijssen

3
@KevinCruijssen Teşekkürler, Açıklamanız örneğe uyuyor ve açık. OP bunu metinde onaylamalı ve düzenlemelidir
Luis Mendo

Yanıtlar:


6

Gaia , 25 bayt

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

Çevrimiçi deneyin!

Kevin Cruijssen'e 2 hata işaret ettiği için teşekkürler !

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

Not 4ṛçünkü bir tamsayı için uygulanmaktadır zpiton en olarak random.randint(1,z+1)tamsayı bir döndüren, Nöyle ki 1<=N<=z+1.


Çalışma uzunluğu kodlamasının burada doğru olduğundan emin misiniz? Eğer meydan okumayı doğru anlarsam: dört seçenek rastgele dört kez 1-5 kez tekrarlanan yerine, 1-5 kez rastgele seçilmelidir. İlk örnek output SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) bunu yansıtıyor gibi görünüyor ve şu anda programınızda olası bir çıktı değil (sanırım).
Kevin Cruijssen

@KevinCruijssen "listeden çıktıyı rastgele sayıda" olarak yorumladım, çalışma uzunluğu kod çözme anlamına gelse de, haklısınız, test senaryoları diğer yorumu gösteriyor gibi görünüyor; Bence düzeltmesi oldukça kolay olmalı
Giuseppe

1
5ṛ6bazı nedenlerle sonuçlanabilir Çevrimiçi deneyin ? Not: Gaia'da aralıklı veya tam döngü için tamsayı yok mu?
Kevin Cruijssen

1
@KevinCruijssen dang, Business Cat'in tek tek hataları düzeltmesi gerekiyor ... Gerçekten bir fortür yapı olduğunu düşündüm , ancak wiki sayfasında belgelenmemiş olduğundan eminim .
Giuseppe

4

APL (dzaima / APL) , 23 bayt

Anonim zımni önek fonksiyonu.

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

Çevrimiçi deneyin!

2()/ Her karakter çifti arasına aşağıdaki infix tacit işlevini uygulayın:

- switchcase
 bir
, çift birleştirme

,, çifti birleştirmeyi başa

{}⊇ Aşağıdaki unsurları seçin:

  ?5 1… 5 aralığında rastgele sayı

  4⍴⍨ bu dört ayak

  ? bunlar için rastgele endeksler

ϵ nlist (düzleştir)


3

Perl 6 , 60 bayt

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

Çevrimiçi deneyin!

Küçük harf / büyük harf biraz sinir bozucudur.


Perl'i tanımıyorum, bu yüzden muhtemelen burada aptalca bir şey söylüyorum. Ancak bir şekilde $/ve $0birlikte bitirip .lcbu dizede kullanmak ve sonra bu dizenin bir kopyasını oluşturmak ve kullanmak .ucve bu ikisini birlikte bitirmek mümkün mü? Değil emin bile mümkün veya akım daha kısa ise $/.lc,$/.uc,$0.lc,$0.uc, ancak kullanmak istiyorum anlamına geleceğini $/, $0, .lcve .ucbirer kez.
Kevin Cruijssen

1
Ne yazık ki, (.lc~.uc for $0~$/).combdaha uzun. Perl 6 gerçekten dizeleri ve listeleri ayırt etmek istiyor, bu yüzden "abc"[0] eq "abc"(tek öğe listesi gibi görünüyor).
Ven

Kaydırarak ve bir listeye uygulanan anonim bir işlevi kullanarak yapabilirsiniz: {.lc,|.uc}($/,|$0)-5 bayt için ve sadece {.lc,|.uc}(@$/)-8 bayt için eşleşme listesini kullanın . tio.run/…
Phil H

@PhilH Hayır, bu işe yaramıyor. Bu çözümler her biri
Jo King


3

Bash , 121 bayt

Nahuel sayesinde -20 bayt

Roblogic sayesinde -9 bayt

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

Çevrimiçi deneyin!

Orijinal cevap

Bash , 150 bayt

Çok az golf dayak yaptım ve benim bash geliştirmek için çalışıyoruz, bu yüzden herhangi bir yorum hoş geldiniz.

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

Çevrimiçi deneyin!

Kod, geçerli cve sonraki karakteri ayarlayan karakterlerle basit bir döngüdür n, daha sonra 4 olasılıktan oluşan bir dizi oluşturur, bunlardan birini tekrarlar, böylece tam olarak 5 vardır. Sonra bu diziyi karıştırırız ve n'den rastgele olduğu n öğelerini seçeriz. 1 ve 5.


eksik gibi görünüyorprintf %s "$c"
Nahuel Fouilleul

1
dove donebelgesiz ile değiştirilebilir {ve}
Nahuel Fouilleul


1
@roblogic bu zekice. tyvm.
Jonah

1
121 bayt çözüm burada işlemesi gereken daha sağlam (133 bayt) versiyonu, biraz kırılgan / arabası olan tüm yazdırılabilir ASCII, tio.run
roblogic


2

05AB1E , 18 17 bayt

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

Esinlenerek @Giuseppe 'ın Gaia cevap . @Shaggy
sayesinde -1 bayt .

Çevrimiçi olarak 10 kez deneyin veya tüm test durumlarını 10 kez doğrulayın .

Açıklama:

ü)             # 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)

05AB1E bilmiyorum ama bunun yerine INè, ilk karakterini iterek bir şey kaydedebilir misiniz y?
Shaggy

@Shaggy Evet, gerçekten yapabilirim .. Teşekkürler! Belki bugün için golf durdurmak gerekir, ben bir karmaşa, lol ..
Kevin Cruijssen

Sen dağınık mısın? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Sihirli Ahtapot Urn

1
@MagicOctopusUrn oldukça özgün bir yaklaşım olsa da, ben meydan ilk kurşun noktasını yapmaz korkuyorum ( " Çıkış akımı karakteri. "), Sonuç ile başlayabilir çünkü t, Tya da sgiriş için "String"programınızda iken her zaman ile başlaması gerekiyordu S.
Kevin Cruijssen

1

Kömür , 27 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

FLθ«

Giriş dizesinin tüm dizinlerini döngüye sokun.

F∧ι⊕‽⁵

İlk endeks dışında 1'den 5'e kadar rastgele bir sayının üzerine gelin ...

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

... önceki ve sonraki karakterleri dizeden ayıkla, büyük ve küçük harfli sürümleri al ve dörtten rastgele bir karakter seç.

§θι

Geçerli dizindeki karakteri yazdırın.


1

perl 5 ( -p), 77 bayt

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

TIO


Sen kullanarak 4 bayt kaydedebilir $&yerine $1ve chop+ -lyerines/.$//
Dada

1

Japt -P , 14 bayt

äÈ+Zu pv ö5ö Ä

Dene

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

1

Python 3 , 167 bayt

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

Çevrimiçi deneyin!


1

Jöle , 14 bayt

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

Çevrimiçi deneyin!

açıklama

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

1

C (GCC) 175 162 bayt

LambdaBeta'dan -12 bayt

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

Çevrimiçi deneyin


0İlk satırda ihtiyacın olduğunu düşünmüyorum .
LambdaBeta

Ayrıca arabelleği Sparametre olarak alıp değişkenlerinizi bağımsız değişken listesine ekleyerek çok sayıda karakter kaydedebilirsiniz : Çevrimiçi deneyin!
LambdaBeta

@LambdaBeta artık haklısın 0, ki artık buna değer #definedeğil
rtpax


1

PowerShell , 154 105 103 95 87 bayt

Durdurulamayan mazzy sayesinde -67 bayt

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

Çevrimiçi deneyin!

Harika bir yöntem değil ama işe yarıyor. Şimdi oldukça iyi. Splatting yoluyla girdi alır


Oh, vay be, bu çok fazla bayt.
MilkyWay90

1
@mazzy Dang köpeği. Her zaman splatting alışkanlığına girmeliyim ama böyle joker üyeleri hotswap yapabileceğinizi bilmiyordum.
Veskah

1
Üzgünüm 87 bytes
mazzy

0

Scala 2.12.8, 214 bayt

Golf versiyonu:

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)

Yeni satırlar ve girintilerle golf oynayın:

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()))

1
Çevirmek Hiçbir şekilde a :: b :: Niliçine a::b::Nil? Aynı için a :+, a:+()ya da a.:+()olabilir çalışma
Ven

@ Ven a::b::Nilderleme hatasına neden olur. +:listede tanımlanmış bir yöntemdir, bu yüzden dış parenslerden kurtularak yerden tasarruf sağlayabilir mi?
Soren

Burada sadece bir elem var, bu yüzden zaten autotupling değil
Ven



0

T-SQL sorgusu, 286 bayt

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)

Çevrimiçi deneyin maalesef çevrimiçi sürüm her zaman aynı varchar için aynı sonucu gösterir, MS SQL Server Management Studio'nun aksine




0

C (GCC) , 110 109 bayt

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

Çevrimiçi deneyin!

-1 tavan kedisi sayesinde

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
}

Yazdırılan karakter sayısı (giriş karakteri başına) eşit olarak rastgele değil:

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)

0

Zsh, 113 107 bayt

Ve yardımı man zshexpnileman zshparam . Çevrimiçi deneyin!

  • -6 benim tarafımdan, tweaking
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=;}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.