ssTTsSTtRrriinInnnnNNNIiinngg


18

Thử thách

Đối với mỗi ký tự của chuỗi ngoại trừ ký tự cuối cùng, hãy làm như sau:

  • Xuất ký tự hiện tại.

  • Tiếp theo là xuất ngẫu nhiên từ danh sách sau đây một số lần ngẫu nhiên trong khoảng từ 1 đến 5 (bao gồm):

    • Nhân vật hiện tại
    • Ký tự tiếp theo của chuỗi
    • Phiên bản tổng đài của nhân vật mà bạn hiện đang ở
    • Phiên bản tổng đài của ký tự tiếp theo của chuỗi.

Các trường hợp thử nghiệm

String -> SSSTSStrTrIiinIIngn

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

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

Ghi chú

  • Bạn chỉ cần áp dụng phiên bản tổng đài của một ký tự nếu ký tự là một phần của bảng chữ cái (AZ và az).
  • Hàm ngẫu nhiên của bạn không cần phải đồng nhất nhưng nó vẫn cần có cơ hội trả về bất kỳ phần tử nào trong danh sách đã cho.
  • Bạn được phép sử dụng bất kỳ định dạng I / O tiêu chuẩn nào.
  • Bạn có thể cho rằng độ dài của đầu vào lớn hơn hoặc bằng hai.
  • Bạn có thể cho rằng đầu vào chỉ bao gồm các ký tự ASCII.
  • Tiêu đề không phải là một trường hợp thử nghiệm (nó là vô ý nếu nó là một trường hợp thử nghiệm hợp lệ).
  • Switchcase có nghĩa là biến char thành chữ thường nếu nó là chữ hoa và để biến nó thành chữ hoa nếu nó là chữ thường.

Ngoài '... không cần phải đồng nhất', tôi nghĩ rằng bạn có thể muốn chỉ định rằng đã cung cấp một số đầu vào, tất cả các đầu ra hợp pháp hữu hạn về nguyên tắc đều có thể tạo ra (nếu không, số nguyên ngẫu nhiên không đồng nhất của tôi trong [1 , 2,3,4,5] sẽ luôn là 2 và tôi sẽ chỉ xuất chuỗi gốc).
Chas Brown

@ChasBrown Vâng, tôi sẽ chỉnh sửa câu hỏi
MilkyWay90

2
Tôi tìm thấy các đặc điểm kỹ thuật khó hiểu. Bạn có thể rõ ràng hơn? Ví dụ: tìm ra cách Stringsản xuấtSSSTSStrTrIiinIIngn
Luis Mendo

7
@LuisMendo Tôi không phải OP, nhưng tôi nghĩ : [S]SSTSS [t]rT, [r]I, [i]inII, [n]gn, trong đó các ký tự giữa các khối là các dấu đầu dòng đầu tiên (" Xuất ký tự hiện tại ") và các ký tự khác là 1-5 lần ngẫu nhiên một trong bốn lựa chọn cho điều đó tính cách. Nhưng tôi đồng ý, một số giải thích rõ ràng hơn sẽ phù hợp. Ngoài trường hợp thử nghiệm, đặc biệt rõ ràng, chúng tôi phải chọn một lựa chọn ngẫu nhiên 1-5 lần. Thay vì chọn một lựa chọn ngẫu nhiên lặp đi lặp lại 1-5 lần (như câu trả lời Gaia hiện tại).
Kevin Cruijssen

3
@KevinCruijssen Cảm ơn, lời giải thích của bạn phù hợp với ví dụ và rõ ràng. OP nên xác nhận và chỉnh sửa nó thành văn bản
Luis Mendo

Câu trả lời:


6

Gaia , 25 byte

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

Hãy thử trực tuyến!

Cảm ơn Kevin Cruijssen đã chỉ ra 2 lỗi!

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

Lưu ý rằng đó 4ṛlà vì được triển khai cho một số nguyên zdưới dạng pythonrandom.randint(1,z+1) , trả về một số nguyên Nnhư vậy 1<=N<=z+1.


Bạn có chắc mã hóa độ dài chạy là chính xác ở đây? Nếu tôi hiểu đúng thách thức: bốn tùy chọn nên được chọn ngẫu nhiên 1-5 lần, thay vì chọn một trong bốn lần ngẫu nhiên, lặp lại 1-5 lần. Đầu ra ví dụ đầu tiên SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) dường như phản ánh điều này và hiện tại không phải là đầu ra có thể có trong chương trình của bạn (tôi nghĩ).
Kevin Cruijssen

@KevinCruijssen Tôi đã giải thích "đầu ra từ danh sách một số lần ngẫu nhiên" có nghĩa là giải mã độ dài chạy, nhưng bạn nói đúng, các trường hợp thử nghiệm dường như chỉ ra cách giải thích khác; Tôi nghĩ nó sẽ khá dễ sửa
Giuseppe

1
5ṛcó thể dẫn đến 6một số lý do Hãy thử trực tuyến ? PS: Không có số nguyên cho danh sách có phạm vi hay vòng lặp for-loop trong Gaia?
Kevin Cruijssen

1
@KevinCruijssen dang, Business Cat thực sự cần sửa từng lỗi một ... Tôi thực sự nghĩ rằng có một forkiểu cấu trúc, nhưng tôi khá chắc chắn rằng nó thậm chí không được ghi lại trên trang wiki.
Giuseppe

4

APL (dzaima / APL) , 23 byte

Chức năng tiền tố ẩn danh.

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

Hãy thử trực tuyến!

2(... )/ áp dụng các chức năng ngầm trung tố sau đây giữa mỗi cặp nhân vật:

- tổng đài
 của
,  cặp

,, chuẩn bị kết nối của cặp với điều đó

{... }⊇ chọn các yếu tố sau từ đó:

  ?5 số ngẫu nhiên trong phạm vi 1 Lầu 5

  4⍴⍨ rất nhiều

  ? chỉ số ngẫu nhiên cho những người

ε nlist (flatten)


3

Perl 6 , 60 byte

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

Hãy thử trực tuyến!

Phần chữ thường / chữ hoa thường hơi khó chịu.


Tôi không biết Perl, vì vậy tôi có thể nói điều gì đó ngu ngốc ở đây. Nhưng bằng cách nào đó có thể nối $/$0kết hợp lại với nhau và sử dụng .lctrên chuỗi đó, sau đó tạo một bản sao của chuỗi đó và sử dụng .uc, và ghép hai chuỗi đó lại với nhau? Bạn không chắc chắn nếu điều đó thậm chí còn có thể, hoặc ngắn hơn so với hiện tại của bạn $/.lc,$/.uc,$0.lc,$0.uc, nhưng nó sẽ có nghĩa là bạn muốn sử dụng $/, $0, .lc, và .ucmỗi một lần.
Kevin Cruijssen

1
Than ôi, (.lc~.uc for $0~$/).comblà dài hơn. Perl 6 thực sự muốn phân biệt các chuỗi và danh sách, vì vậy "abc"[0] eq "abc"(nó giả vờ là một danh sách một mục).
Ven

Bạn có thể làm điều đó bằng cách trượt và một hàm ẩn danh được áp dụng cho một danh sách: {.lc,|.uc}($/,|$0)cho -5 byte và chỉ sử dụng danh sách khớp {.lc,|.uc}(@$/)cho -8 byte. tio.run/ từ
Phil H

@PhilH Không, nó không hoạt động. Những giải pháp đó chỉ viết hoa một trong các chữ cái mỗi
Jo King


3

Bash , 121 byte

-20 byte nhờ Nahuel

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

Hãy thử trực tuyến!

Câu trả lời gốc

Bash , 150 byte

Đã thực hiện rất ít bash golf và cố gắng cải thiện bash của tôi, vì vậy bất kỳ ý kiến ​​đều hoan nghênh.

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

Hãy thử trực tuyến!

Mã là vòng lặp đơn giản thông qua ký tự cài đặt ký tự hiện tại cnký tự tiếp theo , sau đó tạo một mảng gồm 4 khả năng, lặp lại một trong số chúng để có chính xác 5. Tiếp theo, chúng ta xáo trộn mảng đó và sau đó chọn n phần tử từ đó, trong đó n là ngẫu nhiên giữa 1 và 5.


dường như nó bị mất tíchprintf %s "$c"
Nahuel Fouilleul

1
dodonecó thể được thay thế bằng không có giấy tờ {}
Nahuel Fouilleul


1
@roblogic thật thông minh. tyvm.
Giô-na

1
Giải pháp 121 byte hơi mong manh / lỗi, đây là phiên bản mạnh hơn (133 byte) nên xử lý tất cả ASCII có thể in, tio.run
roblogic


2

05AB1E , 18 17 byte

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

Lấy cảm hứng từ câu trả lời Gaia của @Giuseppe .
-1 byte nhờ @Shaggy .

Dùng thử trực tuyến 10 lần hoặc xác minh tất cả các trường hợp thử nghiệm 10 lần .

Giải trình:

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

Tôi không biết 05AB1E, nhưng, thay vì INè, bạn có thể cứu bất cứ điều gì bằng cách đẩy nhân vật đầu tiên của y?
Shaggy

@Shaggy Vâng, tôi thực sự có thể .. Cảm ơn! Có lẽ tôi nên dừng chơi golf cho ngày hôm nay, tôi là một mớ hỗn độn, lol ..
Kevin Cruijssen

Bạn là một mớ hỗn độn? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn Mặc dù một cách tiếp cận khá ban đầu, tôi sợ nó không làm điểm viên đạn đầu tiên của thử thách ( " Output nhân vật hiện tại. "), Kể từ khi kết quả có thể bắt đầu với t, Thoặc scho đầu vào "String"trong chương trình của bạn, trong khi đó là nghĩa vụ phải luôn luôn bắt đầu với S.
Kevin Cruijssen

1

Than , 27 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

FLθ«

Lặp lại tất cả các chỉ số của chuỗi đầu vào.

F∧ι⊕‽⁵

Ngoại trừ chỉ mục đầu tiên, lặp qua một số ngẫu nhiên từ 1 đến 5 bao gồm ...

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

... trích xuất các ký tự trước và tiếp theo từ chuỗi, lấy phiên bản chữ hoa và chữ thường và chọn một ký tự ngẫu nhiên trong bốn ký tự.

§θι

In ký tự ở chỉ mục hiện tại.


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


Bạn có thể lưu 4 byte bằng cách sử dụng $&thay vì $1chop+ -lthay vìs/.$//
Dada

1

Japt -P , 14 byte

äÈ+Zu pv ö5ö Ä

Thử nó

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

Thạch , 14 byte

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

Hãy thử trực tuyến!

Giải trình

             Ɲ | 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 từ 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;}

Dùng thử trực tuyến


Tôi không nghĩ rằng bạn cần 0dòng đầu tiên.
LambdaBeta

Cũng có thể lưu rất nhiều ký tự bằng cách lấy bộ đệm Slàm tham số và thêm các biến của bạn vào danh sách đối số: Hãy thử trực tuyến!
LambdaBeta

@LambdaBeta hóa ra bạn nói đúng 0, điều đó khiến nó không còn giá trị #definenữa
rtpax


1

PowerShell , 154 105 103 95 87 byte

-67 byte nhờ mazzy người không thể dừng lại

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

Hãy thử trực tuyến!

Không phải là một phương pháp tuyệt vời nhưng nó hoạt động. Bây giờ nó khá tốt. Đưa đầu vào qua nối


Ồ, wow, đó là rất nhiều byte.
MilkyWay90

1
@mazzy chó chó. Tôi cần tập thói quen vung vẩy mọi lúc nhưng không biết bạn có thể làm nóng các thành viên ký tự đại diện như thế không.
Veskah

1
Tôi xin lỗi 87 byte
mazzy

0

Scala 2.12.8, 214 byte

Phiên bản chơi gô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)

Chơi gôn với dòng mới và thụt lề:

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)

Ung dung:

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
Không có cách nào để biến a :: b :: Nilthành a::b::Nil? Tương tự cho a :+, a:+()hoặc a.:+()có thể hoạt động
Ven

@Ven a::b::Nilgây ra lỗi biên dịch. +:là một phương thức được xác định trong danh sách, vì vậy nó có thể tiết kiệm không gian bằng cách loại bỏ các parens bên ngoài?
Soren

Bạn chỉ có một elem ở đây vì vậy dù sao nó cũng không tự động
Ven


0

C # (Trình biên dịch tương tác Visual C #) , 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;}

Hãy thử trực tuyến!


Không hoạt động với các ký tự không chữ và số. char b=a[0]-> var b=a[0], không gian thêm trong khai báo dtrong vòng lặp for
Hiện thân của sự thiếu hiểu biết

0

Truy vấn 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)

Rất tiếc, hãy thử trực tuyến phiên bản trực tuyến luôn hiển thị cùng một kết quả cho cùng một varchar, không giống như MS SQL Server Management Studio



0

Japt -P , 43 16 byte

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

Rút ngắn bởi rất nhiều bây giờ!

Thử nó


Điều này dường như trả lại kết quả tương tự mỗi lần.
Xù xì

@Shaggy sẽ sửa. Ngoài ra, ämô tả của nó nói rằng nó đưa ra ba đối số, với đối số cuối cùng x+y. Nhưng như bạn có thể thấy ở đây , nó chỉ trả về 1. Đây có phải là một lỗi không?
Hiện thân của sự thiếu hiểu biết

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

Hãy thử trực tuyến!

-1 nhờ trần

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
}

Số lượng ký tự được in (mỗi ký tự đầu vào) không đồng nhất ngẫu nhiên:

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

Với rất nhiều sự giúp đỡ từ man zshexpnman zshparam. Hãy thử trực tuyến!

  • -6 bởi tôi, điều chỉnh
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=;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.