アウトラインを保持しながら単語をスクランブルする


44

これは、どの文字がどの文字と交換されるかについての規則のため、単語内の文字をランダム化する方法ケンブリッジ転置よりもはるかに高度です。ここでは単純な正規表現では十分ではありません。


テキストの最初と最後の文字に加えて全体のアウトラインが一定である限り、単語の内包物がスクランブルされている間にテキストを読むことができることはよく知られています。印刷可能なAscii + Newlineテキストが与えられたら、次の規則に従って各単語をスクランブルします。

  1. スクランブルは(擬似)ランダムでなければなりません。

  2. 単語は、AからZまでのラテン文字のシーケンスです。

  3. 頭文字のみが大文字になります。

  4. 最初と最後の文字はそのままにしておく必要があります。

  5. スクランブルをかける場合、次のグループのいずれかの文字のみが場所を交換できます。

    1. acemnorsuvwxz

    2. bdfhkl

    3. gpqy

    4. it

    5. j (所定の場所に留まる)

彼らのoeiltnusをpsrrnveiegしながら、Srcmableがすり減った

txetは、最初の文字と最後の文字に加えてovaerll ontliues raemin canstnotである限り、trodのインランドがsrcambledされている間でもまだ読めることがよく知られています。patnirlbe Acsii + Nwnliee txetを考えると、samrclbe ecahの単語anoccdirgはこれらのrelusに当てはまります。

  1. Smncrbliagは(プセド)ロンダムでなければなりません。

  2. Wrodはラテン語のchreratacs、thurogh Zのシーケンスです。

  3. 初期のlrtteesのみが更新されます。

  4. fisrtとlsat lettresはuctoenhudにとどまらなければなりません。

  5. sarnclbimgの場合、fwllnoiog guorpsの1つを含む文字のみがプラークを変更できます。

    1. aneusvrowxmcz

    2. bhkfdl

    3. gqpy

    4. it

    5. j (plcaeに滞在)

エムザプル


th多くの人々はそれをそう書いていないが、より短いことになっている。
リーキー修道女

@LeakyNun私は知っていますがt、グループ2から削除することを提案していますか?または多分tグループ4に入れてi
アダム

後者は問題ありません。
リーキー修道女

ランタイムは理論的に無制限ですか?(何かが正しくなるまでランダムに試行するように)
セージボルシュ

1
printable/ patnirlbeは読みにくい。私はi/ tスワップのせいだと思う。うーん... paintrlbeいいえ、それも助けにはなりませんでした。それはおそらくpr/ paスワップです。アウトラインは維持するが、私は意味的に(?)1つの文字として「PR」と「PA」を読んでいると思います。 prtnialbeああ、はい。それでした。ただし、アルゴリズムの修正を提供できるかどうかはわかりません。
Draco18s

回答:


9

ゼリー80 74 バイト

-2から移動させることにより、バイトczar + vex + mow + sunczar + vexes + unmown(繰り返しesおよびnsは問題ではない)
-1バイトを使用TịするのではなくȦÐf
-1バイトを使用Œle€Øaするのではなくi@€ØB>⁵
-2少ないレイアウトを再構成することにより、バイト

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

スクランブルの結果を出力する文字リスト(またはPython形式の文字列)を取得する完全なプログラム。

オンラインでお試しください!

ここでのJellyの難易度は非常に大きいようです(それが、または既知のトリックを逃しました!)Retina(ランダム機能なし)または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

実は思ったより難しいです。
リーキー修道女

@LeakyNunは、それに取り組むのに10分以上かかりました。
ジョナサンアラン

1
@JonathanAllanええ、それは何年もそこにあり、おそらく次のリリースの一部になるでしょう。これは何度も私を悩ませてきたからです。
マーティンエンダー

1
czar + vex + mow + sun
アダム

3
フォームへの@Adám辞書検索acemnorsuvwxz。コメント付きのコードもある時点で作成します。
ジョナサンアラン

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で「出力キャッシュを無効にする」設定を使用できます。私は例でそれを実行しました-すべて良い!
ジョナサンアラン

@JonathanAllanキャッシュのヒントをありがとう。これを解決する方法を見つけるのは十分に困難でした
ヨルグヒュルサーマン

5

Pyth、79バイト

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

どこですかU + 0018。

オンラインでお試しください!

サンプル

最初と最後のレトルに加えてoaervll ontliues rmeain conntsatである限り、その作品の数がseraclbmdである間にテキストがまだレイドされることはよく知られています。テキストが与えられると、それぞれがacrncdiogを使い、relusを見るようになりました。

  1. 詐欺は(プエド)の支配者でなければなりません。

  2. 言葉は、ラテン語のチャクターA thuorgh Z.

  3. iaitinl lettresのみが更新されます。

  4. 最初と最後のlettres msutはuotcnuhedのままです。

  5. srancblimgの場合、follnwiog guorpsの1つを使用したlettresのみがプレカを囲うことができます。

    1. amsuvrcnoxewz

    2. bhfkdl

    3. gpqy

    4. it

    5. j (所定の場所に留まる)


\pLではなくで保存できません[A-Za-z]か?
アダム

@Adámとは\pL
リーキー修道女

任意の文字のpであることのroperty Lの Etterの。
アダム

私は...それはここで働くとは思わない
漏れ修道女

\w十分ではないでしょうか?
セージボルシュ

5

JavaScript 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/g最初の置換fnを使用して各単語の中心()を反復処理します。

  2. 最初の置換fnは、各文字グループ(/[bdfkhl/g, /[gqpy]/g, etc..)のRegExpの配列を繰り返します。

  3. 各反復は、現在の文字グループに表示される単語中心の文字の一時配列を作成します。

  4. 次に、各反復は、現在の文字グループのRegExpを使用して、2番目の置換fnを使用して、単語中心全体を反復処理します。

  5. 2番目の置換fnは、一時配列をランダムにスプライスし、ランダムな文字を削除して返します。

デモ:

JSFiddleで実行します:https ://jsfiddle.net/CookieJon/bnpznb7r/


PPCGへようこそ。驚くべき最初の答え。ただし、数字とアンダースコアを除外する必要\pL(\pL+)\pLはないと思います\B(\w+)\B
アダム

ああ、ありがとう!正規表現が私のバッグではないことを認める必要があります(使用するたびに参照を検索する必要があります!)余分な3つの文字を飲み込むことができます...すぐに再び回答を更新します。:-)
バンピー

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(新しいDate%g.length、1)、g = b.match(d)))、b))
シャギー

@Shaggy b=>[...].map(...)&&b別のバイトを節約すると思います。また、あなたiが必要かどうかもわかりません。
ニール

@Adámが彼の単語の定義に厳しくうるさい場合は、使用する必要がありますt.replace(/[A-Za-z]([a-z]+)(?=[a-z])/g,(w,b)=>...w[0]+b...)
ニール

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

コメント付きウンゴルフ

// 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、349 340バイト

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スワップしたいのはなぜですか?1文字の1ワードがl = -1であることを知っていますか?これはおそらく1 + rand()%-1を使用して999の可能なスワップを開始することを意味するので、2ギガのメモリにランダムに書き込みます...しかし可能性がありますそれは間違っています
。...-RosLuP

残念ながら999の使用に関して魔法はありません。それは1000バイトよりも1バイト少ないだけです。)
Johan du Toit

gccでは、rand()%(-1)が最初に2回試したときに0を返すようです。ランダムな2ギガスペースのスワップは不可能です... intの%は、符号なしの%ではありません
...-RosLuP

@RosLup、私は申し訳ありませんが、私はあなたが言っているものをフォローしていない...
ヨハン・デュToit

1

JavaScript(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月、私は意味のチャンスを持っています
アダム

1
PPCGへようこそ:)あなたがすることができます間違いなくゴルフ多く、このオフ。
シャギー

1
私はそれを行うことができますどのくらい与え、ゴルフへのあなたのために、このダウンをしようとするつもりいたが、私は時間がなくなったので、代わりに私はあなたを指しますここここに助けにあなたが始められます。
シャギー

1
ただし、いくつかの簡単なポインター:01)すべてのvarsとs を取り除きletます。02)再帰関数でない限りf=、バイトカウントに変数宣言()を含める必要はありません。03)関数に(b=>d=>ではなく(b,d)=>)2つのパラメーターがある場合にカリー化を使用し、で関数を呼び出しますf(b)(d)。04)iフラグがあるためA-Z、正規表現に含める必要はありません。05)文字列を配列に分割せずに、indexOfまたはsearch文字列で使用できます。
シャギー

1
サジェクション03はキャラクターをどのように保存しますか?私には同じように見えます。
スティーブベネット

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+数字とアンダースコアを除外します。
アダム

0

Perl 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)
アダム

実際に\pLは、ラテン文字A〜Zの許容範囲外の多くの文字が含まれています。要件をより正確に反映するようにコードを更新しました。
ショーン

どのキャラクター?入力は印刷可能なASCII + Newlinesに制限されていることに注意してください。
アダム

ああ、私はそれを見逃した。 しかし、Perl 6では\pL綴ら<:L>れています。
ショーン

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.