ssTTsSTtRrriinInnnnNNNIIinninngg


18

Tantangan

Untuk setiap karakter string kecuali yang terakhir, lakukan hal berikut:

  • Keluarkan karakter saat ini.

  • Diikuti dengan mengeluarkan secara acak dari daftar berikut, beberapa kali antara 1 - 5 (inklusif):

    • Karakter saat ini
    • Karakter selanjutnya dari string
    • Versi switchcase dari karakter yang Anda gunakan saat ini
    • Versi switchcase dari karakter selanjutnya dari string.

Uji Kasus

String -> SSSTSStrTrIiinIIngn

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

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

Catatan

  • Anda hanya perlu menerapkan versi switchcase karakter jika karakter tersebut merupakan bagian dari alfabet (AZ dan az).
  • Fungsi acak Anda tidak perlu seragam tetapi masih harus memiliki kesempatan untuk mengembalikan elemen apa pun dalam daftar yang diberikan.
  • Anda diizinkan untuk menggunakan format I / O standar apa pun.
  • Anda dapat mengasumsikan bahwa panjang input lebih besar atau sama dengan dua.
  • Anda dapat berasumsi bahwa input hanya terdiri dari karakter ASCII.
  • Judul bukan merupakan test case (tidak disengaja jika ini adalah test case yang valid).
  • Switchcase artinya mengubah char menjadi huruf kecil jika huruf besar dan mengubahnya menjadi huruf besar jika huruf kecil.

Selain '... tidak perlu seragam', saya pikir Anda mungkin ingin menentukan bahwa dengan memberikan beberapa masukan, semua hasil hukum yang terbatas pada prinsipnya harus dimungkinkan untuk dihasilkan (jika tidak, bilangan bulat acak non-seragam saya di [1 , 2,3,4,5] selalu akan menjadi 2, dan saya hanya akan menampilkan string asli).
Chas Brown

@ ChasBrown Ya, saya akan mengedit pertanyaan
MilkyWay90

2
Saya menemukan spesifikasi yang membingungkan. Bisakah Anda lebih eksplisit? Misalnya, cari tahu cara StringmenghasilkanSSSTSStrTrIiinIIngn
Luis Mendo

7
@LuisMendo Saya bukan OP, tapi saya pikir:, di [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnmana karakter di antara blok adalah poin-poin pertama (" Keluarkan karakter saat ini "), dan karakter lainnya adalah 1-5 kali secara acak, satu dari empat pilihan untuk itu karakter. Tetapi saya setuju, beberapa penjelasan yang lebih eksplisit akan sesuai. Terlepas dari uji kasus itu tidak terlalu jelas kita harus memilih pilihan acak 1-5 kali. Alih-alih memilih pilihan acak yang diulang 1-5 kali (seperti jawaban Gaia saat ini).
Kevin Cruijssen

3
@KevinCruijssen Terima kasih, Penjelasan Anda sesuai dengan contoh, dan jelas. OP harus mengkonfirmasi dan mengeditnya ke dalam teks
Luis Mendo

Jawaban:


6

Gaia , 25 byte

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

Cobalah online!

Terima kasih kepada Kevin Cruijssen karena menunjukkan 2 bug!

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

Perhatikan bahwa 4ṛini karena diimplementasikan untuk integer zsebagai python random.randint(1,z+1), yang mengembalikan integer Nsedemikian rupa 1<=N<=z+1.


Apakah Anda yakin encode run-length sudah benar di sini? Jika saya memahami tantangan dengan benar: empat opsi harus dipilih 1-5 kali secara acak, alih-alih memilih satu dari empat secara acak, diulangi 1-5 kali. Contoh output pertama SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) tampaknya mencerminkan hal ini, dan saat ini bukan output yang mungkin dalam program Anda (saya pikir).
Kevin Cruijssen

@KevinCruijssen Saya menafsirkan "output dari daftar beberapa kali secara acak" berarti run-length decode, tetapi Anda benar, kasus uji tampaknya menunjukkan interpretasi lain; Saya pikir itu harus cukup mudah untuk diperbaiki
Giuseppe

1
5ṛdapat mengakibatkan 6beberapa alasan Cobalah online ? PS: Apakah tidak ada bilangan bulat untuk daftar rentang, atau berkisar untuk loop di Gaia?
Kevin Cruijssen

1
@KevinCruijssen dang, Business Cat benar-benar perlu memperbaiki kesalahan satu per satu ... Saya benar-benar berpikir ada forjenis konstruk, tapi saya cukup yakin itu yang bahkan tidak didokumentasikan pada halaman wiki.
Giuseppe

4

APL (dzaima / APL) , 23 byte

Fungsi awalan diam-diam anonim.

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

Cobalah online!

2(... )/ terapkan fungsi infiks diam-diam berikut antara setiap pasangan karakter:

- switchcase
 dari
, gabungan pasangan

,, pertahankan pasangan untuk itu

{... }⊇ pilih elemen berikut dari itu:

  ?5 angka acak dalam kisaran 1 ... 5

  4⍴⍨ merangkak sebanyak itu

  ? indeks acak untuk itu

ϵ daftar (ratakan)


3

Perl 6 , 60 byte

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

Cobalah online!

Bagian huruf kecil / huruf besar agak mengganggu.


Saya tidak tahu Perl, jadi saya mungkin mengatakan sesuatu yang bodoh di sini. Tapi entah bagaimana mungkin untuk concat yang $/dan $0bersama-sama dan penggunaan .lcdari string, dan kemudian membuat salinan string dan penggunaan .uc, dan concat dua bersama-sama? Tidak yakin apakah itu bahkan mungkin, atau lebih pendek dari Anda saat ini $/.lc,$/.uc,$0.lc,$0.uc, tapi itu berarti Anda akan menggunakan $/, $0, .lc, dan .ucsekali setiap.
Kevin Cruijssen

1
Sayangnya, (.lc~.uc for $0~$/).comblebih lama. Perl 6 benar-benar ingin membedakan string dan daftar, jadi "abc"[0] eq "abc"(itu berpura-pura menjadi daftar item tunggal).
Ven

Anda dapat melakukannya dengan menyelipkan dan fungsi anonim diterapkan ke daftar: {.lc,|.uc}($/,|$0)untuk -5 byte, dan cukup gunakan daftar kecocokan {.lc,|.uc}(@$/)untuk -8 byte. tio.run/…
Phil H

@ Philip Tidak, itu tidak berhasil. Solusi-solusi itu hanya menggunakan satu huruf dari masing
Jo King


3

Bash , 121 byte

-20 byte terima kasih kepada Nahuel

-9 byte berkat 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"
}

Cobalah online!

Jawaban asli

Bash , 150 byte

Telah melakukan bashing golf yang sangat sedikit dan mencoba meningkatkan bash saya, jadi ada komentar yang menyambut.

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

Cobalah online!

Kode adalah loop langsung melalui karakter pengaturan karakter saat ini cdan berikutnya n, kemudian membuat array dari 4 kemungkinan, mengulangi salah satunya sehingga ada persis 5. Selanjutnya kita mengocok array itu, dan kemudian memilih n elemen dari itu, di mana n itu sendiri adalah acak antara 1 dan 5.


sepertinya itu hilangprintf %s "$c"
Nahuel Fouilleul

1
dodan donedapat diganti dengan tidak berdokumen {dan}
Nahuel Fouilleul


1
@roblogic itu pintar. tyvm.
Jonah

1
Solusi 121-byte agak rapuh / bermasalah, inilah versi yang lebih kuat (133-byte) yang harus menangani semua ASCII yang dapat dicetak, tio.run
roblogic


2

05AB1E , 18 17 byte

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

Terinspirasi oleh jawaban Gaia dari @Giuseppe .
-1 byte terima kasih kepada @Shaggy .

Cobalah secara online 10 kali atau verifikasi semua kasus uji 10 kali .

Penjelasan:

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

Saya tidak tahu 05AB1E tetapi, alih-alih INè, dapatkah Anda menyimpan sesuatu dengan mendorong karakter pertama y?
Shaggy

@Shaggy Ya, saya memang bisa .. Terima kasih! Mungkin saya harus berhenti bermain golf untuk hari ini, saya berantakan, lol ..
Kevin Cruijssen

Anda berantakan? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Guci Gurita Ajaib

1
@MagicOctopusUrn Meskipun pendekatan yang cukup asli, aku takut itu tidak melakukan poin-poin pertama dari tantangan ( " Output karakter saat. "), Karena hasilnya bisa mulai dengan t, T, atau suntuk masukan "String"dalam program Anda, sementara seharusnya selalu dimulai dengan S.
Kevin Cruijssen

1

Arang , 27 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

FLθ«

Lingkari semua indeks string input.

F∧ι⊕‽⁵

Kecuali untuk indeks pertama, mengulangi angka acak dari 1 hingga 5 termasuk ...

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

... ekstrak karakter sebelumnya dan berikutnya dari string, ambil versi huruf besar dan kecil, dan pilih karakter acak empat.

§θι

Cetak karakter di indeks saat ini.


1

perl 5 ( -p), 77 byte

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

TIO


Anda dapat menyimpan 4 byte dengan menggunakan $&bukan $1, dan chop+ -lbukannyas/.$//
Dada

1

Japt -P , 14 byte

äÈ+Zu pv ö5ö Ä

Cobalah

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

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

Cobalah online!


1

Jelly , 14 byte

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

Cobalah online!

Penjelasan

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

-12 byte dari 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;}

Cobalah online


Saya tidak berpikir Anda perlu 0di baris pertama.
LambdaBeta

Juga dapat menyimpan banyak karakter dengan mengambil buffer Ssebagai parameter dan menambahkan variabel Anda ke daftar argumen: Coba online!
LambdaBeta

@LambdaBeta ternyata Anda benar tentang itu 0, yang membuatnya tidak layak untuk dimiliki #definelagi
rtpax


1

PowerShell , 154 105 103 95 87 byte

-67 byte berkat mazzy yang tidak bisa dihentikan

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

Cobalah online!

Bukan metode yang fantastis tetapi berhasil. Sekarang cukup bagus. Mengambil input melalui splatting


Oh, wow, itu banyak byte.
MilkyWay90

1
@Mazzy Dang dog. Saya perlu membiasakan melakukan splitting sepanjang waktu tetapi tidak tahu Anda bisa melakukan hotswap anggota wildcard seperti itu.
Veskah

1
Maafkan saya 87 byte
mazzy

0

Scala 2.12.8, 214 byte

Versi golf:

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)

Bermain golf dengan baris dan indentasi baru:

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)

Tidak Disatukan:

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
Tidak ada cara untuk berubah a :: b :: Nilmenjadi a::b::Nil? Sama untuk a :+, a:+()atau a.:+()mungkin bekerja
Ven

@Ven a::b::Nilmenyebabkan kesalahan kompilasi. +:Apakah metode didefinisikan pada daftar, sehingga mungkin menghemat ruang dengan menyingkirkan paren luar?
Soren

Anda hanya memiliki satu elem di sini sehingga tidak autotupling
Ven



0

Permintaan T-SQL, 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)

Coba online, sayangnya versi online selalu menunjukkan hasil yang sama untuk varchar yang sama, tidak seperti MS SQL Server Management Studio



0

Japt -P , 43 16 byte

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

Dipersingkat dengan banyak sekarang!

Cobalah


Ini sepertinya mengembalikan hasil yang sama setiap kali.
Shaggy

@ Shaggy akan memperbaikinya. Juga, ädeskripsi mengatakan itu memberikan tiga argumen, dengan yang terakhir x+y. Tapi seperti yang Anda lihat di sini , itu hanya mengembalikan 1. Apakah ini bug?
Perwujudan Ketidaktahuan

0

C (gcc) , 110 109 byte

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

Cobalah online!

-1 terima kasih kepada 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
}

Jumlah karakter yang dicetak (per karakter input) tidak acak secara acak:

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 byte

Dengan banyak bantuan dari man zshexpndan man zshparam. Cobalah secara Online!

  • -6 oleh saya, tweaker
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=;}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.