Cambridge-Umsetzung


21

Ich bin sicher , dass die meisten, wenn nicht alle, Sie haben über diese kommen zu einem bestimmten Zeitpunkt oder ein anderes:

Nach einer Recherche bei Cmabrigde Uinervtisy sollte es nicht anders sein, als es zu tun, und es sollte am Anfang und am Ende sein. Das Rset kann ein Toatl mses sein und Sie können es mit Porbelm raed. Tihs ist bcuseae die huamn mnid deos nicht raed ervey lteter von istlef, aber das wrod als ein wlohe.

  • Erstellen Sie ein Programm, das eine beliebige Textmenge eingibt. Verwenden Sie zu Testzwecken die unverschlüsselte Version des obigen Textes, die Sie unten finden.

  • Das Programm muss dann die Buchstaben jedes Wortes mit einer Länge von 4 oder mehr Buchstaben zufällig transponieren, mit Ausnahme des ersten und letzten Buchstabens jedes Wortes.

  • Alle anderen Formatierungen müssen unverändert bleiben (Groß- und Kleinschreibung, Satzzeichen usw.).

Testtext:

Laut einem Forscher der Universität Cambridge spielt es keine Rolle, in welcher Reihenfolge die Buchstaben in einem Wort stehen. Wichtig ist nur, dass der erste und der letzte Buchstabe an der richtigen Stelle stehen. Der Rest kann ein totales Durcheinander sein und man kann es immer noch ohne Probleme lesen. Dies liegt daran, dass der menschliche Verstand nicht jeden Buchstaben für sich liest, sondern das Wort als Ganzes.

Wie immer ist dies ein Code-Golf. Kürzester Code gewinnt.


2
Ähnlich wie bei Wie man Buchstaben in einem Wort zufällig sortiert , obwohl in diesem nur ein einziges Wort verschlüsselt werden muss, während es hier jedes Wort in einem Satz ist.
Gareth

Genau. Die Fragen sind ähnlich genug, dass Lösungen für ein Problem fast direkt für das andere verwendet werden können.
Primo

1
Der letzte Buchstabe ist rscheearchin Ihrem Beispieltext nicht richtig .
Daniero

10
Ich wäre mehr beeindruckt von einem Programm, das das Gegenteil bewirkt hat (dh die Eingabe ist der verschlüsselte Text).
Mr Lister

1
Muss die Position des Apostrophs don'tin der gleichen Position bleiben? Die Spezifikation sagt, All other formatting must remain the same (capitalization and punctuation, etc.).aber ich bin nicht sicher, wie das hier funktioniert ...
Gaffi

Antworten:


9

Rubin - 50 48 Zeichen plus -pBefehlszeilenparameter.

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

Danke @primo für -2 Zeichen.

Prüfung

➜  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 unterstützt keine \KLook-Behind-Behauptung mit der Breite Null? Auch ist die innerste Gruppierung unnötig, indem $&statt $1.
Primo

@primo, ich denke nicht, es funktioniert nicht und ich habe es auch auf keiner Referenzseite gefunden. Danke für den $&Tipp :)
Dogbert

Du hast recht. Ich nehme an, dass sie Perl Regex direkt genommen haben, wie es PHP tut;)
primo

3
Erzählen Sie mir mehr über dieses codegolfSkript
Sparr

1
Viele Jahre später, aber: Es ist nicht erforderlich, vor dem Mischen ein neues Array zu erstellen: [*$&.chars]=> $&.chars, wodurch 3 Bytes eingespart werden.
Daniero

5

Python, 118

Python ist für solche Dinge furchtbar umständlich!

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,

Bonus

Ich habe einige andere Dinge ausprobiert, die ich für klug hielt, aber Sie müssen alle möglichen Dinge importieren, und viele Methoden haben keine Rückgabewerte, sondern müssen separat als eigene Anweisung aufgerufen werden. Das Schlimmste ist, wenn Sie die Zeichenfolge in eine Liste konvertieren und dann joinwieder in eine Zeichenfolge umwandeln müssen .

Wie auch immer, hier sind einige Dinge, die ich ausprobiert habe:

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())
Permutationen!
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]])),
Sie können eine Partition einer Liste nicht direkt mischen und shufflekehren zurück 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 Bytes

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

Verwenden Sie eine Regex, um Wörter mit mindestens 4 bis 3 Buchstaben zu erfassen und die inneren Zeichen zu mischen. Dieser Code kann auch Eingaben mit mehreren Zeilen verarbeiten.

Wenn nur eine Eingabezeile erforderlich ist (wie im Beispiel), kann diese auf 68 Byte reduziert werden

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

Es gibt nur einen Buchstaben in der Mitte, es spielt also keine Rolle, ob Sie ihn mischen.


3

J (48)

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

Erläuterung:

  • 1!:1[3: Liest alle Eingaben von stdin
  • rxapply: Wenden Sie die angegebene Funktion auf die Teile der Eingabe an, die dem regulären Ausdruck entsprechen
  • ({~?~@#): ein Verbzug, der seine Eingabe mischt: #zählt die Länge, dies wird auf beide Seiten angewendet, ?um N verschiedene Zahlen von 0 bis N zu geben, {und wählt dann die Elemente an diesen Indizes aus dem Eingabearray aus.
  • ('\w(\w+)\w';,1): benutze diesen regulären Ausdruck, aber benutze nur den Wert aus der ersten Gruppe
  • [1!:2&4: Sende unformatierte Ausgabe an stdout
  • ''[: Formatierte Ausgabe unterdrücken. Dies ist notwendig, da sonst nur der Teil der Ausgabe ausgegeben wird, der auf eine Terminalleitung passt und dann mit endet ....

3

Retina , 10 Bytes

?V`\B\w+\B

Probieren Sie es online!

Hey, diese alte Herausforderung wurde für die neue Retina gemacht!

Erläuterung

\B\w+\BStellt Gruppen von Buchstaben zwischen nicht begrenzten Zeichen dar, d. h. Gruppen von Buchstaben, die kein Wort beginnen oder enden. Da reguläre Ausdrücke gierig sind, werden alle Buchstaben eines Wortes mit Ausnahme des ersten und des letzten übereinstimmen.

Vist die "umgekehrte" Phase, die die Reihenfolge der Zeichen in jeder Übereinstimmung der Regex umkehrt. Mit der ?Option verschlüsselt es sie stattdessen.


Das habe ich festgestellt, nachdem ich eine andere 10-Byte-Lösung gefunden hatte .
FryAmTheEggman

1

APL 107

Leider unterstützt mein APL-Interpreter keine regulären Ausdrücke. Hier ist eine Home-Roll-Version, in der der zu verschlüsselnde Text in der Variablen t gespeichert ist:

⎕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]

Im Wesentlichen unterteilt der Code den Text in Wörter, die nur auf den Buchstaben des Alphabets basieren, und dann in die Buchstaben zwischen dem ersten und dem letzten Buchstaben dieser Wörter. Diese Buchstaben werden dann verschlüsselt und die gesamte Zeichenkette wieder zusammengesetzt.


1

APL, 58 49

Ich glaube, das funktioniert in IBM APL2 (ich habe keine IBM APL)

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

Wenn nicht, fügen Sie in Dyalog APL Folgendes hinzu:

 ⎕ML←3⋄

Das fügt 6 Zeichen hinzu


Dies setzt voraus, dass die einzigen Nicht-Wort-Zeichen Leerzeichen, Komma und Punkt sind.


Noch golffähig, aber ich habe keine APL-Symbole auf dem 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

Alternative (größere) Methode:

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

Beide Methoden ändern den Wert der Variablen, die an den übergebenen Wert übergeben wird Sub . dh

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

wird so etwas ausgeben:

"Tihs is a tset."

Dadurch wird auch die Interpunktion in der Wortmitte zufällig ausgewählt, sodass die Spezifikation möglicherweise nicht zu 100% passt.


1

APL NARS 172 Zeichen

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; Diese Funktion g () hat eine Eingabe als Zeichenkette; hat die Ausgabe als String. Ich füge den Eingabebefehl hinzu, weil ich nicht weiß, wie \ 'in eine Zeichenfolge in Anführungszeichen eingefügt wird. Kommentiert

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

Ergebnis

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, nicht konkurrierend, 80 Bytes

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit -nr. (wird offensichtlich an der Interpunktion scheitern)


1

PHP, 94 + 1 Bytes

+1 für -RFlagge

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

Rohreingang durch php -nR '<code>'.

Anmerkung: preg_replace_callbackkam zu PHP in 4.0.5; Verschlüsse wurden in PHP 5.3 eingeführt;
Das erfordert PHP 5.3 oder höher.

Leider wird die Übereinstimmung immer als Array gesendet, auch wenn es keine Sub-Patterns gibt,
daher kann ich sie nicht einfach str_shuffleals Callback verwenden, wodurch 29 Bytes eingespart würden.


1

JavaScript, 76 67 Bytes

Danke an Arnauld für -9 Bytes.

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

Probieren Sie es online!


Ungolfed

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


Sie können verwenden /\B\w+\B/g. (Aber für die Kopfgeld, beachten Sie, dass die Codelänge nicht wichtig ist. )
Arnauld

1
@ Arnauld vielen Dank. Da dies immer noch Codegolf ist, zählt jedes Byte.
Ovs

@Arnauld Es gilt weiterhin die ernsthafte Anwärterregel.
user202729

1
@ Trejder Ich habe eine Erklärung hinzugefügt, die Ihnen helfen soll, den Code an Ihre Bedürfnisse anzupassen. In seiner jetzigen Form sollte der Code in den meisten Browsern gut laufen. Wenn Sie dies in echtem Code verwenden möchten, sollten Sie wahrscheinlich die Art und Weise ändern, in der die Zeichen zu einem einheitlichen Algorithmus gemischt werden.
OVS

0

R 179

Mit der Funktion, die ich für die zufälligen Buchstaben in einem Wortproblem geschrieben habe :

Eingang:

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

Lösung:

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

Ergebnis:

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

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

Probieren Sie es online!


Kann ich Japt direkt in einem Browser ausführen? Ohne externe Bibliotheken, Compiler etc.? Wenn nicht, dann zählt dies leider nicht nach den Kopfgeldregeln (brauche eine Lösung, die in einem reinen Webbrowser funktioniert). Zweitens, da ich denke, dass die ursprünglichen Regeln für die Cambridge-Umsetzung etwas anders waren als hier gezeigt (in OP-Frage). Ist es möglich, Ihren Code so zu ändern, dass Wörter mit mehr als 5 Buchstaben verschlüsselt werden (anstelle von mehr als 4 Buchstaben, wie in der Frage von OP)?
Trejder

1
@trejder Alle Einsendungen müssen den Regeln der ursprünglichen Frage entsprechen. Wenn Sie es so ändern, wird es ungültig.
user202729

1
@trejder Japt kann ohne Compiler nicht direkt in einem Browser ausgeführt werden. Zweitens, wenn Sie die 4 im Code durch 5 ersetzen, sollte sie nur Wörter mit mehr als 5 Buchstaben verschlüsseln.
Bejofo

0

Java, 1557 834 Bytes Danke an @JoKing für die Tipps.

Ein bisschen zu spät zum Wettbewerb. Ich habe vergessen, dass ich mit diesem Problem angefangen habe.

Golf gespielt

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

Nicht golfen

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

Es sieht so aus, als ob Sie eine Menge Leerzeichen entfernen können. Haben Sie sich Tipps zum Golfen in Java angesehen? ? edit: auch du scheinst den eingang fest codiert zu haben. Sie sollten stattdessen Eingaben vom Benutzer entgegennehmen
Jo King

@JoKing ah ok. Ich werde Eingaben vom Benutzer nehmen.
Jaden Lee

Ich habe es geschafft, bis zu 650 Bytes Golf zu spielen, bevor ich merkte, dass es nicht funktioniert.
Quintec

@Quintec meinst du, dass mein Code nicht funktioniert?
Jaden Lee

0

Sidef , 89 85 Bytes

Sperren (anonym aufrufbar):

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

Ausgabe, wenn verwendet wie { ... }('..'):

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

Etwas ungolfed

.words.map{
  [
    .first,
    (_.len-1
      ? (  [ _[1..^(_.len-1)] ].shuffle..., .last )
      : '')
  ].join
}.join(' ')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.