태그 보관물: permutations

permutations

개요를 유지하면서 단어를 스크램블 따라 각 단어를 스크램블하십시오. 스크램블링은 (의사) 임의적이어야합니다. 단어는 A에서

이것은 어떤 글자가 어떤 글자와 교체 될 수 있는지에 대한 규칙 때문에 단어에서 글자를 무작위 화하는 방법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에서 숙박)

넥 사플



답변

젤리 , 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


답변

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

혼합


답변

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 (제자리에 유지)


답변

자바 스크립트 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/


답변

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 개의 개별 문자 그룹에 해당하는 하위 세트를 퍼 미트하는 것입니다. 아마 개선의 여지가 있습니다.