케임브리지 전치


21

나는 전부는 아니더라도 대부분의 시점 에서이 문제 를 겪었다 고 확신한다 .

Cmabrigde Uinervtisy의 rscheearch에 Aoccdrnig는, 그것은 막대에있는 ltteers에서, 그리고 olny iprmoetnt tihng는 frist와 lsat ltteer는 rghit pclae에 있습니다. rset은 toatl mses가 될 수 있으며 당신은 포벨을 울릴 수 있습니다. Tihs는 bcmn입니다 huamn mnid deos는 섬에 의해 ervey lteter를 습격하지 않고, wlohe로서의 길을 is습니다.

  • 많은 양의 텍스트를 입력하는 프로그램을 작성하십시오. 테스트 목적으로 아래 텍스트의 스크램블되지 않은 버전을 사용하십시오.

  • 그런 다음 프로그램은 각 단어의 첫 글자와 마지막 글자를 제외하고 각 단어의 글자를 길이가 4 자 이상으로 무작위로 바꾸어야합니다.

  • 다른 모든 형식은 동일하게 유지해야합니다 (대문자 및 구두점 등).

테스트 텍스트 :

케임브리지 대학교 (Cambridge University)의 한 연구원에 따르면, 단어의 글자 순서가 중요하지 않으며, 유일한 중요한 것은 첫 번째와 마지막 글자가 올바른 위치에 있어야한다는 것입니다. 나머지는 완전히 혼란 스러울 수 있으며 문제없이 읽을 수 있습니다. 인간의 마음이 모든 글자 자체를 읽는 것이 아니라 단어 전체를 읽기 때문입니다.

평소와 마찬가지로 이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.


2
단어에서 문자를 무작위 화하는 방법과 유사 하지만, 한 단어에서는 한 단어 만 스크램블해야하지만 여기에는 문장의 모든 단어가 있습니다.
Gareth

동의한다. 하나의 문제에 대한 솔루션이 다른 문제에 거의 직접 사용될 수있을 정도로 질문은 유사합니다.
primo December

1
rscheearch샘플 텍스트 에 마지막 글자가 올바르지 않습니다 .
daniero

10
나는 역전을 한 프로그램에 더 감명을 받았다. (즉, 입력은 스크램블 텍스트이다).
Mr Lister

1
아포스트로피의 위치가 don't같은 위치 에 있어야합니까? 사양은 말합니다 All other formatting must remain the same (capitalization and punctuation, etc.).하지만 어떻게 작동하는지 잘 모르겠습니다 ...
Gaffi

답변:


9

루비 -50 48 문자와 -p명령 행 매개 변수.

gsub(/(?<=\w)\w+(?=\w)/){[*$&.chars].shuffle*''}

-2 문자에 대한 @primo에게 감사합니다.

테스트

➜  codegolf git:(master) ruby -p 9261-cambridge-transposition.rb < 9261.in
Acdrcinog to a racreseher at Cagribmde Ursvetniiy, it dsoen't mttaer in waht odrer the leertts in a word are, the olny ionarpmtt tnhig is that the fsirt and last letetr be at the rghit pcale. The rset can be a taotl mses and you can slitl raed it wthiuot perlbom. Tihs is buaecse the hmuan mind does not raed ervey lteetr by ietlsf but the word as a wlhoe.

1
루비는 \K너비가 0 인 룩 어설 션을 지원하지 않습니까? 또한 가장 안쪽 그룹화는 필요하지 $&않고 대신 사용 합니다 $1.
primo December

@primo, 나는 그것이 작동하지 않으며, 참조 페이지에서 그것을 찾지 못했다고 생각합니다. $&팁 주셔서 감사합니다 :)
Dogbert

네가 옳아. 나는 그들이 PHP처럼;) 펄 정규식을 직접 찍은 것으로 생각합니다;)
primo

3
codegolf대본 에 대해 더 알려주세요
Sparr

1
몇 년 후, 셔플 : [*$&.chars]=> 전에 새 배열을 만들 필요가 없으므로 $&.chars3 바이트가 절약됩니다.
daniero

5

파이썬, 118

파이썬은 이와 같은 것들에 매우 어색합니다!

from random import*
for w in raw_input().split():l=len(w)-2;print l>0and w[0]+''.join((sample(w[1:-1],l)))+w[-1]or w,

보너스

나는 영리하다고 생각한 다른 것들을 시도했지만 모든 종류의 것을 가져와야하며 많은 메소드에는 반환 값이 없지만 자체 명령문으로 별도로 호출해야합니다. 최악의 경우 문자열을 목록으로 변환 한 다음 join다시 문자열로 다시 연결 해야하는 경우 입니다.

어쨌든, 여기에 내가 시도한 것들이 있습니다.

정규식!
import re,random
def f(x):a,b,c=x.group(1,2,3);return a+''.join(random.sample(b,len(b)))+c
print re.sub('(\w)(\w+)(\w)',f,raw_input())
순열!
import itertools as i,random as r
for w in raw_input().split():print''.join(r.choice([x for x in i.permutations(w)if w[0]+w[-1]==x[0]+x[-1]])),
직접 및 목록의 파티션을 셔플 할 수 shuffle반환 None, 야호!
from random import*
for w in raw_input().split():
 w=list(w)
 if len(w)>3:v=w[1:-1];shuffle(v);w[1:-1]=v
 print ''.join(w),

4

PHP 84 바이트

<?for(;$s=fgets(STDIN);)echo preg_filter('/\w\K\w+(?=\w)/e','str_shuffle("\0")',$s);

정규식을 사용하여 최소 4 3 자 길이 †의 단어를 캡처 하고 내부 문자를 섞습니다. 이 코드는 여러 줄의 입력도 처리 할 수 ​​있습니다.

한 줄의 입력 만 필요한 경우 (예와 같이) 68 바이트 로 줄일 수 있습니다

<?=preg_filter('/\w\K\w+(?=\w)/e','str_shuffle("\0")',fgets(STDIN));

중간에 문자가 하나뿐이므로 섞어도 상관 없습니다.


3

J (48)

''[1!:2&4('\w(\w+)\w';,1)({~?~@#)rxapply 1!:1[3

설명:

  • 1!:1[3: stdin에서 모든 입력을 읽습니다.
  • rxapply: 주어진 함수를 정규식과 일치하는 입력 부분에 적용하십시오.
  • ({~?~@#): 입력을 뒤섞는 동사 기차 : #길이를 세고, 이것은 ?0에서 N까지 N 개의 고유 한 숫자를주는 양쪽에 적용 {되며, 입력 배열에서 해당 인덱스의 요소를 선택합니다.
  • ('\w(\w+)\w';,1): 정규식을 사용하지만 첫 번째 그룹의 값만 사용하십시오.
  • [1!:2&4: 형식화되지 않은 출력을 stdout으로 보냅니다.
  • ''[: 형식화 된 출력을 억제합니다. 그렇지 않으면 터미널 라인에 맞는 출력 부분 만 출력하고로 끝나기 때문에 필요 ...합니다.

3

레티 나 , 10 바이트

?V`\B\w+\B

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

이 오래된 도전은 새로운 Retina를 위해 만들어졌습니다!

설명

\B\w+\B경계가없는 문자 그룹, 즉 단어를 시작하거나 종료하지 않는 문자 그룹과 일치합니다. 정규 표현식은 욕심이 많으므로 첫 번째와 마지막 단어를 제외한 모든 단어와 일치합니다.

V"reverse"단계이며, 정규식과 일치 할 때마다 문자 순서를 반대로합니다. ?옵션을 사용하면 대신 스크램블됩니다.



1

APL 107

불행히도 내 APL 인터프리터는 정규 표현식을 지원하지 않으므로 스크램블 할 텍스트가 변수 t에 저장되는 홈 롤 버전이 있습니다.

⎕av[((~z)\(∊y)[∊(+\0,¯1↓n)+¨n?¨n←⍴¨y←(~z←×(~x)+(x>¯1↓0,x)+x>1↓(x←~53≤(∊(⊂⍳26)+¨65 97)⍳v←⎕av⍳,t),0)⊂v])+z×v]

기본적으로 코드는 알파벳 문자만을 기준으로 텍스트를 단어로 분할 한 다음 해당 단어의 첫 문자와 마지막 문자 사이의 문자로 분할합니다. 그런 다음이 문자들이 스크램블되고 전체 문자열이 재 조립됩니다.


1

APL, 58 49

나는 이것이 IBM APL2에서 작동한다고 생각합니다 (IBM APL이 없습니다)

({⍵[⌽∪t,⌽∪1,?⍨t←⍴⍵]}¨x⊂⍨~b),.,x⊂⍨b←' ,.'∊⍨x←⍞,' '

그렇지 않은 경우 Dyalog APL에서 앞에 추가하십시오.

 ⎕ML←3⋄

6자를 추가합니다


단어가 아닌 문자 만 공백, 쉼표 및 마침표로 가정합니다.


여전히 골프는 가능하지만 아이폰에 APL 기호가 없습니다 ...
TwiNight

1

VBA 351 373 / 409

Sub v(g)
m=1:Z=Split(g," "):j=UBound(Z)
For u=0 To j
t=Z(u):w=Len(t):l=Right(t,1):If Not l Like"[A-Za-z]" Then w=w-1:t=Left(t,w):e=l Else e=""
If w>3 Then
n=Left(t,1):p=w-1:s=Right(t,p):f=Right(t,1)
For p=1 To p-1
q=w-p:r=Int((q-1)*Rnd())+1:n=n & Mid(s,r,1):s=Left(s,r-1) & Right(s,q-r)
Next
Else
n=t:f=""
End If
d=d & n & f & e & " "
Next
g=d
End Sub

대체 (더 큰) 방법 :

Sub v(g)
m=1:Z=Split(g," "):j=UBound(Z)
For u=0 To j
t=Split(StrConv(Z(u),64),Chr(0)):w=UBound(t)-1:l=Asc(t(w)):If l<64 Or (l>90 And l<97) Or l>122 Then e=t(w):w=w-1 Else e=""
If w>3 Then
n=t(0):p=w-1:s=""
For i=-p To -1
s=t(-i) & s
Next
f=t(w)
For p=1 To p-1
r=Int((w-p)*Rnd())+1:n=n & Mid(s,r,1):s=Left(s,r-1) & Right(s,w-p-r)
Next
n=n & s
Else
n=Z(u):f="":e=""
End If
d=d & n & f & e & " "
Next
g=d
End Sub

이 두 가지 방법 모두로 전달 된 변수의 값을 변경합니다 Sub. 즉

Sub Test()
strTestString = "This is a test."
v strTestString
Debug.Print strTestString
End Sub

다음과 같이 출력됩니다 :

"Tihs is a tset."

또한 이것은 단어 중간 구두점을 무작위로 지정하므로 스펙 100 %에 맞지 않을 수 있습니다.


1

APL NARS 172 자

r←g x;i;s;d;k
s←⎕AV[98..123]∪⎕A
i←1⋄v←''⋄r←''⋄k←⍴x
A:d←''⋄→C×⍳i>k⋄d←x[i]⋄→C×⍳∼d∊s⋄v←v,d⋄i+←1⋄→A
C:v←{t←¯2+⍴r←⍵⋄t≤1:r⋄r[1+t?t]←⍵[1+⍳t]⋄r}v
r←∊r,v,d
v←''⋄i+←1⋄→A×⍳i≤k
g x←⍞

13 + 17 + 18 + 44 + 41 + 8 + 17 + 5 + 9 = 172; 이 함수 g ()에는 문자열로 입력이 있습니다. 문자열로 출력했습니다. 인용 된 문자열에 \ '를 삽입하는 방법을 모르기 때문에 입력 명령을 추가합니다. 댓글

∇r←g x;i;s;d;k
   ⍝ words are element of  a-zA-Z separed from all other
   s←⎕AV[98..123]∪⎕A ⍝a-zA-Z ascii ⎕IO = 1
   i←1⋄v←''⋄r←''⋄k←⍴x
A:   d←''⋄→C×⍳i>k⋄d←x[i]⋄→C×⍳∼d∊s⋄v←v,d⋄i+←1⋄→A
C:      v←{t←¯2+⍴r←⍵⋄t≤1:r⋄r[1+t?t]←⍵[1+⍳t]⋄r}v
        r←∊r,v,d
        v←''⋄i+←1⋄→A×⍳i≤k
∇

결과

g x←⍞
According to a researcher at Cambridge University, it doesn't matter in what order the letters in a word are, the only important thing is that the first and last letter be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself but the word as a whole.
  Androiccg to a rhraeecser at Cgirbdmae Uirevtsiny, it deson't mtetar in waht oderr the ltrtees in a wrod are, the olny intro
  apmt tinhg is taht the frsit and lsat lteter be at the rghit pacle. The rset can be a ttaol mses and you can siltl rae
  d it wtuhoit poeblrm. Tihs is bcsauee the hmaun mnid deos not raed eervy lteter by isletf but the wrod as a wolhe.

1

경쟁하지 않는 PHP 7.1, 80 바이트

for(;$w=$argv[++$i];)echo$w[3]?$w[0].str_shuffle(substr($w,1,-1)).$w[-1]:$w," ";

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -nr. (구두점에서 분명히 실패합니다)


1

PHP, 94 + 1 바이트

-R깃발 +1

<?=preg_replace_callback("/(?<=\w)\w+(?=\w)/",function($m){return str_shuffle($m[0]);},$argn);

를 통한 파이프 입력 php -nR '<code>'.

참고 : preg_replace_callback4.0.5에서 PHP가 출시되었습니다. 클로저는 PHP 5.3에서 도입되었습니다.
PHP 5.3 이상이 필요합니다.

불행히도 하위 패턴이 없어도 일치는 항상 배열로 전송
되므로 str_shuffle콜백으로 사용할 수 없으므로 29 바이트를 절약 할 수 있습니다.


1

자바 스크립트, 76 67 바이트

Arnauld 덕분 에 -9 바이트.

t=>t.replace(/\B\w+\B/g,m=>[...m].sort(_=>Math.random()-.5).join``)

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


언 골프

t =>                  // function with a single argument
     t.replace(       // Replace ...
         /\B\w+\B/g,  // every match of the regex
         m => ...     // with the return value of the replacement function
     )

/       /g            // Match all occurences of
   \w+                // 1 or more word chars ...
 \B   \B              // ... that aren't on the beginning or end of the word

m =>                  // Replacement function
     [...m]           // convert matched string to a list of chars
       .sort(_ => Math.random()-.5) // sort with a random comparision function
       .join``        // join the list into a single string


사용할 수 있습니다 /\B\w+\B/g. (그러나 현상금의 경우 코드 길이는 중요하지 않습니다. )
Arnauld

1
@Arnauld 감사합니다. 이것이 여전히 코드 골프이기 때문에 모든 바이트가 중요합니다.
ovs

@Arnauld 여전히 심각한 경쟁자 규칙이 적용됩니다.
user202729

1
@trejder 필요에 따라 코드를 수정하는 데 도움이되는 설명을 추가했습니다. 현재 형식으로 코드는 대부분의 브라우저에서 잘 실행됩니다. 실제 코드에서 이것을 사용하려면 문자를 임의 순서로 섞는 방식을 균일 한 알고리즘으로 변경해야합니다.
ovs

0

R, 179

단어 문제에서 무작위 문자에 대해 쓴 함수를 사용합니다 .

입력:

s <- "According to a researcher at Cambridge University, it doesn't matter in what order the letters in a word are, the only important thing is that the first and last letter be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself but the word as a whole."

해결책:

f=function(w){l=length;s=strsplit(w,"")[[1]];ifelse(l(s)<3,w,paste(c(s[1],sample(s[2:(l(s)-1)]),s[l(s)]),collapse=""))}
g=Vectorize(f)
paste(g(strsplit(s," ")[[1]]), collapse=" ")

결과:

[1] "Arioccdng to a reehaecrsr at Cabrgimde Uveirisnyt, it des'not mttear in waht odrer the lttrees in a wrod are, the olny inpotmart thnig is that the fsrit and lsat letetr be at the right palce. The rset can be a toatl mses and you can stlil raed it wutioht pmrlebo. This is bsuceae the hmuan mnid deos not read ervey lteetr by iesltf but the word as a wleho."


0

Japt , 32 바이트

m@Xl ¨4?Xg0 +Xs1J ö(x) +XgJ:X}" 

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


브라우저에서 Japt를 직접 실행할 수 있습니까? 외부 라이브러리, 컴파일러 등이 없습니까? 그렇지 않으면 유감스럽게도 현상금 규칙 (순수한 웹 브라우저에서 작동하는 솔루션 필요)에 따라 계산되지 않습니다. 두 번째로, Cambridge Transposition의 원래 규칙은 여기에 표시된 것과 약간 다릅니다 (OP 질문). OP의 질문에서와 같이 4 + 문자 대신 5 + 문자 길이의 단어를 스크램블하도록 코드를 수정할 수 있습니까?
trejder

1
@trejder 모든 제출물은 원래 질문의 규칙을 준수해야합니다. 이렇게 수정하면 유효하지 않습니다.
user202729

1
@trejder Japt는 컴파일러없이 브라우저에서 직접 실행할 수 없습니다. 둘째, 코드에서 4를 5로 바꾸면 5 자 이상의 긴 단어 만 스크램블해야합니다.
Bejofo

0

Java, 1557 834 bytes 팁을위한 @JoKing 덕분입니다.

경쟁에 조금 늦었다. 이 문제를 시작한 것을 잊었습니다.

골프

import java.util.*;public class s{ public static void main(String[] args){ Scanner s=new Scanner(System.in);String a=s.next();String[] q=a.split("\\s+");for (int i=0;i<q.length;i++) { q[i]=q[i].replaceAll("[^\\w]", ""); }String f="";for (String z:q) { f+=scramble(z);f+=" "; }System.out.print(f); }private static String scramble(String w){if(w.length()==1||w.length()==2){return w;}char[]l=w.toCharArray();char q=l[w.length()-1];String e=Character.toString(l[0]);char[]n=new char[l.length-2];for(int i=0;i<l.length-2;i++){n[i]=l[i+1];}HashMap<Integer,Character>s=new HashMap<>();int c=1;for(char p:n){s.put(c,p);c++;}HashMap<Integer,Integer>o=new HashMap<>();Random z=new Random();for(int i=0;i<w.length()-2;i++){int m=z.nextInt(n.length);while(o.getOrDefault(m,0) == 1){m=z.nextInt(n.length);}e+=s.get(m+1);o.put(m,1);}return e+=q;}}

골퍼가 아닌

import java.util.HashMap;
import java.util.Random;

public class SentenceTransposition {
    public static void main(String[] args) {
        String input = "According to a researcher at Cambridge University, it doesn't matter in what order the letters in a word are, the only important thing is that the first and last letter be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself but the word as a whole.";
        String[] words = input.split("\\s+");
        for (int i = 0; i < words.length; i++) {
            words[i] = words[i].replaceAll("[^\\w]", "");
        }
        String finalsentence = "";
        for (String word : words) {
            finalsentence += scramble(word);
            finalsentence += " ";
        }
        System.out.println(finalsentence);
    }

    private static String scramble(String word) {
        if (word.length() == 1 || word.length() == 2) {
            return word;
        }
        char[] letters = word.toCharArray();
        char lletter = letters[word.length()-1];
        String endword = Character.toString(letters[0]);
        char[] nletters = new char[letters.length-2];
        for (int i = 0; i < letters.length-2; i++) {
            nletters[i] = letters[i+1];
        }
        HashMap<Integer, Character> set = new HashMap<>();
        int count = 1;
        for (char nletter : nletters) {
            set.put(count, nletter);
            count++;
        }
        HashMap<Integer, Integer> chosen = new HashMap<>();
        Random random = new Random();
        for (int i = 0; i < word.length()-2; i++) {
            int cur = random.nextInt(nletters.length);
            while (chosen.getOrDefault(cur,0) == 1) {
                cur = random.nextInt(nletters.length);
            }
            endword += set.get(cur+1);
            chosen.put(cur, 1);
        }
        return endword += lletter;
    }
}

공백을 많이 제거 할 수있는 것 같습니다. 자바 골프 팁을 보았습니까 ? 편집 : 또한 입력이 하드 코딩 된 것 같습니다. 대신 사용자로부터 입력을 받아야합니다
Jo King

@JoKing 아 좋아. 사용자로부터 입력을받습니다.
Jaden Lee

나는 그것이 작동하지 않는다는 것을 깨닫기 전에 이것을 650 바이트로 골프를 쳤다.
Quintec

@Quintec 내 코드가 작동하지 않는다는 의미입니까?
Jaden Lee

0

Sidef , 89 85 바이트

차단 (익명 호출 가능) :

{.words.map{[_[0],(_.len-1?([_[1..^(_.len-1)]].shuffle...,_[1]):'')].join}.join(' ')}

다음과 같이 사용될 때 출력 { ... }('..'):

 I hvae nveer not ocne in my life slleepd nhedatarnel crtreolcy
 I have never not once in my lfie sepelld naetadenrhl ccrtloery

다소 풀리지 않은

.words.map{
  [
    .first,
    (_.len-1
      ? (  [ _[1..^(_.len-1)] ].shuffle..., .last )
      : '')
  ].join
}.join(' ')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.