ssTTsSTtRrriinInnnnNNNIiinngg


18

도전

마지막 문자를 제외한 문자열의 각 문자에 대해 다음을 수행하십시오.

  • 현재 문자를 출력합니다.

  • 다음 목록에서 1-5 (포함) 사이의 임의의 횟수로 무작위 출력합니다.

    • 현재 캐릭터
    • 문자열의 다음 문자
    • 현재있는 캐릭터의 스위치 버전
    • 문자열의 다음 문자의 스위치 버전입니다.

테스트 사례

String -> SSSTSStrTrIiinIIngn

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

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

노트

  • 문자가 알파벳 (AZ 및 az)의 일부인 경우 문자의 전환 버전 만 적용하면됩니다.
  • 임의의 함수는 균일 할 필요는 없지만 주어진 목록의 요소를 반환 할 가능성이 여전히 있습니다.
  • 모든 표준 I / O 형식을 사용할 수 있습니다.
  • 입력 길이가 2 이상이라고 가정 할 수 있습니다.
  • 입력이 ASCII 문자로만 구성되어 있다고 가정 할 수 있습니다.
  • 제목은 테스트 케이스가 아닙니다 (유효한 테스트 케이스 인 경우 의도하지 않은 것임).
  • 전환은 문자가 대문자이면 소문자로 바꾸고 소문자이면 대문자로 바꾸는 것을 의미합니다.

'... 균일 할 필요는 없습니다'외에도, 일부 입력이 주어지면 원칙적으로 모든 유한 법적 출력을 생성 할 수 있어야한다고 지정하고 싶다고 생각합니다 (그렇지 않으면 [1의 내 비 균일 임의의 정수 , 2,3,4,5]는 항상 2가 될 것이고 원래 문자열을 출력 할 것입니다).
Chas Brown

@ChasBrown 예, 질문을 편집하겠습니다
MilkyWay90

2
사양이 혼동된다는 것을 알았습니다. 좀 더 명확하게 할 수 있습니까? 예를 들어, String생산 방법을 알아보십시오SSSTSStrTrIiinIIngn
Luis Mendo

7
@LuisMendo 나는 OP가 아니지만, 생각합니다 : [S]SSTSS [t]rT, [r]I, [i]inII, [n]gn, 블록 사이의 문자가 첫 번째 글 머리 기호 ( " 현재 문자 출력 ")이고 다른 문자는 무작위로 1 ~ 5 배입니다. 캐릭터. 그러나 나는 좀 더 명확한 설명이 적절할 것이라는 데 동의합니다. 테스트 사례와는 별도로 1 ~ 5 번의 무작위 선택을 선택해야한다는 것이 명확하지 않았습니다. 가이아의 대답과 같이 무작위 선택을 선택하는 대신 1-5 번 반복했습니다.
Kevin Cruijssen

3
@KevinCruijssen 감사합니다. 귀하의 설명은 예제에 적합하며 명확합니다. OP는 텍스트를 확인하고 편집해야합니다
Luis Mendo

답변:


6

가이아 , 25 바이트

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

온라인으로 사용해보십시오!

2 개의 버그를 지적 해 주신 Kevin Cruijssen 에게 감사합니다 !

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

참고 4ṛ때문이다 정수에 대한 구현 z파이썬의 같은 random.randint(1,z+1)정수를 반환 N되도록 1<=N<=z+1.


실행 길이 인코딩이 올바른지 확인 하시겠습니까? 내가 도전을 올바르게 이해하면 4 개의 옵션 중 하나를 무작위로 선택하는 대신 1-5 번 반복하여 4 개의 옵션을 무작위로 선택해야합니다. 첫 번째 예제 출력 SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn])은 이것을 반영하는 것으로 보이며 현재 귀하의 프로그램에서 가능한 출력이 아닙니다 (제 생각에는).
Kevin Cruijssen

@KevinCruijssen 나는 "길이의 임의 출력 횟수"를 런-길이 디코딩을 의미하는 것으로 해석했지만 테스트 사례는 다른 해석을 나타내는 것으로 보인다. 고치기 쉬워야한다고 생각합니다
Giuseppe

1
5ṛ이 발생할 수 있습니다 6어떤 이유로 온라인으로 시도 ? 추신 : Gaia에는 정수 대 범위 목록이나 범위 for 루프가 없습니까?
Kevin Cruijssen

1
@KevinCruijssen dang, Business Cat은 실제로 하나의 오류를 수정해야합니다 ... for유형 구성 이 있다고 생각 했지만 위키 페이지에 문서화되어 있지 않다고 확신합니다 .
주세페

4

APL (dzaima / APL) , 23 바이트

익명의 암묵적 접두사 기능.

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

온라인으로 사용해보십시오!

2()/ 각 문자 쌍 사이에 다음 접두어 기능을 적용하십시오.

- switchcase
 의
, 한 쌍의 연결

,, 쌍의 연결을 그 앞에 붙이다

{}⊇ 그 중에서 다음 요소를 선택하십시오.

  ?5 1… 5 범위의 난수

  4⍴⍨ 그 많은 네

  ? 그것들에 대한 랜덤 인덱스

ε NLIST (편평한)


3

펄 6 , 60 바이트

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

온라인으로 사용해보십시오!

소문자 / 대문자 부분은 다소 성가시다.


나는 Perl을 모른다. 그래서 나는 아마 여기 바보 같은 말을하고있을 것이다. 그러나 어떻게 든 $/and 를 연결하고 해당 문자열을 $0사용한 .lc다음 해당 문자열의 복사본을 .uc만들고을 사용하여 둘을 연결할 수 있습니까? 확실하지 그조차 가능하거나 현재보다 짧은 있다면 $/.lc,$/.uc,$0.lc,$0.uc,하지만 당신이 사용하는 거라고 의미 $/, $0, .lc, 및 .uc각을 한 번.
Kevin Cruijssen

1
아아, (.lc~.uc for $0~$/).comb더 길다. Perl 6은 실제로 문자열과 목록을 구별하려고합니다 "abc"[0] eq "abc"(단일 항목 목록 인 것처럼 가장합니다).

미끄러짐과 익명 함수 {.lc,|.uc}($/,|$0)가 -5 바이트에 대해 목록에 적용되고 {.lc,|.uc}(@$/)-8 바이트에 대한 일치 목록을 사용하면 됩니다. tio.run/…
Phil H

@PhilH 아니요 작동하지 않습니다. 이 솔루션 은 각 문자 중
Jo King


3

배쉬 , 121 바이트

Nahuel 덕분에 -20 바이트

roblogic 덕분에 -9 바이트

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

온라인으로 사용해보십시오!

원래 답변

세게 때리다 , 150 바이트

골프 bashing을 거의하지 않았고 내 bash를 개선하려고 노력 했으므로 모든 의견을 환영합니다.

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

온라인으로 사용해보십시오!

코드는 현재 c와 다음 문자를 설정하는 문자를 통해 간단하게 반복됩니다 n. 그런 다음 4 가지 가능성의 배열을 만들고 그중 하나를 반복하여 정확히 5가되도록합니다. 다음으로 우리는 그 배열을 섞은 다음 n 개의 요소를 선택합니다. 1과 5.


누락 된 것 같습니다printf %s "$c"
Nahuel Fouilleul

1
dodone미등록으로 대체 할 수 {}
나우 Fouilleul


1
@roblogic 그것은 영리합니다. tyvm.
요나

1
121 바이트 솔루션은 여기에 처리해야보다 강력한 (133 바이트) 버전의 조금 깨지기 쉬운 / 버그입니다 모든 인쇄 가능한 ASCII, tio.run
roblogic


2

05AB1E , 18 17 바이트

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

@Giuseppe 의 Gaia 답변에서 영감을 얻었습니다 . @Shaggy
덕분에 -1 바이트 .

온라인으로 10 번 시도 하거나 모든 테스트 사례를 10 번 확인하십시오 .

설명:

ü)             # 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를 모르지만의 대신 INè첫 번째 문자를 밀어서 무엇을 저장할 수 y있습니까?
Shaggy

@Shaggy 네, 정말 그렇습니다 .. 감사합니다! 어쩌면 나는 오늘 골프를 그만 두어야 할 것이다. 난 엉망이야 ..
Kevin Cruijssen

엉망? ¨vNUy5LΩFy¹X>è«D.š«Ω?
매직 문어 항아리

1
@MagicOctopusUrn 꽤 원래의 접근 방식이지만, 나는 그것이 도전의 첫 번째 글 머리하지 않습니다 두려워 ( " 출력 현재의 문자를. ") 결과에 시작할 수 있기 때문에 t, T또는 s입력 "String"프로그램에, 동안 항상로 시작해야합니다 S.
Kevin Cruijssen

1

, 27 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

FLθ«

입력 문자열의 모든 인덱스를 반복합니다.

F∧ι⊕‽⁵

첫 번째 인덱스를 제외하고 1에서 5까지의 임의의 숫자를 반복하십시오.

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

... 문자열에서 이전 및 다음 문자를 추출하고 대문자 및 소문자 버전을 취하여 4 개의 임의 문자를 선택하십시오.

§θι

현재 색인에서 문자를 인쇄하십시오.


1

펄 5 ( -p), 77 바이트

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

TIO


당신은을 사용하여 4 바이트를 저장할 수 있습니다 $&대신 $1하고, chop+ -l대신s/.$//
다다

1

apt -P , 14 바이트

äÈ+Zu pv ö5ö Ä

시도 해봐

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

젤리 , 14 바이트

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

온라인으로 사용해보십시오!

설명

             Ɲ | 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 바이트

LambdaBeta에서 -12 바이트

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

온라인으로 사용해보십시오


나는 당신 0이 첫 번째 줄에 필요하다고 생각하지 않습니다 .
LambdaBeta

또한 버퍼 S를 매개 변수로 사용하고 변수를 인수 목록에 추가하여 많은 문자를 저장할 수 있습니다 . 온라인으로 시도하십시오!
LambdaBeta

@LambdaBeta 당신 밝혀 오른쪽에 대한 있습니다 0가지고 그것을 그것이 가치가 만든있는, #define더 이상
rtpax을


1

PowerShell , 154 105 103 95 87 바이트

막을 수없는 mazzy 덕분에 -67 바이트

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

온라인으로 사용해보십시오!

환상적인 방법은 아니지만 작동합니다. 이제는 꽤 좋습니다. 스플래 팅을 통해 입력을받습니다


아, 와우, 그것은 많은 바이트입니다.
MilkyWay90

1
@mazzy Dang 개. 나는 항상 튀는 습관에 빠져야하지만 그렇게 와일드 카드 멤버를 핫 스왑 할 수 있다는 것을 몰랐습니다.
Veskah

1
죄송합니다 87 바이트
10

0

스칼라 2.12.8, 214 바이트

골프 버전 :

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)

줄 바꿈과 들여 쓰기가 포함 된 골프 :

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)

언 골프 드 :

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
변신 a :: b :: Nil할 방법이 a::b::Nil없습니까? 동일에 대한 a :+, a:+()또는 a.:+()세력 일

@Ven a::b::Nil은 컴파일 오류를 일으 킵니다. +:목록에 정의 된 메소드이므로 외부 parens를 제거하여 공간을 절약 할 수 있습니까?
Soren

여기에는 단 하나의 요소 만 있으므로 자동으로 연결되지 않습니다.
Ven


0

C 번호 (카메라 C 번호 인터랙티브 컴파일러) , 236 (213) 209 바이트

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

온라인으로 사용해보십시오!


영숫자가 아닌 문자에는 작동하지 않습니다. char b=a[0]-> var b=a[0]의 선언에 여분의 공간 d을위한 루프에서
무지 실시

0

T-SQL 쿼리, 286 바이트

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)

불행히도 온라인으로 사용해보십시오 온라인 버전은 MS SQL Server Management Studio와 달리 항상 동일한 varchar에 대해 동일한 결과를 보여줍니다



0

apt -P , 43 16 바이트

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

지금 많이 단축되었습니다!

시도 해봐


이것은 매번 같은 결과를 반환하는 것 같습니다.
Shaggy

@Shaggy가 해결합니다. 또한 ä설명에 따르면 세 가지 인수가 있으며 마지막 인수는 x+y입니다. 그러나 여기서 볼 수 있듯이 1을 반환합니다. 버그입니까?
무지의 구현

0

C (GCC) , 110 (109) 바이트

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

온라인으로 사용해보십시오!

ceilingcat 덕분에 -1

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
}

인쇄 된 문자 수 (입력 문자 당)는 균일하지 않습니다.

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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.