剑桥换位


21

我敢肯定,你们当中的大多数人(即使不是全部)在某个时候或另一个时候也遇到了这个问题:

对Cmabrigde Uinervtisy的一名总督来说,它并没有在一大堆的杂物里留下任何痕迹,所有的同业者都是第一个人,而lsat的杂物则是在旧的地方。该rset可以是toatl mses,并且您可以将其设置为wathit porbelm。蒂斯是布斯科,不是伊斯兰教徒,而是像世俗的人。

  • 创建一个输入任意数量的文本的程序。为了进行测试,请使用下面提供的上述文本的完整版本。

  • 然后,程序必须随机转置每个单词的字母(长度不超过4个或更多),每个单词的第一个和最后一个字母除外。

  • 所有其他格式必须保持相同(大写和标点等)。

测试文字:

据剑桥大学的研究人员说,单词中字母的顺序无关紧要,唯一重要的是第一个和最后一个字母在正确的位置。其余的可能是一团糟,您仍然可以毫无问题地阅读它。这是因为人类的思想不是只阅读每个字母,而是阅读整个单词。

像往常一样,这是一个代码高尔夫球。最短的代码胜出。


2
如何随机化单词中的字母类似,尽管其中只需要扰乱一个单词,而这是句子中的每个单词。
Gareth

我同意。这些问题非常相似,因此一个问题的解决方案几乎可以直接用于另一个问题。
primo 2012年

1
rscheearch示例文字中的最后一个字母不正确。
daniero 2012年

10
我对执行相反操作的程序印象深刻(即输入是加扰的文本)。
李斯特先生,2012年

1
撇号的位置必须don't保持在同一位置吗?规范说,All other formatting must remain the same (capitalization and punctuation, etc.).但是我不确定在这里如何解决……
Gaffi

Answers:


9

Ruby- 50 48个字符,加上-p命令行参数。

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

感谢@primo提供-2个字符。

测试

➜  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不支持\K零宽度后向断言?另外,使用$&代替,也不需要最里面的分组$1
primo 2012年

@primo,我认为不行,它不起作用,我也没有在任何参考页中找到它。感谢$&提示:)
Dogbert

你是对的。我想我以为他们像PHP一样直接采用了perl regex;)
primo 2012年

3
告诉我更多有关此codegolf脚本的信息
Sparr

1
多年之后,但是:不需要在洗牌之前创建新的数组:[*$&.chars]=> $&.chars,节省了3个字节。
daniero

5

巨蟒,118

Python对于这样的事情非常尴尬!

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是“反向”阶段,它会反转正则表达式每次匹配中的字符顺序。使用该?选项时,它将对它们进行加扰。


在找到另一个10字节的解决方案后,我偶然发现了这一点。
FryAmTheEggman

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个字符


假设唯一的非单词字符是空格,逗号和句点。


仍然可以打高尔夫球,但我在iPhone上没有APL符号...
TwiNight

1

VBA,351373 /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字节

+1代表-R旗帜

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

管道输入通过php -nR '<code>'

注意: preg_replace_callbackPHP是从4.0.5开始的;封闭是在PHP 5.3中引入的;
因此,这需要PHP 5.3或更高版本。

不幸的是,即使没有子模式,匹配项也总是作为数组发送,
因此我不能仅用str_shuffle作回调函数,这样可以节省29个字节。


1

JavaScript,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 '18年

@Arnauld严格的竞争者规则仍然适用。
user202729

1
@trejder我添加了一个解释,该解释应该可以帮助您根据需要修改代码。以目前的形式,该代码应可在大多数浏览器中正常运行。如果要在实际代码中使用此代码,则可能应将其将字符改组的方式更改为统一算法。
ovs '18

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

Pyth,23个字节

jdm?gld4++hd.<Ptd1eddcz

不参加竞争,因为Pyth是在发布此挑战后进行的。

在线尝试


0

Japt,32字节

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

在线尝试!


我可以直接在浏览器中运行Japt吗?没有任何外部库,编译器等?如果不是这样,那么不幸的是,这并不算是赏金规则(需要在纯Web浏览器中使用的解决方案)。第二件事,因为我认为Cambridge Transposition的原始规则与此处显示的(在OP问题中)有所不同。是否可以修改您的代码来加扰5个以上字母的单词(而不是像OP的问题那样加长4个以上字母的单词)?
trejder

1
@trejder所有提交的内容都必须符合原始问题中的规则。像这样修改它会使它无效。
user202729

1
如果没有编译器,@ trejder Japt不能直接在浏览器中运行。其次,如果将代码中的4替换为5,则只能加扰5个以上字母的单词。
Bejofo

0

Java,1557 834字节 感谢@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;
    }
}

看来您可以删除很多空白。您是否看过Java打高尔夫球的技巧?编辑:而且,您似乎已经对输入进行了硬编码。你应该从用户采取投入代替
乔金

@JoKing啊,好的。我将接受用户的输入。
Jaden Lee

在意识到它不起作用之前,我设法将其压缩到650字节。
Quintec

@Quintec您的意思是我的代码不起作用吗?
Jaden Lee

0

Sidef89 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(' ')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.