Scramble parole preservando i loro contorni


44

Questo è molto più avanzato di Come randomizzare le lettere in una parola e la Trasposizione di Cambridge a causa della regola su quali lettere possono essere scambiate con le quali. Un regex semplice non sarà sufficiente qui.


È noto che un testo può ancora essere letto mentre le parti interne delle sue parole sono state mescolate, purché la loro prima e ultima lettera più i loro contorni generali rimangano costanti. Dato un testo Ascii + Newline stampabile, mescola ogni parola secondo queste regole:

  1. Scrambling deve essere (pseudo) casuale.

  2. Una parola è una sequenza di caratteri latini, dalla A alla Z.

  3. Solo le lettere iniziali saranno maiuscole.

  4. La prima e l'ultima lettera devono rimanere intatte.

  5. Quando si mescolano, solo le lettere all'interno di uno dei seguenti gruppi possono scambiarsi dei posti:

    1. acemnorsuvwxz

    2. bdfhkl

    3. gpqy

    4. it

    5. j (resta al suo posto)

Esempio

Srcmable wrods mentre psrrnveieg le loro oeiltnus

È risaputo che un txet può ancora essere letto mentre i numeri dei suoi wrods sono stati confusi, purché il loro primo e ultimo carattere più le loro ovaerll ontliues raemin canstnot. Data una patnirlbe Acsii + Nwnliee txet, samrclbe ecah word anoccdirg to these relus:

  1. Smncrbliag deve essere (pusedo) rondam.

  2. Un wrod è un sequestro dei chratatacs latini, A thurogh Z.

  3. Solo gli studenti iniziali saranno sempre più sicuri.

  4. Le prime lettere e lsat devono rimanere uctoenhud.

  5. Quando sarnclbimg, solo le lettere con uno dei guorps fwllnoiog possono scambiare plaec:

    1. aneusvrowxmcz

    2. bhkfdl

    3. gqpy

    4. it

    5. j (resta in piazza)

Emxaple


tdovrebbe essere più breve di hsebbene molte persone non lo scrivano così.
Leaky Nun,

@LeakyNun Lo so, ma stai suggerendo di rimuoverlo tdal gruppo 2? O forse inserendo tun gruppo 4 con i?
Adám,

Quest'ultimo andrebbe bene.
Leaky Nun,

il tempo di esecuzione può essere teoricamente illimitato? (come tentativi casuali fino a quando qualcosa non va bene)
Sarge Borsch,

1
printable/ patnirlbenon è del tutto leggibile. Penso che la colpa sia i/ tswap. Hmm ... paintrlbeNo, neanche quello ha aiutato. Probabilmente è pr/ paswap, quindi. La struttura mantiene, ma penso di aver letto "pr" e "pa" come semanticamente (?) 1 lettera. prtnialbeAh sì. Quello l'ha fatto. Non sono sicuro di poter offrire una correzione all'algoritmo però.
Draco18s

Risposte:


9

Gelatina , 80 74 byte

-2 byte passando da czar + vex + mow + suna czar + vexes + unmown(ripetuti es e ns non sono un problema)
-1 byte utilizzando Tịanziché ȦÐf
-1 byte utilizzando Œle€Øaanziché i@€ØB>⁵
-2 byte riconfigurando leggermente il layout

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

Un programma completo che prende un elenco di caratteri (o una stringa formattata in Python), che stampa il risultato dello scrambling.

Provalo online!

Sembra una grande quantità di difficoltà per Jelly qui (o quello o ho perso un trucco, che è noto che accada!) Questo sarà sicuramente battuto da linguaggi con una migliore manipolazione delle stringhe come Retina (nessuna funzionalità casuale) o 05ab1e .

Come?

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

In realtà è più difficile di quanto pensassi.
Leaky Nun,

@LeakyNun welp mi ci è voluto molto più di 10 minuti per affrontarlo.
Jonathan Allan,

1
@JonathanAllan Sì, è stato lì per anni, e probabilmente farà parte della prossima versione, perché questo mi ha infastidito molte volte.
Martin Ender,

1
czar + vex + mow + sun
Adám,

3
@ Ricerche del dizionario Adám da formare acemnorsuvwxz. Scriverò anche il codice commentato ad un certo punto.
Jonathan Allan,

5

PHP, 278 byte

<?=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);

Provalo online!

allargato

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

funzioni

array_combine

array_filter

array_keys

ksort

preg_replace_callback

rimescolare


Suggerimento: è possibile utilizzare l'impostazione "disabilita cache di output" su TIO, anziché eseguire il codice più volte. Ho appena eseguito con l'esempio - Tutto bene!
Jonathan Allan,

@JonathanAllan Grazie per il suggerimento con la cache. È stato abbastanza difficile trovare un modo per risolverlo
Jörg Hülsermann

5

Pyth , 79 byte

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

dove è U + 0018.

Provalo online!

Campione

È ben noto che un testo può ancora essere raccolto mentre le irlandesi dei suoi wrods sono state seraclbmd, purché le loro prime e ultime lettere più le loro oervll ontliues rmeain conntsat. Dato un testo, sacmrble ogni wrod acrncdiog per vedere relus:

  1. Scamrlbing deve essere (puesdo) rnadom.

  2. Una parola è una suqencee dei chraectar latini, A thuorgh Z.

  3. Solo le lettre iaitinl saranno sempre superiori.

  4. La prima e l'ultima lettera resteranno invariate.

  5. Quando si srancblimg, solo lettre tra uno dei guollps follnwiog possono enxhcage plecas:

    1. amsuvrcnoxewz

    2. bhfkdl

    3. gpqy

    4. it

    5. j (resta al suo posto)


Non puoi salvare \pLinvece di [A-Za-z]?
Adám,

@ Adám Cos'è \pL?
Leaky Nun,

Qualsiasi carattere con la p ROPRIETÀ di essere un L Etter.
Adám,

Non penso che funzioni qui ...
Leaky Nun,

non \wsarebbe abbastanza?
Sarge Borsch,

5

JavaScript 176 byte

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

Metodo:

  1. RegExp scorre il centro di ogni parola ( /\B(\w+)\B/g) usando 1st sostituisci fn.

  2. 1a sostituzione fn itera una matrice di RegExp per ogni gruppo di lettere ( /[bdfkhl/g, /[gqpy]/g, etc..).

  3. Ogni iterazione crea una matrice temporanea di caratteri del centro-parola che appaiono nel gruppo di lettere corrente.

  4. Ogni iterazione utilizza quindi RegExp del gruppo di lettere corrente per iterare sull'intero centro di parole, usando un secondo sostituto fn.

  5. 2nd sostituire fn unisce casualmente l'array temp, rimuovendo un carattere casuale e restituendolo.

demo:

Eseguilo in JSFiddle: https://jsfiddle.net/CookieJon/bnpznb7r/


Benvenuti in PPCG. Incredibile prima risposta. Tuttavia, penso che sia necessario \pL(\pL+)\pLpiuttosto che \B(\w+)\Bescludere cifre e caratteri di sottolineatura.
Adám,

Ah grazie! Devo ammettere che regex non è la mia borsa (devo cercare il riferimento OGNI volta che lo uso!) Posso ingoiare i 3 caratteri extra ... aggiornerò la mia risposta a breve grazie ancora. :-)
Bumpy

1
Incredibile prima risposta! :) Alcuni, rapidi miglioramenti per farti arrivare a 155 byte, inclusa la correzione @ Adáms sopra: 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 Penso che b=>[...].map(...)&&bsalva un altro byte. Inoltre non sono sicuro che isia necessario.
Neil,

Se @ Adám sarà rigorosamente esigente con la sua definizione di parola, allora dovrai usare t.replace(/[A-Za-z]([a-z]+)(?=[a-z])/g,(w,b)=>...w[0]+b...)o qualcosa del genere.
Neil,

2

C, 453, 356 369 byte

#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 con commenti

// 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 byte

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)

Rientrato con le linguette. La funzione è denominata A. Non utilizza la forza bruta, l'autonomia è deterministica, come richiesto da OP.


1

Mathematica 232 byte

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"})]]]&

L'idea di base è di permutare i sottoinsiemi corrispondenti ai 4 gruppi di caratteri distinti. Probabilmente margini di miglioramento.


1

C, 306 282 byte

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

Provalo online

Ungolfed:

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

Perché vorresti fare 999 swap in una parola? Sai che una parola di un carattere ha l = -1 e questo probabilmente significa che inizia a fare 999 possibili swap usando 1 + rand ()% -1 in modo casuale scrivendo in 2 giga di memoria ... Ma possibile, vedo è sbagliato ....
RosLuP,

Purtroppo non c'è magia per quanto riguarda l'uso del 999. È solo 1 byte in meno di 1000 :)
Johan du Toit,

In gcc sembra rand ()% (- 1) return 0 le prime 2 volte che l'ho provato. quindi possibile nessuno scambio di spazio casuale 2giga ...% di int non è la% di unsigned ...
RosLuP

@RosLup, mi dispiace ma non seguo quello che stai dicendo ..
Johan du Toit,

1

JavaScript (ES6), 380 327 311 294 byte

( 298 282 265 byte escludendo le regole)

Grazie a @Shaggy per i consigli utili!

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

La funzione f comprende una stringa di qualsiasi tipo (parola singola, più parole, più parole con segni in essa - che interpreta come una rottura di parole) e una matrice una stringa di "regole" di qualsiasi lunghezza separate da virgole.

Quella serie di regole, nel caso della tua domanda, sarebbe ["aneusvrowxmcz", "bhkfdl", "gqpy", "it"] "aneusvrowxmcz,bhkfdl,gqpy,it"

Alcune lettere non si mescolano anche se potrebbero, dal momento che hai dichiarato nella tua domanda che le lettere "possono scambiare spazi". Se l'ho interpretato in modo errato, posso modificare il codice in modo da mescolare sempre le lettere che corrispondono alle regole.

So che questa è un'enorme quantità di byte e non sarà in grado di competere con le lingue del golf, ma volevo provare comunque, spero che ti piaccia :)

Codice non uguito leggibile dall'uomo:

((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
Le regole OP devono essere incluse nel conteggio dei byte. A maggio , intendevo avere una possibilità .
Adám,

1
Benvenuto in PPCG :) Puoi sicuramente giocare molto a golf .
Shaggy,

1
Stavo per provare a giocare a golf per te ma, dato quanto si può fare, sono rimasto senza tempo, quindi ti indicherò qui e qui per aiutarti a iniziare.
Shaggy,

1
Alcune indicazioni veloci, però: 01) sbarazzarsi di tutti la varS una lets. 02) A meno che non sia una funzione ricorsiva, non è necessario includere la dichiarazione delle variabili ( f=) nel conteggio dei byte. 03) Usa il curry quando una funzione ha 2 parametri ( b=>d=>invece di (b,d)=>) e chiama la tua funzione con f(b)(d). 04) Hai la ibandiera quindi non è necessario includerla A-Znella tua regex. 05) Puoi usare indexOfo searchsu una stringa, senza dividerlo in un array.
Shaggy,

1
In che modo il suggerimento 03 salva i caratteri? Mi sembrano uguali.
Steve Bennett,

0

Clojure, 326 322 324 byte

Aggiornamento 1: sostituito (map(fn[[k v]]...)...)con(for[[k v]...]...)

Aggiornamento 2: risolto regex, usando \pLinvece di \wecc.

#(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+"%)))))

Non vedo l'ora di vedere qualcosa di più corto. Versione ungolfed precedente con alcune esecuzioni di esempio:

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

Penso che tu abbia bisogno \pL+e \PL+piuttosto che \w+e \W+di escludere cifre e caratteri di sottolineatura.
Adám,

0

Perl 6 , 241 195 byte

Include +1 byte per l'opzione della -priga di comando.

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

Ungolfed:

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

Penso che sia necessario (\pL)(\pL+)(\pL)piuttosto che (\w)(\w+)(\w)escludere cifre e caratteri di sottolineatura.
Adám,

In realtà \pLinclude molti caratteri al di fuori dell'intervallo consentito di lettere latine AZ. Ho aggiornato il mio codice per riflettere i requisiti in modo più accurato.
Sean,

Quali personaggi? Ricorda che l'input è limitato a ASCII + Newline stampabili.
Adám,

Ah, l'ho perso. \pLè scritto <:L>in Perl 6 però.
Sean,

0

C #, 438 394 380 374 byte

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

Risparmia 10 byte grazie a @ MartinEnder ♦.

In modo fastidioso, CaptureCollectionnon implementaIEnumerable<T> ed è per questo che .Cast<Capture>()è necessario. Spero di poter combinare la query Linq e il foreachciclo però.

Sono sicuro che ci sono molte cose che si possono giocare a golf ma mi ci è voluto abbastanza tempo per farlo funzionare ...

Provalo online!

Versione formattata / completa:

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();
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.