Cambridge Yerleşimi


21

Eminim çoğunuz olmasa da , bir noktada veya başka bir yerde bu duruma rastladınız :

Cmabrigde Uinervtisy'de bir araştırma araştırması yapılsa da, bir wrodda bulunanlar arasında değinmediği gibi, bir ipekli kumaşta olduğu gibi, ilk kez bakıldığında da ilk kez bilgisayar başında kalmış. Rset bir toatl mses olabilir ve oturabileceğiniz yerlere oturabilirsin. Tihs bcuseae olan mnid deos istlef tarafından ervey lteter'e baskın yapmadı, ama wrod olarak wrod.

  • Herhangi bir miktarda metin girilen bir program oluşturun. Test amacıyla, yukarıda bulunan ve yukarıda bulunan metnin şifrelenmemiş sürümünü kullanın.

  • Program daha sonra rastgele her kelimenin ilk harfini ve her kelimenin ilk harfini hariç 4 veya daha fazla harf uzunluğunu değiştirmelidir.

  • Diğer tüm biçimlendirme aynı kalmalıdır (büyük harf ve noktalama işaretleri, vb.).

Test metni:

Cambridge Üniversitesi'ndeki bir araştırmacıya göre, bir kelimedeki harflerin hangi sırayla olduğu önemli değildir, tek önemli şey ilk ve son harfin doğru yerde olmasıdır. Gerisi toplam karışıklık olabilir ve hala sorunsuz bir şekilde okuyabilirsiniz. Bunun nedeni, insan zihninin her mektubu kendi başına okumaması, kelimeyi bir bütün olarak okumasıdır.

Her zamanki gibi, bu bir kod golfü. En kısa kod kazanır.


2
Bir kelimedeki harfleri nasıl randomize edeceğimize benzer şekilde , bir kelimede yalnızca tek bir kelimenin karıştırılması gerekir, oysa burada bir cümlenin içindeki her kelimedir.
Gareth

Katılıyorum. Sorular bir soruna yönelik çözümlerin neredeyse doğrudan diğerine kullanılabileceği kadar benzer.
primo

1
Son harf rscheearchörnek metninizde doğru değil .
daniero

10
Tersini yapan bir programdan daha çok etkilenirdim (örn. Giriş şifreli metindir).
Bay Lister,

1
Kesme çizgisinin don'tkonumu aynı konumda mı kalmalı? Spec diyor All other formatting must remain the same (capitalization and punctuation, etc.).ama burada nasıl çalıştığından emin değilim ...
Gaffi 20.03.2013

Yanıtlar:


9

Ruby - 50 48 karakter, artı -pkomut satırı parametresi.

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

-2 karakter için teşekkürler @primo.

Ölçek

➜  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, \Ksıfır genişliğindeki arkadan görünümün desteklenmesini desteklemiyor mu? Ayrıca, en içteki gruplama $&yerine , gereksizdir $1.
primo

@primo, sanmıyorum, işe yaramadı ve hiçbir referans sayfasında bulamadım. Tavsiyen için teşekkürler $&:)
Dogbert

Haklısın. Sanırım php'ın yaptığı gibi perl regex'i doğrudan aldıklarını sandım;)
primo 19

3
bana bu codegolfsenaryo hakkında daha fazla bilgi ver
Sparr

1
Yıllar sonra, ancak: Karıştırmadan önce yeni bir dizi oluşturmaya gerek yok: [*$&.chars]=> $&.chars, 3 bayt tasarruf.
daniero

5

Python, 118

Python böyle şeyler için korkunç derecede garip!

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

Zekice olacağını düşündüğüm başka şeyler de denedim, ancak her türlü şeyi ithal etmeniz gerekiyor ve birçok yöntemin geri dönüş değerleri yoktur, ancak kendi ifadesi olarak ayrı ayrı çağrılmanız gerekir. En kötüsü, dizeyi bir listeye dönüştürmeniz ve ardından jointekrar dizeye dönüştürmeniz gerektiğindedir .

Neyse, işte denediğim bazı şeyler:

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())
Permutasyonlar!
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]])),
Doğrudan ve bir listesinin bir bölümü rastgele olamaz shuffledöner 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 bayt

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

En az 4 3 harf uzunluğunda kelimeleri yakalamak için bir regex kullanmak ve iç karakterleri karıştırmak. Bu kod aynı zamanda birden fazla satırla girişi yapabilir.

Yalnızca bir giriş satırı gerekiyorsa (örnekte olduğu gibi), bu 68 bayta düşürülebilir.

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

Ortada sadece bir harf var, bu yüzden karıştırıp karıştırmaman önemli değil.


3

J (48)

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

Açıklama:

  • 1!:1[3: stdin'den tüm girdileri oku
  • rxapply: Verilen işlevi, regex ile eşleşen girdi bölümlerine uygulayın.
  • ({~?~@#): girişini karıştıran bir fiil treni: #uzunluğu sayar, bu ?N'ye 0'dan N'ye farklı sayılar vermenin her iki tarafına uygulanır , {daha sonra bu dizilerdeki öğeleri giriş dizisinden seçer.
  • ('\w(\w+)\w';,1): bu regex'i kullanın, ancak yalnızca ilk gruptaki değeri kullanın
  • [1!:2&4: biçimlendirilmemiş çıktıyı stdout'a gönder
  • ''[: biçimlendirilmiş çıktıları gizler. Bu gereklidir, çünkü aksi takdirde, çıkışın sadece bir terminal hattına uyan ve sonra biten bir kısmını çıkarır ....

3

Retina , 10 bayt

?V`\B\w+\B

Çevrimiçi deneyin!

Hey, bu eski meydan okuma yeni Retina için yapıldı!

açıklama

\B\w+\BSınırlar dışındaki harf gruplarını, yani bir kelimeyi başlamayan veya bitmeyen harf gruplarıyla eşleştirir. Regexes açgözlü olduğundan, bu ilk ve sonuncusu hariç bir kelimenin tüm harfleriyle eşleşir.

Vregex'in her bir eşleşmesinde karakter sırasını tersine çeviren "ters" aşamasıdır. ?Seçeneği ile yerine onları karıştırıyor.


10 baytlık bir çözüm bulduktan sonra bununla karşılaştım .
FryAmTheEggman

1

APL 107

Maalesef, APL yorumlayıcım regex'leri desteklemiyor, bu yüzden işte karıştırılacak metnin t değişkeninde saklandığı, ev yapımı bir sürüm.

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

Temel olarak kod metni yalnızca alfabenin harflerini temel alan sözcüklere ve ardından bu kelimelerin ilk ve son harfleri arasındaki harflere ayırır. Bu harfler daha sonra karıştırılır ve tüm karakter dizisi yeniden birleştirilir.


1

APL, 58 49

Bunun IBM APL2'de çalıştığına inanıyorum (IBM APL'im yok)

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

Değilse, Dyalog APL'de öne doğru ekleyin:

 ⎕ML←3⋄

hangi 6 karakter ekler


Bu, yalnızca sözcük olmayan karakterlerin boşluk, virgül ve nokta olduğunu varsayar.


Hala golf oynayabilirim ama iPhone'da APL sembollerim yok ...
TwiNight

1

VBA'yı 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

Alternatif (daha büyük) Yöntem:

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

Bu yöntemlerin her ikisi de, 'a iletilen değişkenin değerini değiştirir Sub. yani

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

böyle bir şey çıktısını alacak:

"Tihs is a tset."

Ayrıca, bu kelime ortasında noktalama işaretini rastgele yapar, bu yüzden bu% 100 spesifikasyonuna uymayabilir.


1

APL NARS 172 karakter

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←⍞

+ 17 + 13 18 + 44 + 41 + 8 + 17 + 5 + 9 = 172; Bu işlev g () dizge olarak girdiye sahiptir; dize olarak çıktı aldı. İnput komutunu ekliyorum çünkü alıntı yapılan bir dizgede \ 'ne ekleyeceğimi bilmiyorum. Yorumlananlar

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

sonuç

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, rekabet etmeyen, 80 bayt

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

komut satırı argümanlarından girdi alır. İle koş -nr. (açıkça noktalama işaretlerinde başarısız olur)


1

PHP, 94 + 1 bayt

-RBayrak için +1

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

Boru girişi php -nR '<code>' .

Not: preg_replace_callback 4.0.5'te PHP'ye geldi; kapaklar, php 5.3'te tanıtıldı;
bu yüzden PHP 5.3 veya üstü gerekir.

Maalesef, alt desen olmasa bile, eşleşme her zaman bir dizi olarak gönderilir,
bu yüzden str_shufflegeri arama olarak kullanamıyorum , bu 29 bayt'ı koruyacaktır.


1

JavaScript, 76 67 bayt

Arnauld -9 bayt için teşekkürler .

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

Çevrimiçi deneyin!


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


Kullanabilirsiniz /\B\w+\B/g. (Ancak ödül için, kod uzunluğunun önemli olmadığını unutmayın . )
Arnauld

1
@Arna çok teşekkür ederim. Bu hala codegolf olduğundan, her bayt sayılır.
ovs

@Arnauld Ciddi yarışmacı kuralı hala geçerlidir.
user202729

1
@trejder İhtiyaçlarınız için kodu değiştirmenize yardımcı olacak bir açıklama ekledim. Mevcut haliyle, kod çoğu tarayıcıda iyi çalışmalıdır. Bu kodda gerçek kodda kullanmak istiyorsanız, muhtemelen karakterleri tek tip bir algoritmaya karıştırma şeklini değiştirmelisiniz.
ovs

0

R, 179

Fonksiyonu kullanarak bir kelime problemindeki rastgele harfleri yazdım :

Giriş:

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

Çözüm:

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

Sonuç:

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

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

Çevrimiçi deneyin!


Japt'i doğrudan bir tarayıcıda çalıştırabilir miyim? Harici kütüphaneler, derleyiciler vb. Olmadan? Olmazsa, bu maalesef lütuf kurallarına göre sayılmaz (saf web tarayıcısında çalışan çözüme ihtiyaç duyar). İkincisi, Cambridge Transpozisyonunun orijinal kurallarının burada gösterilenden biraz farklı olduğunu düşünüyorum (OP sorusunda). Kodunuzu, 5+ harf uzunluğunda (OP'nin sorusunda olduğu gibi uzun 4+ harf yerine) kelimeleri karıştırmak için değiştirmek mümkün müdür?
trejder

1
@ trejder Bütün gönderiler, asıl sorudaki kurallara uygun olmalıdır. Bu şekilde değiştirmek onu geçersiz kılar.
user202729

1
@trejder Japt, derleyici olmadan doğrudan bir tarayıcıda çalıştırılamaz. İkincisi, koddaki 4 kodunu 5 ile değiştirirseniz, sadece 5 + uzun harfli kelimeleri karıştırmanız gerekir.
Bejofo

0

Java, 1557 834 bytes Püf noktaları için @JoKing'e teşekkürler.

Yarışmaya biraz geç kaldın. Bu konuda başladığımı unuttum.

golfed

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

Sigara golfed

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

Kaldırabileceğiniz çok fazla boşluk var gibi görünüyor. Tips for golfing Java adlı işletmeye gittiniz mi? düzenleme: ayrıca, giriş kodlanmış gibi görünüyor.
Jo King

@JoKing ah tamam. Kullanıcıdan girdi alacağım.
Jaden Lee

Çalışmadığını fark etmeden önce bunu 650 bayta kadar indirmeyi başardım.
Quintec

@ Quintec, kodumun çalışmadığını mı kastediyorsunuz?
Jaden Lee,

0

Sidef , 89 85 bayt

Blok (isimsiz çağrılabilir):

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

Çıktı, şöyle kullanıldığında { ... }('..'):

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

Biraz unungolfed

.words.map{
  [
    .first,
    (_.len-1
      ? (  [ _[1..^(_.len-1)] ].shuffle..., .last )
      : '')
  ].join
}.join(' ')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.