이것은 어떤 글자가 어떤 글자와 교체 될 수 있는지에 대한 규칙 때문에 단어에서 글자를 무작위 화하는 방법 과 Cambridge Transposition 보다 훨씬 발전된 것 입니다. 간단한 정규 표현식으로 충분하지 않습니다.
첫 글자와 마지막 글자와 전체적인 외곽선이 일정하게 유지되는 한, 단어의 내부가 뒤섞여있는 동안 텍스트를 여전히 읽을 수 있다는 것은 잘 알려져 있습니다. 인쇄 가능한 Ascii + Newline 텍스트가 제공되면 다음 규칙에 따라 각 단어를 스크램블하십시오.
-
스크램블링은 (의사) 임의적이어야합니다.
-
단어는 A에서 Z까지의 라틴 문자 시퀀스입니다.
-
첫 글자 만 대문자가됩니다.
-
첫 글자와 마지막 글자는 그대로 유지해야합니다.
-
스크램블 할 때 다음 그룹 중 하나의 문자 만 장소를 교환 할 수 있습니다.
-
acemnorsuvwxz
-
bdfhkl
-
gpqy
-
it
-
j
(제자리에 유지)
-
예
psrrnveieg 그들의 oeiltnus 동안 Srcmable wrods
fisrt와 마지막 글자와 ovaerll ontliues raemin canstnot이있는 한, txet은 여전히 읽을 수 있습니다. Patnirlbe Acsii + Nwnliee txet이 주어지면 samrclbe ecah 단어 anoccdirg에 다음 relus가 있습니다.
Smncrbliag는 (pusedo) rondam이어야합니다.
Wrod는 라틴어 chreratacs, A thurogh Z의 연속입니다.
초기 lrttees 만 eevr uppcsaere 것입니다.
fisrt와 lsat lettres는 uctoenhud를 유지해야합니다.
sarnclbimg 일 때, fwllnoiog guorps 중 하나만 포함하는 문자 만 다음과 같이 표시 될 수 있습니다.
aneusvrowxmcz
bhkfdl
gqpy
it
j
(plcae에서 숙박)넥 사플
답변
젤리 , 80 74 바이트
-2 바이트에서로 이동 czar + vex + mow + sun
하여 czar + vexes + unmown
(반복 된 e
s 및 n
s는 문제가되지 않음)
-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
답변
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);
기능
답변
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 :
-
스 캠핑은 (푸 에스도) rnadom이어야합니다.
-
단어는 라틴어 chraectars, A thuorgh Z의 suqencee입니다.
-
iaitinl lettres만이 eevr uppaersce합니다.
-
첫 번째와 마지막 lettres msutcnuhed 유지.
-
srancblimg 때, follnwiog guorps 중 하나만 wirettn하자 plecas를 enxhcage 수 있습니다 :
-
amsuvrcnoxewz
-
bhfkdl
-
gpqy
-
it
-
j
(제자리에 유지)
-
답변
자바 스크립트 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})
방법:
-
RegExp는
/\B(\w+)\B/g
1st replace fn을 사용하여 각 단어의 중심 ( )을 반복합니다 . -
첫 번째 replace fn은 각 문자 그룹 (
/[bdfkhl/g, /[gqpy]/g, etc..
)에 대한 RegExp 배열을 반복합니다 . -
각 반복은 현재 문자 그룹에 나타나는 단어 중심 문자의 임시 배열을 만듭니다.
-
그런 다음 각 반복은 현재 문자 그룹의 RegExp를 사용하여 두 번째 바꾸기 fn을 사용하여 전체 단어 중심을 반복합니다.
-
두 번째 replace fn은 임시 배열을 무작위로 연결하여 임의의 문자를 제거하고 반환합니다.
데모:
JSFiddle에서 실행하십시오 : https://jsfiddle.net/CookieJon/bnpznb7r/
답변
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);
}
답변
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가 요청한 것처럼 무차별 강제를 사용하지 않고 런타임이 결정적입니다.
답변
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 개의 개별 문자 그룹에 해당하는 하위 세트를 퍼 미트하는 것입니다. 아마 개선의 여지가 있습니다.