개요를 유지하면서 단어를 스크램블


44

이것은 어떤 글자가 어떤 글자와 교체 될 수 있는지에 대한 규칙 때문에 단어에서 글자를 무작위 화하는 방법Cambridge Transposition 보다 훨씬 발전된 것 입니다. 간단한 정규 표현식으로 충분하지 않습니다.


첫 글자와 마지막 글자와 전체적인 외곽선이 일정하게 유지되는 한, 단어의 내부가 뒤섞여있는 동안 텍스트를 여전히 읽을 수 있다는 것은 잘 알려져 있습니다. 인쇄 가능한 Ascii + Newline 텍스트가 제공되면 다음 규칙에 따라 각 단어를 스크램블하십시오.

  1. 스크램블링은 (의사) 임의적이어야합니다.

  2. 단어는 A에서 Z까지의 라틴 문자 시퀀스입니다.

  3. 첫 글자 만 대문자가됩니다.

  4. 첫 글자와 마지막 글자는 그대로 유지해야합니다.

  5. 스크램블 할 때 다음 그룹 중 하나의 문자 만 장소를 교환 할 수 있습니다.

    1. acemnorsuvwxz

    2. bdfhkl

    3. gpqy

    4. it

    5. j (제자리에 유지)

psrrnveieg 그들의 oeiltnus 동안 Srcmable wrods

fisrt와 마지막 글자와 ovaerll ontliues raemin canstnot이있는 한, txet은 여전히 ​​읽을 수 있습니다. Patnirlbe Acsii + Nwnliee txet이 주어지면 samrclbe ecah 단어 anoccdirg에 다음 relus가 있습니다.

  1. Smncrbliag는 (pusedo) rondam이어야합니다.

  2. Wrod는 라틴어 chreratacs, A thurogh Z의 연속입니다.

  3. 초기 lrttees 만 eevr uppcsaere 것입니다.

  4. fisrt와 lsat lettres는 uctoenhud를 유지해야합니다.

  5. sarnclbimg 일 때, fwllnoiog guorps 중 하나만 포함하는 문자 만 다음과 같이 표시 될 수 있습니다.

    1. aneusvrowxmcz

    2. bhkfdl

    3. gqpy

    4. it

    5. j (plcae에서 숙박)

넥 사플


th많은 사람들이 그것을 쓰지 않더라도 보다 짧아야 합니다.
Leaky Nun

@LeakyNun 알고 있지만 t그룹 2에서 제거하는 것이 좋습니다 ? 또는 t그룹 4에 i?
Adám

후자는 괜찮을 것입니다.
Leaky Nun

이론적으로 런타임이 제한되지 않습니까? (무언가가 옳을 때까지의 임의의 시도와 같은)
Sarge Borsch

1
printable/ patnirlbe읽을 수 없습니다. i/ t스왑이 책임이 있다고 생각합니다 . 흠 ... paintrlbe아니도 도움이되지 않았습니다. 아마도 pr/ pa스왑 일 것입니다 . 윤곽은 유지하지만 나는 의미 (?) 한 편지로서 "홍보"와 "파"를 읽어이라고 생각합니다. prtnialbe아. 넵. 그랬어. 그래도 알고리즘에 대한 수정 을 제공 할 수 있는지 확실하지 않습니다 .
Draco18s

답변:


9

젤리 , 80 74 바이트

-2 바이트에서로 이동 czar + vex + mow + sun하여 czar + vexes + unmown(반복 된 es 및 ns는 문제가되지 않음)
-1 바이트 Tị대신 ȦÐf
-1 바이트 Œle€Øa대신 i@€ØB>⁵
레이아웃을 약간 재구성하여 -2 바이트 대신 사용 -1 바이트

Tị
TẊị⁹ż@œp
e€ç⁸F
W;“HọƊṘ€.`]HɲøƁḤ0ẉlfrøj⁷»Ḳ¤ç/
Ḣ,ṪjÇḟ0
Œle€Øað¬œpÇ€ÑżœpÑ¥

문자 목록 (또는 Python 형식 문자열)을 사용하여 스크램블링 결과를 인쇄하는 전체 프로그램입니다.

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

젤리에 대한 어려움의 거대한 양의 여기 (또는 I가 발생하는 것으로 알려져있다 트릭을 놓친 것을 하나!) 것 같다 이것은 확실히 더 나은 문자열과 같은 조작과 언어에 의해 구타됩니다 망막 (및 랜덤 기능) 또는 05ab1e .

어떻게?

Tị - Link 1, get truthy items: list a
T  - truthy indexes of a
 ị - index into a

TẊị⁹ż@œp - Link 2, selective shuffle: list a, list b
T        - truthy indexes of a (those indexes that may be shuffled in b)
 Ẋ       - random shuffle
   ⁹     - link's right argument, b
  ị      - index into (gets the shuffled values)
      œp - partition b at truthy indexes of a
    ż@   - zip with reversed @rguments (place shuffled values - yields a list of lists)

e€ç⁸F - Link 3, value selective shuffle: list a, list b
e€    - c exists in b? for €ach c in a (1s where b has shuffle-able characters, else 0s)
   ⁸  - link's left argument, a
  ç   - call the last link (2) as a dyad
    F - flatten the result (from the yielded list of lists to one list)

W;“HọƊṘ€.`]HɲøƁḤ0ẉlfrøj⁷»Ḳ¤ç/ - Link 4, perform all shuffles on a word's innards: list x
W                             - wrap x in a list
                          ¤   - nilad followed by link(s) as a nilad:
  “HọƊṘ€.`]HɲøƁḤ0ẉlfrøj⁷»     -   compression of s(bdfhkl)+d( czar)+d(vexes)+d(unmown)+s( gpqy)+d( ti)
                              -     where d() looks up a word in Jelly's dictionary and s() adds a string to the compressed output.
                         Ḳ    -   split on spaces: ["bdfhkl","czarvexesunmown","gpqy","ti"]
                           ç/ - reduce by last link (3) as a dyad (shuffles by each in turn)

Ḣ,ṪjÇḟ0 - Link 5, shuffle a word: list w
Ḣ       - head w (yields the leftmost character and modifies w)
  Ṫ     - tail w (yields the rightmost character and modifies w)
 ,      - pair
        -   Note: head and tail yield 0 when w is empty, so ['a'] -> ["a",0] and [] -> [0,0]
    Ç   - call the last link (4) as a monad (with the modified w)
   j    - join
     ḟ0 - filter discard zeros (thus single or zero letter words pass through unchanged)

Œle€Øað¬œpÇ€ÑżœpÑ¥ - Main link: list s
Œl                 - convert s to lowercase, say t
    Øa             - lowercase alphabet, say a
  e€               - c exists in a? for €ach c in t
      ð            - dyadic chain separation (call that u)
       ¬           - not (vectorises across u), say v
        œp         - partition s at truthy indexes of v (extract words, plus empty lists from within strings of non-alphabetic characters)
          Ç€       - call the last link (5) as a monad for €ach (shuffle their innards)
            Ñ      - call the next link (1) as a monad (only keep the actual words)
                 ¥ - last two links as a dyad:
              œp   -   partition s at truthy indexes of u (get the non-words, plus empty lists from within strings of alphabetic characters)
                Ñ  -   call the next link (1) as a monad (only keep actual non-words)
             ż     - zip together
                   - implicit print

실제로 생각보다 어렵습니다.
Leaky Nun

@LeakyNun welp 10 분 이상 걸리는 데 시간이 걸렸습니다.
Jonathan Allan

1
@JonathanAllan 예, 그것은 오래 전부터 있었으며 아마도 다음 번 릴리즈의 일부가 될 것입니다.
Martin Ender

1
czar + vex + mow + sun
Adám

3
@ Adám 사전 검색을 구성 acemnorsuvwxz합니다. 어느 시점에서 주석이 달린 코드를 작성할 것입니다.
Jonathan Allan

5

PHP, 278 바이트

<?=preg_replace_callback("#\pL\K(\pL+)(?=\pL)#",function($t){preg_match_all("#([^bdf-lpqty])|([bdfhkl])|([gpqy])|([it])|(j)#",$t[0],$p);foreach($p as$v){$k++?$c=array_keys($n=array_filter($v)):$o=[];!$n?:shuffle($n)&&$o+=array_combine($c,$n);}ksort($o);return join($o);},$argn);

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

넓히는

echo preg_replace_callback("#\pL\K(\pL+)(?=\pL)#" # patter \pL is shorter as [a-z]
,function($t){  # replacement function beginning
  preg_match_all("#([^bdf-lpqty])|([bdfhkl])|([gpqy])|([it])|(j)#",$t[0],$p); # makes groups with the regex. group 0 is the whole substring
  foreach($p as$v){ # loop through groups
    $k++?$c=array_keys($n=array_filter($v)):$o=[]; # group 0 make new empty replacement array in the other case filter the group remove empty values. 
    #You gain an array with the keys as position in the substring and the values
    #store the key array and the values array
    !$n?:shuffle($n)&&$o+=array_combine($c,$n); 
    #if values shuffle the values and make a new array with the keys and the shuffled values and merge the new array to the replacement array
  }
  ksort($o); # sort the replacement array ascending positions 
  return join($o); # return the replacement as string
},$argn);

기능

array_combine

array_filter

array_keys

ksort

preg_replace_callback

혼합


팁 : 코드를 몇 번 실행하지 않고 TIO에서 "출력 캐시 비활성화"설정을 사용할 수 있습니다. 방금 예제로 실행했습니다. All good!
Jonathan Allan

@JonathanAllan 캐시와 함께 팁을 주셔서 감사합니다. 이 문제를 해결하는 방법을 찾기가 어려웠습니다
Jörg Hülsermann

5

Pyth , 79 바이트

sm?td++hduuXNhTeTC,f@@GTHUG.S@HGG+-GJ."by❤jã~léܺ"cJ\jPtdedd:jb.z"([A-Za-z]+)"3

U + 0018은 어디에 있습니까 ?

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

견본

첫 번째와 마지막 lettres와 oaervll ontliues rmeain conntsat를 포함하는 한, 막대의 수면이 seraclbmd 인 동안 텍스트를 계속 쓸 수 있다는 것은 잘 알려져 있습니다. 텍스트가 주어지면, 각 arodncdiog를 relus를 볼 수 있도록 sacmrble :

  1. 스 캠핑은 (푸 에스도) rnadom이어야합니다.

  2. 단어는 라틴어 chraectars, A thuorgh Z의 suqencee입니다.

  3. iaitinl lettres만이 eevr uppaersce합니다.

  4. 첫 번째와 마지막 lettres msutcnuhed 유지.

  5. srancblimg 때, follnwiog guorps 중 하나만 wirettn하자 plecas를 enxhcage 수 있습니다 :

    1. amsuvrcnoxewz

    2. bhfkdl

    3. gpqy

    4. it

    5. j (제자리에 유지)


\pL대신에 저장할 수 없습니까 [A-Za-z]?
Adám

@ Adám 무엇입니까 \pL?
Leaky Nun

와 모든 문자 페이지에 있는 Being의 roperty L의 에터.
Adám

나는 그것이 여기에서 작동한다고 생각하지 않습니다 ...
Leaky Nun

하지 않을 \w충분?
Sarge Borsch

5

자바 스크립트 176 바이트

t.replace(/\B(\w+)\B/g,b=>{return[/[acemnorsuvwxz]/g,/[bdfhkl]/g,/[gpqy]/g,/[it]/g].forEach(d=>{g=b.match(d),b=b.replace(d,c=>{return g.splice(Math.random()*g.length,1)})}),b})

방법:

  1. RegExp는 /\B(\w+)\B/g1st replace fn을 사용하여 각 단어의 중심 ( )을 반복합니다 .

  2. 첫 번째 replace fn은 각 문자 그룹 ( /[bdfkhl/g, /[gqpy]/g, etc..)에 대한 RegExp 배열을 반복합니다 .

  3. 각 반복은 현재 문자 그룹에 나타나는 단어 중심 문자의 임시 배열을 만듭니다.

  4. 그런 다음 각 반복은 현재 문자 그룹의 RegExp를 사용하여 두 번째 바꾸기 fn을 사용하여 전체 단어 중심을 반복합니다.

  5. 두 번째 replace fn은 임시 배열을 무작위로 연결하여 임의의 문자를 제거하고 반환합니다.

데모:

JSFiddle에서 실행하십시오 : https://jsfiddle.net/CookieJon/bnpznb7r/


PPCG에 오신 것을 환영합니다. 놀라운 첫 번째 대답. 그러나 숫자와 밑줄을 제외하는 \pL(\pL+)\pL것이 아니라고 생각합니다 \B(\w+)\B.
Adám

아 고마워! 정규 표현식이 내 가방이 아님을 인정해야합니다 (사용할 때마다 참조를 찾아야합니다!) 나는 3 명의 추가 문자를 삼킬 수 있습니다 ... 다시 한 번 감사드립니다. :-)
Bumpy

1
놀라운 첫 번째 답변! :) 위의 @ Adáms 수정을 포함하여 155 바이트까지 줄일 수있는 몇 가지 빠른 개선 사항 : t => t.replace (/ \ B [az] + \ B / gi, b => ([/ [acemnorsuvwxz ] / g, / [bdfhkl] / ‌g, / [gpqy] / g, / [it] / g] ‌.map (d => b = b.replace (‌d, c => g. splice (new Date % g.length, 1), g = b.match (d))), b))
얽히고 설킨 Shaggy

@Shaggy b=>[...].map(...)&&b다른 바이트를 절약 한다고 생각 합니다. 또한 당신의 i필요가 확실하지 않습니다 .
Neil

@ Adám이 그의 단어 정의와 엄격하게 까다로울 것 같으면 t.replace(/[A-Za-z]([a-z]+)(?=[a-z])/g,(w,b)=>...w[0]+b...)그와 같은 것을 사용해야 합니다.
Neil

2

C, 453, 356 369 바이트

#define F for
#define M rand()%s+1+q
char a[256],*b=" acemnorsuvwxz\1bdfhkl\1gpqy\1it\1j";g(c,t)char*c,*t;{static int i,j,k,w,v,n,q,s,r;r=-1;if(c&&t){strcpy(c,t);if(!k)F(j=i=k=1;b[i];++i)b[i]-1?(a[b[i]]=j):++j;F(r=i=0;c[i];){F(;isspace(c[i]);++i);F(q=i;!isspace(c[i])&&c[i];++i);F(s=v=i-q-2;--v>0;)if(a[c[j=M]]==a[c[w=M]]&&a[c[j]])n=c[j],c[j]=c[w],c[w]=n;}}return r;}

주석이 달린 ungolf

// Input in the arg "t" result in the arg "c"
// NB the memory pointed from c has to be >= memory pointed from t
//    the char is 8 bit
#define F for
#define M rand()%s+1+q
char a[256], *b=" acemnorsuvwxz\1bdfhkl\1gpqy\1it\1j";
   g(c,t)char*c,*t;
   {static int i,j,k,w,v,n,q,s,r;
    r=-1;
    if(c&&t)
      {strcpy(c,t);                         // copy the string in the result space
       if(!k)
         F(j=i=k=1;b[i];++i)
             b[i]-1?(a[b[i]]=j):++j;        // ini [possible because at start k=0]
       F(r=i=0;c[i];)
         {F(;isspace(c[i]);++i);            //skip spaces
                                            // the start q the end+1 i
          F(q=i;!isspace(c[i])&&c[i];++i);  //skip word
          F(s=v=i-q-2;--v>0;)               //loop for swap letters of the same set
            if(a[c[j=M]]==a[c[w=M]]&&a[c[j]])
                n=c[j],c[j]=c[w],c[w]=n;
         }
      }
   return r;
  }


#include <stdio.h>
#define G(x,y) if(x)goto y
main()
{char a[256],r[256];
l1:
 gets(a);// i would know the string lenght<256
 g(r,a);
 printf("%s\n",r);
 G(*a,l1);
}

1

Python 3.6, 349340 바이트

from itertools import *
from random import *
import re
def S(s):
    C=lambda c:len(list(takewhile(lambda x:c not in x,('j','it','gqpy','bhkfdl'))));L=[];B=[[]for i in range(5)]
    for l in s:c=C(l);L+=[c];B[c]+=[l];shuffle(B[c])
    return''.join(B[n].pop()for n in L)
A=lambda t:re.sub('[A-Za-z]{3,}',lambda x:x[0][0]+S(x[0][1:][:-1])+x[0][-1],t)

탭으로 들여 쓰기 이 함수의 이름은 A입니다. OP가 요청한 것처럼 무차별 강제를 사용하지 않고 런타임이 결정적입니다.


1

Mathematica 232 바이트

StringReplace[#,x:Repeated[WordCharacter,{2,∞}]:>""<>(s=StringTake)[x,{i,i}~Table~{i,StringLength@x}/.Flatten[Thread[#->RandomSample@#]&/@(StringPosition[x~s~{2,-2},#]+1&/@Characters@{"acemnorsuvwxz","bdfhkl","gpqy","it","j"})]]]&

기본 아이디어는 4 개의 개별 문자 그룹에 해당하는 하위 세트를 퍼 미트하는 것입니다. 아마 개선의 여지가 있습니다.


1

C, 306 282 바이트

c,o,d,e,g;l(char*f){char*s[]={"aneusvrowxmcz","bhkfdl","gqpy","it",0},**h,*i,*t;for(i=f;*i;){if(isalpha(*i)){t=i;while(*i&&isalpha(*i))i++;e=i-t-2;for(h=s;*h&&e;*h++){for(c=999;--c;){d=1+rand()%e,o=1+rand()%e;if(strchr(*h,t[d])&&strchr(*h,t[o]))g=t[d],t[d]=t[o],t[o]=g;}}}else++i;}}

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

언 골프 드 :

int func(char*p) 
{
    char *groups[] = {"aneusvrowxmcz","bhkfdl","gqpy","it",0}, **g, *s, *t;
    int n,r,i,l,o;

    for (s = p; *s;)
    {
        if (isalpha(*s))
        {
            t = s;
            while (*s && isalpha(*s))
                s++;
            // start scrambling
            l = s - t - 2;
            for(g=groups; *g && l; *g++)
            {
                for(n=999;--n;)
                {
                    i = 1 + rand() % l;
                    r = 1 + rand() % l;
                    if (strchr(*g, t[i]) && strchr(*g, t[r]))
                    {
                        o=t[i];
                        t[i]=t[r];
                        t[r]=o;
                    }
                }
            }
            // end scrambling
        }
        else 
            s++;
    }
}

왜 한 마디로 999 스왑을하고 싶습니까? 한 문자의 한 단어에 l = -1이 있다는 것을 알고 있습니까? 이것은 1 + rand () % -1을 사용하여 999 개의 가능한 스왑을 시작하기 때문에 2 기가 바이트의 메모리에 무작위로 쓰기를 시작한다는 것을 의미합니다 ...하지만 가능합니다.
RosLuP

999의 사용에 대한 마법 그것은 : 1000보다 단지 1 바이트 이하의 불행하게도 없다
요한 뒤 투아

gcc에서는 rand () % (-1)이 처음 시도했을 때 0을 반환하는 것 같습니다. 따라서 임의의 2 기가 공간의 스왑이 불가능합니다 ... int의 %는 부호없는 %입니다 ...
RosLuP

@RosLup, 미안하지만 당신이 말하는 것을 따르지 않습니다 ..
Johan du Toit

1

자바 스크립트 (ES6) 380 327 311 294 바이트

( 298 (282) 265 바이트는 규칙을 제외한다)

유용한 팁을 주신 @Shaggy에게 감사드립니다!

((b,d)=>b.replace(/\B[a-z]+\B/gi,f=>(g=>(g.map(j=>(h=d.slice(0,~(rind=d.indexOf(j))?rind:-1),~rind?h.split`,`.length-1:-1)).map((j,k,l,m=[])=>{l.map((n,o)=>n==j?m.push(o):0),sub=m[new Date%(m.length-1)]||k,tmp=g[sub],g[sub]=g[k],g[k]=tmp}),g.join``))([...f])))(s,"aneusvrowxmcz,bhkfdl,gqpy,it");

var f = ((b,d)=>b.replace(/\B[a-z]+\B/gi,f=>(g=>(g.map(j=>(h=d.slice(0,~(rind=d.indexOf(j))?rind:-1),~rind?h.split`,`.length-1:-1)).map((j,k,l,m=[])=>{l.map((n,o)=>n==j?m.push(o):0),sub=m[new Date%(m.length-1)]||k,tmp=g[sub],g[sub]=g[k],g[k]=tmp}),g.join``))([...f])))

var s="Let there be scrambling";
console.log(s);
console.log(f(s,"aneusvrowxmcz,bhkfdl,gqpy,it"))

s="It is well known that a text can still be read while the innards of its words have been scrambled, as long as their first and last letters plus their overall outlines remain constant. Given a printable Ascii+Newline text, scramble each word according to these rules";
console.log(s);
console.log(f(s,"aneusvrowxmcz,bhkfdl,gqpy,it"))

함수 f 는 모든 종류의 문자열 (단일 단어, 여러 단어, 부호가있는 여러 단어-단어 분리로 해석)을 취하고 쉼표로 구분 된 모든 길이의 "규칙"문자열을 배열 로받습니다.

질문의 경우 규칙의 배열은 다음과 같습니다. ["aneusvrowxmcz", "bhkfdl", "gqpy", "it"] "aneusvrowxmcz,bhkfdl,gqpy,it"

질문에 문자가 "공백을 교환 할 수있다"고 말했기 때문에 일부 문자는 혼용되지 않습니다. 내가 잘못 해석하면 규칙과 일치하는 문자를 항상 스크램블하도록 코드를 변경할 수 있습니다.

나는 이것이 엄청난 양의 바이트라는 것을 알고 골프 언어와 경쟁 할 수는 없지만 어쨌든 시도하고 싶었습니다.

사람이 읽을 수있는 수정되지 않은 코드 :

((txt,rules)=>txt.replace(/\B[a-z]+\B/gi,wo=>((w=>(w.map(c=>(h=rules.slice(0, ~(rind=rules.indexOf(c))?rind:-1),~rind?(h.split`,`.length-1):-1)).map((e,i,arr,a=[])=>{
    arr.map((x,i)=>(x==e)?a.push(i):0),
    sub=a[new Date%(a.length-1)]||i,
    tmp=w[sub],
    w[sub]=w[i],
    w[i]=tmp
}),w.join``))([...wo]))))(str, "aneusvrowxmcz,bhkfdl,gqpy,it")

1
OP 규칙은 바이트 수에 포함되어야합니다. 에 의해 5 월 , 나는 의미 에 기회가있다 .
Adám

1
PPCG에 오신 것을 환영합니다 :) 당신은 확실히 이것을 많이 골프 수 있습니다 .
Shaggy

1
나는 당신을 위해 이것을 아래로 골프하려고 시도했지만, 그것으로 할 수있는 양이 주어지면 시간이 부족하므로 대신 여기여기 에서 당신을 시작하도록 도울 것입니다.
얽히고 설킨

1
몇 가지 간단한 포인터는, 비록 : 01)을 모두 없애 varS 자 let들. 02) 재귀 함수가 아닌 한, f=바이트 수에 변수 선언 ( ) 을 포함 할 필요가 없습니다 . 03) 함수에 2 개의 매개 변수가있는 경우에는 카레를 사용하고 (로 b=>d=>대신 (b,d)=>) 함수를 호출하십시오 f(b)(d). 04) i깃발이 있으므로 A-Z정규식 에 포함 할 필요가 없습니다 . 05) 배열로 나누지 않고 문자열을 사용 indexOf하거나 사용할 수 있습니다 search.
얽히고 설킨

1
제안 03은 어떻게 문자를 저장합니까? 그들은 나에게 똑같이 보입니다.
Steve Bennett

0

Clojure의, 326 322 324 바이트

업데이트 1 : 교체 (map(fn[[k v]]...)...)와 함께(for[[k v]...]...)

업데이트 2 : 고정 정규 표현식, 등 \pL대신 사용\w

#(let[G(zipmap"bdfhklgpqyitj""0000001111223")](apply str(flatten(interleave(for[v(re-seq #"\pL+"%)w[(rest(butlast v))]W[(into{}(for[[k v](group-by G w)][k(shuffle v)]))]R[(rest(reductions(fn[r i](merge-with + r{(G i)1})){}w))]][(first v)(map(fn[c r](nth(W(G c))(-(r(G c))1)))w R)(if(second v)(last v))])(re-seq #"\PL+"%)))))

더 짧은 것을 기대하고 있습니다. 몇 가지 예제가 포함 된 이전 언 골프 버전 :

(def f #(let[G(zipmap"bdfhklgpqyitj""0000001111223")] ; Create groups, the longest "acemnorsuvwxz" goes to an implicit group nil
          (apply str(flatten(interleave
                              (for[v (re-seq #"\w+"%)                                          ; Iterate over words
                                   w [(rest(butlast v))]                                       ; This holds the middle part
                                   W [(into{}(map(fn[[k v]][k(shuffle v)])(group-by G w)))]    ; Create shuffled groups
                                   R [(rest(reductions(fn[r i](merge-with + r{(G i)1})){}w))]] ; Calculate cumulative sum of group items, used to look-up nth value from shuffled values
                               [(first v)                                     ; First character
                                (map(fn[g r](nth(W g)(-(r g)1)))(map G w)R)   ; Shuffled middle part
                                (if(>(count v)1)(last v))])                   ; Last character, unless the word is just a single character
                              (re-seq #"\W+"%)))))) ; Interleave with spaces, commas, newline etc.

(f "It is well known that a text can still be read while the innards of its words have been scrambled, as long as their first and last letters plus their overall outlines remain constant.\n")
;  "It is well known that a txet can sitll be read wlihe the irnands of its wrods hvae been seacmlbrd, as lnog as their fisrt and lsat letters plus their oavrell ontlieus rmaein cnontast.\n"
;  "It is well kwonn that a text can sitll be raed wlihe the innards of its wrods hvae been seramlbcd, as long as their fisrt and lsat lettres plus their oravell ouiltnes rmeain cnsatont.\n"
;  "It is well konwn that a text can still be read while the iarnnds of its words have been sraemlbcd, as lnog as their first and lsat lrttees plus their oaevrll ontlieus remain canntsot.\n"

난 당신이 필요하다고 생각 \pL+하고 \PL+보다는 \w+\W+숫자와 밑줄을 제외 할 수 있습니다.
Adám

0

펄 6 , 241 195 바이트

-p명령 줄 스위치에 +1 바이트를 포함 합니다.

s:g/(<:L>)(<:L>+)(<:L>)/{$0}{[~]
$1.comb.pairs.classify({first
.value~~*,:k,/<[bdfhkl]>/,/<[gpqy]>/,/<[it]>/,/j/,!0}).values.map({$_».key
»=>«$_».value.pick(*)})».List.flat.sort».value}$2/;

언 골프 드 :

s:g/(<:L>)(<:L>+)(<:L>)/{$0}{
    [~]
    $1.comb
    .pairs
    .classify({
        first .value ~~ *, :k,
            /<[bdfhkl]>/,
            /<[gpqy]>/,
            /<[it]>/,
            /j/,
            !0
    })
    .values
    .map({ $_».key »=>« $_».value.pick(*) })
    ».List
    .flat
    .sort
    ».value
}$2/;

숫자와 밑줄을 제외 (\pL)(\pL+)(\pL)하는 것이 아니라고 생각합니다 (\w)(\w+)(\w).
Adám

실제로 \pL라틴 문자 AZ의 허용 범위를 벗어난 많은 문자가 포함됩니다. 요구 사항을보다 정확하게 반영하기 위해 코드를 업데이트했습니다.
Sean

어떤 캐릭터? 입력은 인쇄 가능한 ASCII + 줄 바꾸기로 제한됩니다.
Adám

아, 나는 그것을 놓쳤다. 그래도 Perl 6의 \pL철자가 <:L>있습니다.
Sean

0

C를 # 438 394 380 374 바이트

namespace System.Text.RegularExpressions{using Linq;s=>Regex.Replace(s,@"\p{L}(([gpqy])|(i|t)|(j)|([bdf-l])|([a-z]))*?[a-z]?\b",m=>{var a=m.Value.ToArray();for(int i=1,j;++i<7;){var c=m.Groups[i].Captures;var n=c.Cast<Capture>().Select(p=>p.Index-m.Index).ToList();foreach(Capture p in c){a[j=n[new Random().Next(n.Count)]]=p.Value[0];n.Remove(j);}}return new string(a);});}

@ MartinEnder ♦ 덕분에 10 바이트를 절약하십시오.

성가신 CaptureCollection것은 구현하지 않기IEnumerable<T> 때문에 이것이 .Cast<Capture>()필요한 이유 입니다. 다행히 Linq 쿼리와 foreach루프를 결합 할 수 있기를 바랍니다 .

나는 골프를 칠 수있는 많은 것이 있다고 확신하지만 그것이 작동하게하려면 너무 오래 걸렸습니다 ...

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

포맷 / 풀 버전 :

namespace System.Text.RegularExpressions
{
    using Linq;

    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
                Regex.Replace(s, @"\p{L}(([gpqy])|(i|t)|(j)|([bdf-l])|([a-z]))*?[a-z]?\b", m =>
                {
                    var a = m.Value.ToArray();

                    for (int i = 1, j; ++i < 7;)
                    {
                        var c = m.Groups[i].Captures;

                        var n = c.Cast<Capture>().Select(p => p.Index - m.Index).ToList();

                        foreach(Capture p in c)
                        {
                            a[j = n[new Random().Next(n.Count)]] = p.Value[0];
                            n.Remove(j);
                        }
                    }

                    return new string(a);
                });

            Console.WriteLine(f("Scramble words while preserving their outlines"));
            Console.ReadLine();
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.