그 줄을 깨뜨려 라!


20

문자열을 입력으로 받으면 다음과 같이 문자열의 변형을 하나 이상 출력하십시오.

  • 캐릭터가 원래 위치에 없습니다
  • 문자가 원래 문자와 인접 해 있지 않습니다

주어진 문자열에 대해 항상 가능하며 알파벳 문자 하나만 포함 [a-z]하거나 [A-Z]원하는 경우 포함한다고 가정 할 수 있습니다

동일한 문자의 중복은 고유 한 것으로 간주되지 않습니다.

예를 들어 input이 주어지면 programming출력은 m7 번째 또는 8 번째 문자를 포함 할 수없고 g4 번째 또는 11 번째 문자를 포함 할 수 없습니다 (1 인덱스)

예:

끈을 가지고 abcdef

다음은 유효한 출력입니다. daecfb

그러나 다음 예는 유효하지 않습니다. fdbcae이 예에서 cb같이 여전히 인접합니다.

인접 또한 당신이 할 수없는 의미 랩 fdbeca으로 f하고 a여전히 인접.

테스트 케이스 :

주어진 입력에 대해 유일하게 유효한 출력 은 아닙니다.

로 작성 input -> output:

helowi -> ioewhl
mayube -> euabmy
stephens -> nhseespt
aabcdeffghij -> dbfhjfigaeca

채점 :

이것은 이므로 각 언어에서 가장 적은 바이트 이깁니다!


No character is adjacent to a character that it was originally adjacent to. 인접성은 중요하지 않습니까? 입력 "abcd"는 "ab"를 가질 수없고 "ba"를 가질 수 없습니까?
DrZ214

@ DrZ214 맞습니다
Skidsdev

답변:


5

젤리 , 24 23 바이트

ẋ2ṡ2Ṣ€
dzǤœ&¬ɓ³=Sȯ
ẊÇ¿

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

젤리에서 끔찍한 일로 인해 매우 길었지만, 적어도 골프 과정에서 마침내 작동합니다.

link that generates a list of sorted adjacent pairs:
ẋ2            duplicate argument ("abc" -> "abcabc")
  ṡ2          slices of 2 (-> "ab","bc","ca","ab","bc")
    Ṣ€        sort each

link that tests for invalid permutations:
Ç             get sorted adjacent pairs of argument
 ³Ç¤          do the same for the original input
    œ&        set intersection, then...
      ¬       ...inverse; i.e. do they have no elements in common
       ɓ   ȯ  logical OR the result of that with...
        ³=    elementwise equality with original input, and...
          S   ...sum; i.e. are some characters in the same position

main link:
Ẋ             shuffle the input list
  ¿           while
 Ç            the result of the previous link is truthy

OP의 모든 테스트 케이스로 테스트하여 모든 테스트 케이스에서 작동
Skidsdev

이것은 젤리에게는 정말 길지만, 다른 모든 것에는 매우 짧습니다 (05AB1E 및 기타 미친 골프 언어 제외).
그리폰 (

예, 그것은 너무 짧습니다. 젤리조차도 이것을 골퍼하게 할 것이라고 기대하지 않았습니다. 심지어 원래의 문자 위치를 확인하지 않은 05AB1E의 잘못된 해결책 조차 45 바이트였습니다
Skidsdev

젤리에 의해 손상된 또 다른 모드가 있습니다. 얼마나 슬픈.
caird coinheringaahing

3

파이썬 2 , 185 바이트

from itertools import*
x=input()
g=lambda m:set(zip(m*2,(m*2)[1:]))
for l in permutations(x):
 if not((g(l)|g(l[::-1]))&(g(x)|g(x[::-1]))or any(a==b for a,b in zip(x,l))):print`l`[2::5]

온라인으로 사용해보십시오!
유효한 모든 문자열을 인쇄합니다


테스트 mayube, stephenshelowi, 출력 검증 그래도 좀 더 집중적으로 테스트 할 수 있도록 모든 3. 필요를 위해 작동하는 것 같다
Skidsdev

시간이 초과 aabcdeffghij되었지만 작동하지 않는다는 의미는 아닙니다. 입력에 1 분 이상 걸리는 것입니다.
Skidsdev

내 컴퓨터에서 "aabcdeffghij"를 실행하는 데 시간이 오래 걸립니다. 지금까지> 2 분. 또한 이것은 스펙에 따르지 않는 하나 이상의 순열을 인쇄하는 것처럼 보입니다.
찰스

Rod-바이트를 절약 할 수 있습니다print next(l for l in permutations(x) if not((g(l)|g(l[::-1]))&(g(x)|g(x[::-1]))or any(a==b for a,b in zip(x,l))))
Charles

당신은 잊었 @NotthatCharles `l`[2::5]= /
로드

3

PHP> = 7.1, 147 바이트

for($a=$argn,$r="^$a[-1].*$a[0]$",$k=0;$v=$a[$k];)$r.="|^.{{$k}}$v|$v".($l=$a[$k++-1])."|$l$v";for(;preg_match("#$r#",$s=str_shuffle($a)););echo$s;

PHP 샌드 박스 온라인

PHP> = 7.1, 184 바이트

정규식 대신 레 벤슈 테인 거리를 사용하십시오.

for($a=$argn;$v=$a[$k];$r[]=$l.$v)$r[]=$v.($l=$a[$k++-1]);for(;!$t&&$s=str_shuffle($a);)for($t=1,$i=0;$v=$s[$i];$t*=$v!=$a[$i++])foreach($r as$x)$t*=levenshtein($x,$s[$i-1].$v);echo$s;

PHP 샌드 박스 온라인

PHP , 217 바이트

7.1 이하 버전

for($l=strlen($a=$argn),$r=$a[$k=0].$a[$l-1]."|".$a[$l-1]."$a[0]|^{$a[$l-1]}.*$a[0]$";$v=$a[$k];!$k?:$r.="|$v".$a[$k-1],++$k<$l?$r.="|$v".$a[$k]:0)$r.="|^.{{$k}}$v";for(;preg_match("#$r#",$s=str_shuffle($a)););echo$s;

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


오 작동 세상에
Skidsdev

왜 작동하지 않아야합니까? 가능한 모든 정규 표현식을 만듭니다. 일치하면 문자열이 일치하지 않을 때까지 셔플
Jörg Hülsermann

실패 기다려 helowi, 출력 ioewlh, ih인접
Skidsdev

@Mayube 자 이제 마지막 사건을 안전하게해야합니다
Jörg Hülsermann

예, OP의 모든 테스트 케이스로 테스트되었으며 모두 작동합니다.
Skidsdev

3

Brachylog , 21 바이트

p.jP;?z≠ᵐ&j¬{s₂p~s}P∧

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

설명

나는 실제로 p.;?z≠ᵐ&j¬{s₂p~s~j}2 바이트 더 적게 작업 하기 를 원했지만 ~j충분히 똑똑하지 않은 것 같습니다 ...

p.jP;?z≠ᵐ&j¬{s₂p~s}P∧  Input is a string, say ? = "asdfgha"
p                      Take a permutation of ?, say "sfagadh".
 .                     It is the output.
  j                    Concatenate it to itself: "sfagadhsfagadh"
   P                   Call that string P.
    ;?                 Pair P with the input: ["sfagadhsfagadh","asdfgha"]
      z                Zip, repeating elements of the longer string:
                        [["s","a"],["f","s"],["a","d"],...,["a","g"],["d","h"],["h","a"]]
       ≠ᵐ              Each pair must have different elements.
         &             Start new predicate
          j            Concatenate ? to itself: "asdfghaasdfgha"
           ¬{     }    The following cannot be satisfied:
             s₂        Take a substring of length 2
               p       and permute it.
                ~s     It is a substring of
                   P   P.
                    ∧  Do not unify P with the output.

2

PHP 7.1, 136131 바이트

Jörg의 솔루션에서 영감을 얻은 것 :

for($a=$argn;$c=$a[$k];)$r.="|$c".($d=$a[$k-1])."|$d$c|^.{".+$k++."}$c";while(preg_match("#$a$r#",($s=str_shuffle($a)).$s));echo$s;

파이프로 실행 -r하거나 온라인으로 테스트하십시오 . (PHP 버전 7.1 이상이 선택되어 있는지 확인하십시오)

PHP 7.1이 필요합니다. 이전 PHP의 경우 14 바이트 추가 : Replace $k-1with ($k?:strlen($a))-1;
(PHP <5.3의 경우 2 바이트 추가 $k?$k-1:strlen($a)-1)

고장

# A: loop through input to collect sub-expressions
for($a=$argn;$c=$a[$k];)
    $r.="|$c".($d=$a[$k-1])     # 1. pair of characters
        ."|$d$c"                # 2. reversed pair
        ."|^.{".+$k++."}$c";    # 3. $c is at k-th position
# B: shuffle input until regex does not match the result
while(preg_match("#$a$r#",($s=str_shuffle($a)).$s));    # (input as dummy sub-expression)
# C: print result
echo$s;

@ JörgHülsermann 훨씬 더;)
Titus

@ JörgHülsermann 래핑 케이스는를 $c=$a[$k=0], $d=$a[$k-1]통해 첫 번째 반복 ( ) 에서 처리 됩니다 $s.$s.
Titus

좋아 좋은 트릭
Jörg Hülsermann

1

PHP 7.1, 18785172178143 바이트

do for($r=str_shuffle($s=$argn),$p=$i=0;$c=$s[$i];$p+=($c==$z)+preg_match("#$a|$b#",$s.$s))$b=strrev($a=$r[$i-1].$z=$r[$i++]);while($p);echo$r;

파이프로 실행 -r하거나 온라인으로 테스트하십시오 . (PHP 버전 7.1.0 이상이 선택되어 있는지 확인하십시오!)

고장

do
    for($r=str_shuffle($s=$argn),   # 2. shuffle input
        $p=$i=0;$c=$s[$i];          # 3. loop through input
        $p+=($c==$z)                        # 2. set $p if char is at old position
            +preg_match("#$a|$b#",$s.$s)    #    or if adjacency occurs in input
    )
        $b=strrev($a=$r[$i-1].$z=$r[$i++]); # 1. concat current with previous character
while($p);                          # 1. loop until $p is falsy
echo$r;                             # 4. print

입력 실패 mayube, 출력 yeuamb, ma인접
Skidsdev

1
또한 귀하의 온라인 테스터는 좋지 않은 것 같습니다. 3 초 후에 시간 초과를 시도한 모든 테스트 케이스
Skidsdev

@Mayube 언급하는 것을 잊었다 : PHP 버전 7.1 사용
Titus


1

자바 스크립트 6, 116 바이트

f=x=>(h=[...x].sort(_=>Math.random(z=0)-.5)).some(y=>y==x[z]||(x+x).match(y+(q=h[++z]||h[0])+'|'+q+y))?f(x):h.join``

f=x=>(h=[...x].sort(_=>Math.random(z=0)-.5)).some(y=>y==x[z]||(x+x).match(y+(q=h[++z]||h[0])+'|'+q+y))?f(x):h.join``

console.log (f('abcdef'));


1

Stax , 23 21 바이트

å╘┤‼¬½P¥ë└w↕⌐î◘E{╟u!Ö

온라인으로 실행하고 디버그하십시오!

2 바이트를 절약 해 준 @recursive에 감사드립니다.

실행하는 데 시간이 오래 걸립니다. 더 합리적이고 실행 가능한 버전은 (2 바이트 만 더)

Ç≡╨áiS║çdèû.#-Gî☺└╨◙σφ+

온라인으로 실행하고 디버그하십시오!

설명

압축이 풀린 버전을 사용하여 설명합니다.

w|Nc_:=nGyG|*{E-!f+}ch+2B
w                            Loop anything before `}` while
 |N                          Next permutation (starting from the input)
   c_:=                      Index where the current array has the same element as the input (*)
                   }ch+2B    Define a block that finds all contiguous pairs in current string, including the pair `[last element, first element]`
       nG                    Apply the defined block to current string                         
         yG                  Do the same for the input
           |*                Outer product, contains pairs (which themselves are pairs) constructed from the last two array.
             {   f           Only keep pairs
              E-!            whose two elements have the same set of characters
                  +          Prepend the array at step (*).
                             This is used as the condition for the while loop

좋은. 을 사용하여 개선 할 수 있습니다 G. 당신은 일을 {...}X!...x!두 번 같은 블록을 실행 할 수 있습니다. 일반적으로, 당신은이를 다시 작성할 수 있습니다 G...G }... 같은 프로그램의 끝 .
재귀

고맙습니다. 나는 G다른 게시물에서로 교체 {...}*하여 1 바이트를 절약 하는 데 사용하는 것을 보았습니다 D.... 나는 아직도 그것에 익숙하지 않은 것 같아요 ...
Weijun Zhou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.