Chuyển vị Cambridge


21

Tôi chắc chắn rằng, nếu không phải tất cả, bạn đã bắt gặp điều này vào lúc này hay lúc khác:

Aoccdrnig cho một rscheearch tại Cmabrigde Uinervtisy, nó không phải là mttaer trong waht oredr các ltteer trong một wrod là, olny iprmoetnt tihng là người đầu tiên và là người sáng lập. Các cuộc đua có thể là một toatl mses và bạn có thể ngồi đó ra nó ngay lập tức. Tihs là bcuseae, huamn mnid deos không ra mắt lteter lerve bằng istlef, nhưng wrod như một wlohe.

  • Tạo một chương trình nhập bất kỳ số lượng văn bản. Đối với mục đích thử nghiệm, sử dụng phiên bản được xắp xếp lại của văn bản trên, được tìm thấy bên dưới.

  • Chương trình sau đó phải hoán đổi ngẫu nhiên các chữ cái của mỗi từ có độ dài từ 4 chữ cái trở lên, ngoại trừ chữ cái đầu tiên và chữ cái cuối của mỗi từ.

  • Tất cả các định dạng khác phải giữ nguyên (viết hoa và chấm câu, v.v.).

Kiểm tra văn bản:

Theo một nhà nghiên cứu tại Đại học Cambridge, việc các chữ cái trong một từ được sắp xếp theo thứ tự là gì, điều quan trọng duy nhất là chữ cái đầu tiên và chữ cái cuối cùng được đặt đúng chỗ. Phần còn lại có thể là một mớ hỗn độn và bạn vẫn có thể đọc nó mà không gặp vấn đề gì. Điều này là do tâm trí con người không tự mình đọc từng chữ cái mà là toàn bộ từ.

Như thường lệ, đây là một môn đánh gôn. Mã ngắn nhất sẽ thắng.


2
Tương tự như Cách ngẫu nhiên các chữ cái trong một từ , mặc dù trong đó chỉ có một từ duy nhất cần được xáo trộn trong khi ở đây là mỗi từ trong một câu.
Gareth

Tôi đồng ý. Các câu hỏi tương tự nhau đủ để các giải pháp cho một vấn đề có thể được sử dụng gần như trực tiếp cho vấn đề kia.
Primo

1
Thư cuối cùng không đúng trong rscheearchvăn bản mẫu của bạn.
daniero

10
Tôi sẽ ấn tượng hơn với một chương trình đã làm ngược lại (tức là đầu vào là văn bản được xáo trộn).
Ông Lister

1
Phải giữ vị trí của dấu nháy đơn ở don'tcùng một vị trí? Thông số kỹ thuật nói All other formatting must remain the same (capitalization and punctuation, etc.).nhưng tôi không chắc cách thức hoạt động ở đây ...
Gaffi 20/03/13

Câu trả lời:


9

Ruby - 50 48 ký tự, cộng với -ptham số dòng lệnh.

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

Cảm ơn @primo cho -2 char.

Kiểm tra

➜  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
Ruby không hỗ trợ \Kcho khẳng định nhìn phía sau không? Ngoài ra, việc nhóm trong cùng là không cần thiết, sử dụng $&thay vì $1.
primo

@primo, tôi nghĩ là không, nó không hoạt động và tôi cũng không tìm thấy nó trong bất kỳ trang tham khảo nào. Cảm ơn vì tiền $&boa :)
Dogbert

Bạn đúng. Tôi đoán tôi giả sử họ đã lấy perl regex trực tiếp, như php hiện;)
primo

3
cho tôi biết thêm về codegolfkịch bản này
Sparr

1
Nhiều năm sau, nhưng: Không cần tạo một mảng mới trước khi xáo trộn: [*$&.chars]=> $&.chars, tiết kiệm 3 byte.
daniero

5

Con trăn, 118

Python cực kỳ lúng túng cho những thứ như thế này!

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,

Tiền thưởng

Tôi đã thử một số thứ khác mà tôi nghĩ sẽ thông minh, nhưng bạn phải nhập tất cả các loại, và rất nhiều phương thức không có giá trị trả về, nhưng cần được gọi riêng như tuyên bố riêng. Điều tồi tệ nhất là khi bạn cần chuyển đổi chuỗi thành danh sách và sau đójoin nó trở lại chuỗi.

Dù sao, đây là một số điều mà tôi đã thử:

Regex!
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())
Hoán vị!
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]])),
Bạn không thể xáo trộn một phân vùng của một danh sách trực tiếp và shuffletrả về None, yay!
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 byte

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

Sử dụng một regex để từ chụp được ít nhất 4 3 chữ cái dài , và xáo trộn các nhân vật bên trong. Mã này có thể xử lý đầu vào với nhiều dòng là tốt.

Nếu chỉ cần một dòng đầu vào (như trong ví dụ), điều này có thể giảm xuống còn 68 byte

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

Chỉ có một lá thư ở giữa, vì vậy nó không quan trọng nếu bạn xào bài.


3

J (48)

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

Giải trình:

  • 1!:1[3: đọc tất cả đầu vào từ stdin
  • rxapply: áp dụng hàm đã cho cho các phần của đầu vào khớp với biểu thức chính quy
  • ({~?~@#): một động từ huấn luyện xáo trộn đầu vào của nó: #đếm độ dài, điều này được áp dụng cho cả hai mặt của ?việc đưa N số khác nhau từ 0 đến N, {sau đó chọn các phần tử tại các chỉ số đó từ mảng đầu vào.
  • ('\w(\w+)\w';,1): sử dụng regex đó nhưng chỉ sử dụng giá trị từ nhóm đầu tiên
  • [1!:2&4: gửi đầu ra không được định dạng đến thiết bị xuất chuẩn
  • ''[: triệt tiêu đầu ra được định dạng. Điều này là cần thiết bởi vì nếu không nó chỉ xuất ra một phần của đầu ra phù hợp với một dòng thiết bị đầu cuối và sau đó kết thúc bằng ....

3

Võng mạc , 10 byte

?V`\B\w+\B

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

Này, thử thách cũ này được thực hiện cho Retina mới!

Giải trình

\B\w+\Bkhớp với các nhóm chữ cái giữa các ranh giới, đó là các nhóm chữ cái không bắt đầu hoặc kết thúc một từ. Vì regexes rất tham lam, nên điều này sẽ khớp với tất cả các chữ cái của một từ trừ từ đầu tiên và cuối cùng.

Vlà giai đoạn "đảo ngược", đảo ngược thứ tự các ký tự trong mỗi trận đấu của regex. Với ?tùy chọn nó thay thế chúng.


Tôi đã xảy ra điều này sau khi tìm thấy một giải pháp 10 byte khác .
FryAmTheEggman

1

APL 107

Thật không may, trình thông dịch APL của tôi không hỗ trợ regex, vì vậy đây là phiên bản cuộn tại nhà, nơi văn bản được xáo trộn được lưu trữ trong biến 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]

Về cơ bản, mã phân vùng văn bản thành các từ chỉ dựa trên các chữ cái của bảng chữ cái và sau đó thành các chữ cái giữa các chữ cái đầu tiên và cuối cùng của các từ đó. Các chữ cái này sau đó được xáo trộn và toàn bộ chuỗi ký tự được ghép lại.


1

APL, 58 49

Tôi tin rằng điều này hoạt động trong IBM APL2 (Tôi không có IBM APL)

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

Nếu không, thì trong Dyalog APL, thêm vào phía trước:

 ⎕ML←3⋄

có thêm 6 ký tự


Điều này giả sử các ký tự không phải từ duy nhất là dấu cách, dấu phẩy và dấu chấm.


Vẫn có thể chơi được nhưng tôi không có biểu tượng APL trên iPhone ...
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

Phương pháp thay thế (lớn hơn):

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

Cả hai phương thức này đều thay đổi giá trị của biến được truyền cho Sub. I E

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

sẽ xuất ra một cái gì đó như thế này:

"Tihs is a tset."

Ngoài ra, điều này không ngẫu nhiên dấu câu giữa từ, vì vậy điều này có thể không phù hợp với thông số 100%.


1

APL NARS 172 ký tự

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; Hàm g () này có đầu vào là một chuỗi; có đầu ra dưới dạng một chuỗi. Tôi thêm lệnh đầu vào vì tôi không biết cách chèn \ 'trong chuỗi được trích dẫn. Đã bình luận

∇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
∇

kết quả

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, không cạnh tranh, 80 byte

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

lấy đầu vào từ các đối số dòng lệnh. Chạy với -nr. (rõ ràng sẽ thất bại tại dấu câu)


1

PHP, 94 + 1 byte

+1 cho -Rcờ

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

Đầu vào ống qua php -nR '<code>'.

Lưu ý: preg_replace_callbackđã đến với PHP trong 4.0.5; đóng cửa được giới thiệu trong php 5.3;
vì vậy điều này đòi hỏi PHP 5.3 trở lên.

Thật không may, trận đấu luôn được gửi dưới dạng một mảng, ngay cả khi không có mẫu phụ,
do đó tôi không thể chỉ sử dụng str_shufflelàm cuộc gọi lại, sẽ tiết kiệm được 29 byte.


1

JavaScript, 76 67 byte

cảm ơn Arnauld cho -9 byte.

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

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


Ung dung

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ạn có thể sử dụng /\B\w+\B/g. (Nhưng đối với tiền thưởng, lưu ý rằng độ dài mã không quan trọng. )
Arnauld

1
@Arnauld cảm ơn rất nhiều. Vì đây vẫn là codegolf, mỗi byte đều có giá trị.
OVS

@Arnauld Quy tắc ứng cử viên nghiêm túc vẫn được áp dụng.
dùng202729

1
@trejder Tôi đã thêm một lời giải thích sẽ giúp bạn sửa đổi mã cho nhu cầu của bạn. Ở dạng hiện tại, mã sẽ chạy tốt trong hầu hết các trình duyệt. Nếu bạn muốn sử dụng mã này trong mã thực, có lẽ bạn nên thay đổi cách xáo trộn các ký tự thành thuật toán thống nhất.
trứng

0

R, 179

Sử dụng hàm tôi đã viết cho các chữ cái ngẫu nhiên trong một vấn đề từ :

Đầu vào:

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

Dung dịch:

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=" ")

Kết quả:

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

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

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


Tôi có thể chạy Japt trực tiếp trên trình duyệt không? Nếu không có bất kỳ thư viện bên ngoài, trình biên dịch, vv? Nếu không thì điều này không may không được tính theo quy tắc tiền thưởng (cần giải pháp hoạt động trong trình duyệt web thuần túy). Điều thứ hai, như tôi nghĩ rằng các quy tắc ban đầu cho Cambridge Transpose có một chút khác biệt so với hiển thị ở đây (trong câu hỏi của OP). Có thể sửa đổi mã của bạn để xáo trộn các từ dài hơn 5 chữ cái (thay vì dài hơn 4 chữ cái, như trong câu hỏi của OP) không?
trejder

1
@trejder Tất cả các bài nộp phải tuân theo các quy tắc trong câu hỏi ban đầu. Sửa đổi nó như thế này sẽ làm cho nó không hợp lệ.
dùng202729

1
@trejder Japt không thể chạy trực tiếp trong trình duyệt mà không có trình biên dịch. Thứ hai, nếu bạn thay 4 trong mã bằng 5 thì chỉ nên xáo trộn 5+ chữ dài.
Bejofo

0

Java, 1557 834 byte Nhờ @JoKing cho các mẹo.

Một chút muộn để cạnh tranh. Quên rằng tôi đã bắt đầu về vấn đề này.

Chơi gôn

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

Không chơi gôn

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

Dường như có rất nhiều khoảng trắng bạn có thể loại bỏ. Bạn đã xem qua Mẹo chơi golf trong Java chưa? chỉnh sửa: đồng thời, bạn dường như có đầu vào được mã hóa cứng. Thay vào đó, bạn nên lấy dữ liệu từ người dùng
Jo King

@JoKing ah ok. Tôi sẽ lấy đầu vào từ người dùng.
Jaden Lee

Tôi đã quản lý để đánh golf xuống tới 650 byte trước khi nhận ra rằng nó không hoạt động.
Quintec

@Quintec bạn có nghĩa là mã của tôi không hoạt động?
Jaden Lee

0

Sidef , 89 85 byte

Chặn (có thể gọi ẩn danh):

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

Đầu ra, khi được sử dụng như { ... }('..'):

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

Hơi vô dụng

.words.map{
  [
    .first,
    (_.len-1
      ? (  [ _[1..^(_.len-1)] ].shuffle..., .last )
      : '')
  ].join
}.join(' ')
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.