셰퍼드 토우 바 월스 우레 운드!


42

모든 모음과 문자열 입력 문자열 출력을 감안할 때 a, e, i, ou서로간에 임의로 교체한다.

예를 들어, 문자열 this is a test에는 4 개의 모음이 있습니다 [i, i, a, e]. [a, i, e, i]따라서이 모음을 올바르게 섞으면 출력이 나올 수 있습니다 thas is e tist.

셔플 링 정보

우리가 같은 모음을 구별한다고 생각한다면 모든 셔플은 똑같이 가능할 것이다 . 위의 예에서 24 개의 셔플이 가능합니다.

[i 1 , i 2 , a, e] [i 1 , i 2 , e, a] [i 1 , a, i 2 , e] [i 1 , a, e, i 2 ]
[i 1 , e, i 2 , a] [i 1 , e, a, i 2 ] [i 2 , i 1 , a, e] [i 2 , i 1 , e, a]
[i 2 , a, i 1 , e] [i 2 , a, e, i 1 ] [i 2 , e, i 1 , a] [i 2 , e, a, i 1 ]
[a, i 1 , i 2 , e] [a, i 1 , e, i 2 ] [a, i 2 , i 1 , e] [a, i 2 , e, i 1 ]
[a, e, i 1 , i 2 ] [a, e, i 2 , i 1 ] [e, i 1 , i 2 , a] [e, i 1 , a, i 2 ]
[e, i 2 , i 1 , a] [e, i 2 , a, i 1 ] [e, a, i 1 , i 2 ] [e, a, i 2 , i 1 ]

각각의 가능성은 동일해야합니다.

모든 모음이 올바른 곳에있는 모음을 찾을 때까지 전체 줄의 임의 순서 섞기를 시도 할 수 없습니다. 즉, 입력이 일정하면 코드의 실행 시간이 일정해야합니다.

입력 및 출력

  • 입력의 모든 문자가 소문자 또는 대문자라고 가정 할 수 있습니다. 혼합 케이스를 지원할 수도 있지만 보너스는 제공되지 않습니다.

  • 입력은 항상 인쇄 가능한 ASCII 문자로 구성됩니다. 입력에있는 모든 문자는 출력에 있어야하며 모음 만 뒤섞여 야합니다.

  • 입력이 비어있을 수 있습니다. 입력에 적어도 하나의 모음 또는 적어도 하나의 모음이 포함되어 있다고 보장 할 수 없습니다.

  • 의 입력을 STDIN함수 매개 변수 또는 이와 유사한 것으로 입력 할 수 있습니다 .

  • 출력을로 인쇄 STDOUT하거나 함수 또는 이와 유사한 것에서 반환 할 수 있습니다 .

테스트 사례

첫 번째 줄은 주어진 입력입니다. 두 번째 줄은 가능한 출력 중 하나입니다.

<empty string>
<empty string>

a
a

cwm
cwm

the quick brown fox jumps over the lazy dog.
tho qeuck brewn fax jumps ovir the lozy dog.

abcdefghijklmnopqrstuvwxyz
abcdefghujklmnipqrstovwxyz

programming puzzles & code golf
pregromming pezzlos & coda gulf

fatalize
fitaleza

martin ender
mirten ander

채점

이것은 , sato shirtist enswer en bytes wons 입니다.


17
영어 / 미국 사람과 y모음이 부족합니다 ..;)
Kevin Cruijssen

6
@KevinCruijssen 저는 원어민이 아니며 y모음 도 고려할 것입니다 . 그러나 모음이라고 말했던 마지막 도전은 내가 y왜 그것을 선택했는지 물었습니다!
치명적

7
@ KevinCruijssen, 편지는 모음이 아닙니다 : 소리가 있습니다.
피터 테일러

6
cwm의 경우 +1 등산 및 / 또는 웨일스 어 살아 유지;)
Beta Decay

2
@KevinCruijssen 음주 공동을 가지고 있지 VO에 대한 w 일반적으로 그렇게 간주되지 않습니다 ELS.
corsiKa

답변:


13

젤리 , 15 바이트

f€“¡ẎṢɱ»ðœpżFẊ¥

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

작동 원리

f€“¡ẎṢɱ»ðœpżFẊ¥  Main link. Argument: s (string)

  “¡ẎṢɱ»         Yield "aeuoi"; concatenate "a" with the dictionary word "euoi".
f€               Filter each character in s by presence in "aeuoi".
                 This yields A, an array of singleton and empty strings.
        ð        Begin a new, dyadic chain. Left argument: A. Right argument: s
         œp      Partition s at truthy values (singleton strings of vowels) in A.
            FẊ¥  Flatten and shuffle A. This yields a permutation of the vowels.
           ż     Zip the partition of consonants with the shuffled vowels.

다른 답변에 비해 왜 이것이 느린 것처럼 보입니까?
치명적

젤리는 무엇보다도 SymPy와 NumPy를 가져옵니다. 이 프로그램과 빈 프로그램의 실행 시간은 거의 같습니다.
Dennis

15
누군가가 묻기 전에, euoi고대 Bacchic 계시 에서 열정적 인 휴거의 외침입니다 .
Dennis

5
@Dennis 호기심에서 젤리는 왜 사전 단어를 내장하고 있습니까? 이 사전 단어는 어디서 구할 수 있습니까?
Kevin Cruijssen

1
@KevinCruijssen Jelly를 디자인 할 때 이미 shoco 를 사용하는 몇 가지 골프 언어가 있었으며 영어 사전을 사용하는 것만으로도 그 아이디어를 향상시키는 좋은 방법 인 것 같습니다. /usr/share/dict/words컴퓨터 에서 파일 을 사용하여 Jelly 인터프리터에 포함 시켰습니다.
Dennis

17

R, 92 (91)

아직 댓글을 달 수 없으므로 @ Andreï Kostyrka 답변과 매우 유사하지만 내 답변을 추가하고 있습니다 (믿거 나 말거나 독립적으로 생각해 냈습니다).

s=strsplit(readline(),"")[[1]];v=s%in%c("a","e","i","o","u");s[v]=sample(s[v]);cat(s,sep="")

언 골프

s=strsplit(readline(),"")[[1]]    # Read input and store as a vector
v=s%in%c("a","e","i","o","u")     # Return TRUE/FALSE vector if vowel
s[v]=sample(s[v])                 # Replace vector if TRUE with a random permutation of vowels
cat(s,sep="")                     # Print concatenated vector

@Vlo 덕분에 1 바이트 절약

s=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")

5
솔직히 믿을 수 없습니다. 농담이야 바이트를 절약하는 멋진 트릭!
Andreï Kostyrka

솔직히 말해서, 나는 당신의 아이디어를 도용하여 내 대답을 더 골프화하지 않습니다.
Andreï Kostyrka

3
Hehe, 내가 의견을 말할 수 있도록 달콤한
공감대를 가져와야합니다

인라인 할당 91 바이트로 바이트 저장s=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")
Vlo

el()대신에 다른 바이트를 사용하여 저장하십시오 [[1]].
Andreï Kostyrka

11

R, 99 98 89 바이트

x=el(strsplit(readline(),""))
z=grepl("[aeiou]",x)
x[z]=x[sample(which(z))]
cat(x,sep="")

사람이 읽을 수있는 최초의 솔루션 인 것 같습니다! 9 바이트를 절약 한 Giuseppe 에게 감사드립니다 !

테스트 사례 :

tho qaeck bruwn fux jemps over tho lozy dig.
progremmang pozzlos & cide gulf

내부 변수 할당을 할 수있는 방법이없는 것 같습니다 (예 : 등 cat). 어떤 사람들은 다시 내가 틀렸다는 것을 증명하려고합니다 ...


2
letters[c(1,5,9,15,21)]1 바이트 더 길고 OEIS A161536 및 A215721도 도움이되지 않습니다.
Andreï Kostyrka

하지 않을까요 z=grepl("[aeiou]",x)짧아?
Giuseppe

@Giuseppe 다시 했어! 감사.
Andreï Kostyrka

10

CJam, 23 바이트

lee_{"aeiou"&},_mrerWf=

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

설명

l            e# Read input, e.g. "foobar".
ee           e# Enumerate, e.g. [[0 'f] [1 'o] [2 'o] [3 'b] [4 'a] [5 'r]].
_            e# Duplicate.
{"aeiou"&},  e# Keep those which have a non-empty intersection with this string
             e# of vowels, i.e. those where the enumerated character is a vowel.
             e# E.g. [[1 'o] [2 'o] [4 'a]].
_            e# Duplicate.
mr           e# Shuffle the copy. E.g. [[2 'o] [4 'a] [1 'o]].
er           e# Transliteration. Replaces elements from the sorted copy with
             e# the corresponding element in the shuffled copy in the original list.
             e# [[0 'f] [2 'o] [4 'a] [3 'b] [1 'o] [5 'r]].
Wf=          e# Get the last element of each pair, e.g. "foabor".


5

파이썬 3, 109 바이트

소문자 모음 만 지원합니다.

여분의 바이트를 저장해 준 @Alissa에게 감사드립니다.

import re,random
def f(s):r='[aeiou]';a=re.findall(r,s);random.shuffle(a);return re.sub(r,lambda m:a.pop(),s)

무시 했어!


문자열을 가져 와서 셔플 모음이있는 문자열을 반환하는 함수라면 더 짧지 않습니까?
Alissa

@Alissa 감사합니다. 1 바이트를 절약했습니다! : D
베타 부패

그것은 어떤 짧은,하지만 것입니다하지 않도록 경우는 수 a.pop(random.randrange(0,len(a)))대신 셔플의
알리사

4

TSQL, 275 바이트

골프 :

DECLARE @ VARCHAR(99)='the quick brown fox jumps over the lazy dog.'

;WITH c as(SELECT LEFT(@,0)x,0i UNION ALL SELECT LEFT(substring(@,i+1,1),1),i+1FROM c
WHERE i<LEN(@)),d as(SELECT *,rank()over(order by newid())a,row_number()over(order by 1/0)b
FROM c WHERE x IN('a','e','i','o','u'))SELECT @=STUFF(@,d.i,1,e.x)FROM d,d e
WHERE d.a=e.b PRINT @

언 골프 드 :

DECLARE @ VARCHAR(max)='the quick brown fox jumps over the lazy dog.'

;WITH c as
(
  SELECT LEFT(@,0)x,0i
  UNION ALL
  SELECT LEFT(substring(@,i+1,1),1),i+1
  FROM c
  WHERE i<LEN(@)
),d as
(
  SELECT 
    *,
    rank()over(order by newid())a,
    row_number()over(order by 1/0)b
  FROM c
  WHERE x IN('a','e','i','o','u')
)
SELECT @=STUFF(@,d.i,1,e.x)FROM d,d e
WHERE d.a=e.b
-- next row will be necessary in order to handle texts longer than 99 bytes
-- not included in the golfed version, also using varchar(max) instead of varchar(99)
OPTION(MAXRECURSION 0) 

PRINT @

깡깡이


3

펄, 38 바이트

에 +1 포함 -p

STDIN의 문장으로 실행

vawols.pl <<< "programming puzzles & code golf"

vawols.pl:

#!/usr/bin/perl -p
@Q=/[aeiou]/g;s//splice@Q,rand@Q,1/eg

3

자바 7, 243 241 바이트

import java.util.*;String c(char[]z){List l=new ArrayList();char i,c;for(i=0;i<z.length;i++)if("aeiou".indexOf(c=z[i])>=0){l.add(c);z[i]=0;}Collections.shuffle(l);String r="";for(i=0;i<z.length;i++)r+=z[i]<1?(char)l.remove(0):z[i];return r;}

그렇습니다. 아마 꽤 골프를 쳤을 수도 있지만 Java에는이 afaik에 대한 편리한 내장 기능이 없습니다. 또한, 나는 Collections.shuffle..

언 골프 및 테스트 사례 :

여기에서 시도하십시오.

import java.util.*;
class M{
  static String c(char[] z){
    List l = new ArrayList();
    char i,
         c;
    for(i = 0; i < z.length; i++){
      if("aeiou".indexOf(c = z[i]) >= 0){
        l.add(c);
        z[i] = 0;
      }
    }
    Collections.shuffle(l);
    String r = "";
    for(i = 0; i < z.length; i++){
      r += z[i] < 1
               ? (char)l.remove(0)
               : z[i];
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c("".toCharArray()));
    System.out.println(c("a".toCharArray()));
    System.out.println(c("cwm".toCharArray()));
    System.out.println(c("the quick brown fox jumps over the lazy dog.".toCharArray()));
    System.out.println(c("abcdefghijklmnopqrstuvwxyz".toCharArray()));
    System.out.println(c("programming puzzles & code golf".toCharArray()));
    System.out.println(c("fatalize".toCharArray()));
    System.out.println(c("martin ender".toCharArray()));
  }
}

가능한 출력 :

a
cwm
tha queck brown fox jumps evor tho lezy dig.
ebcdifghujklmnopqrstavwxyz
prigrommeng puzzlos & cade golf
fatelazi
mertan inder

1
i두 번째 루프에서 재사용 하는 것은 어떻습니까?
Frozn

나는 "그가 왜리스트 대신에 char []와 함께 가지 않았을까?"라고 생각했는데, 시작했지만, Arrays.shuffle저의 부족으로 저 를 막았습니다 ...
Olivier Grégoire

약간의 개조하면 되겠와 6 자 삭발 :import java.util.*;String c(char[]z){List l=new ArrayList();int i=0,j=z.length;for(;i<j;i++)if("aeiou".indexOf(z[i])>=0){l.add(z[i]);z[i]=0;}Collections.shuffle(l);String r="";for(i=0;i<j;i++)r+=z[i]<1?(char)l.remove(0):z[i];return r;}
durron597

3

펄 6 , 65 바이트

{my \v=m:g/<[aeiou]>/;my @a=.comb;@a[v».from]=v.pick(*);@a.join}

익명의 기능. 소문자 입력을 가정합니다.

( 온라인 시도 )


3

루비 45 + 1 = 46 바이트

-p플래그의 경우 +1 바이트

a=$_.scan(e=/[aeiou]/).shuffle
gsub(e){a.pop}

3

Brachylog , 39 바이트

@eI:1aToS,I:2f@~:LcS,Tc
.'~e@V;
e.~e@V,

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

설명

  • 주요 술어 :

    @eI        I is the list of chars of the input.
    :1aT       T is I where all vowels are replaced with free variables.
    oS,        S is T sorted (all free variables come first).
    I:2f       Find all vowels in I.
    @~         Shuffle them.
    :LcS,      This shuffle concatenated with L (whatever it may be) results in S.
                 This will unify the free variables in S with the shuffled vowels.
    Tc         Output is the concatenation of elements of T.
    
  • 술어 1 :

    .          Input = Output…
    '~e@V      …provided that it is not a vowel.
    ;          Otherwise Output is a free variable.
    
  • 술부 2 :

    e.         Output is an element of the input…
    ~e@V,      … and it is a vowel.
    

3

자바 스크립트 (ES6), 78 76 바이트

s=>s.replace(r=/[aeiou]/g,_=>l.pop(),l=s.match(r).sort(_=>Math.random()-.5))

apsiller 덕분에 2 바이트 절약

apiller가 제안한 대체 버전 (76 바이트)

s=>s.replace(r=/[aeiou]/g,[].pop.bind(s.match(r).sort(_=>Math.random()-.5)))

테스트

let f =
s=>s.replace(r=/[aeiou]/g,_=>l.pop(),l=s.match(r).sort(_=>Math.random()-.5))

console.log(f("the quick brown fox jumps over the lazy dog."))


1
개선점 (정확히 동일한 점수)은 아니지만 재미있는 발견 : l=...완전히 삭제 하고 바운드 함수 [].pop.bind(s.match(r).sort(_=>Math.random()-.5)))replace화살표 함수 대신 두 번째 인수로 사용하십시오 . 그 길 아래에서 개선이 있을지 모르지만 아직 찾지 못했습니다. 바인드 연산자가있는 JS-superset 언어를 사용했다면 할 ::수 있다고 생각합니다 (s.match(r).sort(_=>Math.random()-.5)))::pop.
apillers

3

MATL , 15 바이트

tt11Y2m)tnZr7M(

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

설명

tt      % Take input string implicitly. Duplicate twice
11Y2    % Predefined string: 'aeiou'
m       % Logical index that contains true for chars of the input that are vowels
)       % Get those chars from the input string. Gives a substring formed by the
        % vowels in their input order
tnZr    % Random permutation of that substring. This is done via random sampling
        % of that many elements without replacement
7M      % Push logical index of vowel positions again
(       % Assign the shuffled vowels into the input string. Display implicitly

3

Japt v2.0a0, 14 13 바이트

ō²f\v
NÌr\v@o

시도 해봐


설명

           :Implicit input of string U.
ö²         :Generate a random permutation of U.
  f\v      :Get all the vowels as an array.
\n         :Assign that array to U.
NÌ         :Get the last element in the array of inputs (i.e., the original value of U)
  r\v      :Replace each vowel.
     @o    :Pop the last element from the array assigned to U above.

2

Pyth, 26 바이트

J"[aeiou]"s.i:QJ3.Sf}TPtJQ

인용 문자열을 입력하고 섞은 문자열을 인쇄하는 프로그램입니다.

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

작동 원리

J"[aeiou]"s.i:QJ3.Sf}TPtJQ  Program. Input: Q
J"[aeiou]"                  J="[aeiou]"
             :QJ3           Split Q on matches of regex J, removing vowels
                      PtJ   J[1:-1], yielding "aeiou"
                   f}T   Q  Filter Q on presence in above, yielding vowels
                 .S         Randomly shuffle vowels
           .i               Interleave non-vowel and vowel parts
          s                 Concatenate and implicitly print

2

PHP, 144 129 바이트

소문자 입력 사용

$r=Aaeiou;$v=str_shuffle(preg_replace("#[^$r]+#",'',$a=$argv[1]));for(;$i<strlen($a);)echo strpos($r,$a[$i++])?$v[$j++]:$a[$i-1];

설명:

$r="aeiou"; // set vowels

preg_replace("#[^$r]+#",'',$argv[1]) // find all vowels in input

$v=str_shuffle() // shuffle them

for(;$i<strlen($a);) // run through the text

strpos($r,$a[$i++])?$v[$j++]:$a[$i-1]; // if it's a vowel print the j-th shuffled vowel else print original text

2

실제로 24 바이트

;"aeiou";╗@s@`╜íu`░╚@♀+Σ

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

설명:

;"aeiou";╗@s@`╜íu`░╚@♀+Σ
;                         dupe input
 "aeiou";╗                push vowels, store a copy in reg0
          @s              split one copy of input on vowels
            @`╜íu`░       take characters from other copy of input where
              ╜íu           the character is a vowel (1-based index of character in vowel string is non-zero)
                   ╚      shuffle the vowels
                    @♀+   interleave and concatenate pairs of strings
                       Σ  concatenate the strings

2

배쉬, 75 바이트

paste -d '' <(tr aeoiu \\n<<<$1) <(grep -o \[aeiou]<<<$1|shuf)|paste -sd ''

문자열을 인수로 사용하고 결과를 stdout에 인쇄합니다.

예 :

for x in "" "a" "cwm" \
         "the quick brown fox jumps over the lazy dog." \
         "abcdefghijklmnopqrstuvwxyz" \
         "programming puzzles & code golf" \
         "fatalize" "martin ender"; do
  echo "$x";. sheffle.sh "$x"; echo
done

인쇄물

<blank line>
<blank line>

a
a

cwm
cwm

the quick brown fox jumps over the lazy dog.
tho quuck brown fix jamps ever the lozy dog.

abcdefghijklmnopqrstuvwxyz
ibcdefghajklmnopqrstuvwxyz

programming puzzles & code golf
progremmong pazzlus & cedo gilf

fatalize
fetilaza

martin ender
mertan endir

2

배쉬, 89

모든 입력을 소문자로 가정합니다.

a=`tee z|grep -o [aeiou]`
[ -n "$a" ]&&tr `tr -d \ <<<$a` `shuf -e $a|tr -d '
'`<z||cat z

2

PowerShell v3 +, 155 99 바이트

param([char[]]$n)$a=$n|?{$_-match'[aeiou]'}|sort{random};-join($n|%{if($_-in$a){$a[$i++]}else{$_}})

56 바이트 골프를 위해 @ Ben Owen 에게 큰 소품

$n모든 소문자를 예상하고 input을 가져 와서 즉시 char배열 로 캐스트합니다 .

로 우리가 관 Where-Object절 이러한 요소를 꺼내 그 -match에게 모음, 파이프 그들 Sort-Object과 함께 {Get-Random}정렬 메커니즘. 호출 Get-Random예선없이하는 사이의 정수를 반환 0하고 [int32]::MaxValue즉시 각 요소에 임의의 가중치를 할당, 즉 -. 무작위 모음을에 저장합니다 $a.

마지막으로을 반복합니다 $n. 각 요소에 |%{...}대해 현재 문자가 어딘가에 있으면 -in $a다음 $a에 증가 하여 다음 요소를 출력합니다 $i. 그렇지 않으면 현재 문자를 출력합니다. 그것은 모두 parens로 캡슐화되어 -join문자열로 연결됩니다. 해당 문자열은 파이프 라인에 남아 있으며 프로그램 결론에 출력이 내재되어 있습니다.

테스트 사례

PS C:\Tools\Scripts\golfing> 'a','cwm','the quick brown fox jumps over the lazy dog.','abcdefghijklmnopqrstuvwxyz','programming puzzles & code golf','fatalize','martin ender'|%{.\vawols.ps1 $_}
a
cwm
thu qaeck brown fix jomps ovor thu lezy deg.
abcdofghejklmnupqrstivwxyz
prugrammong pizzles & code golf
fitaleza
mertin endar

대신 모음 $nchar-array 를 출력하기 위해의 문자 를 반복 하고 각 모음에서 일치 시켜 많은 바이트를 절약 할 수 있습니다 . 뭔가 같은 :$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
벤 오웬

@BenOwen Holy dang, 그렇습니다. 56 바이트 골프 주셔서 감사합니다. 내 인생을 위해, 나는 더 좋은 건축 방법을 알아낼 수 없었다 $a.
AdmBorkBork

2

파이썬 3, 106 바이트

소문자 만.

import re,random
def f(s):s=re.split('([aeiou])',s);v=s[1::2];random.shuffle(v);s[1::2]=v;return''.join(s)

1

PHP> = 5.3 , 139136 바이트 (오류가 발생하지 않음)

array_map(function($a,$b){echo$a.$b;},preg_split("/[aeiou]/",$s=$argv[1]),str_split(str_shuffle(implode(preg_split("/[^aeiou]/",$s)))));

1

K (oK) , 29 바이트

해결책:

{x[a:&x in"aeiou"]:x@(-#a)?a}

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

예 :

"pregrommeng pizzlas & codo gulf"
{x[a:&x in"aeiou"]:x@(-#a)?a}"programming puzzles & code golf"
"pregremmong puzzlos & coda gilf"
{x[a:&x in"aeiou"]:x@(-#a)?a}"programming puzzles & code golf"
"pregrommeng pazzlos & cidu golf"

설명:

모음의 위치를 ​​찾아 무작위 순서로 그려진 모음으로 바꿉니다.

{x[a:&x in"aeiou"]:x@(-#a)?a} / the solution
{                           } / anonymous function with input x
 x[              ]            / index into x at these indices
      x in"aeiou"             / is character a vowel
     &                        / indices where true
   a:                         / assign to add
                  :           / assign
                          ?a  / draw randomly from a
                     (   )    / do this together
                       #a     / count length of a
                      -       / negate (draws from list, no duplication)
                   x@         / apply these indices to input


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