Rời chuỗi đó!


20

Đưa ra một chuỗi làm đầu vào, đầu ra một hoặc nhiều biến thể của chuỗi sao cho:

  • Không có nhân vật ở vị trí ban đầu của nó
  • Không có ký tự nào liền kề với một ký tự mà ban đầu nó liền kề với

Bạn có thể giả sử điều này sẽ luôn khả thi đối với chuỗi đã cho và sẽ chỉ chứa các ký tự chữ cái trong trường hợp duy nhất ( [a-z]hoặc [A-Z]nếu bạn thích)

Lưu ý rằng các bản sao của cùng một ký tự không được coi là duy nhất.

Ví dụ: được cung cấp đầu vào programming, đầu ra không thể chứa ký tự mthứ 7 hoặc thứ 8 và không thể chứa ký tự gthứ 4 hoặc thứ 11 (1 được lập chỉ mục)

Thí dụ:

Lấy chuỗi abcdef

Sau đây sẽ là một đầu ra hợp lệ: daecfb

Tuy nhiên, những điều sau đây sẽ không hợp lệ: fdbcaenhư trong ví dụ này cbvẫn liền kề.

Điều chỉnh cũng kết thúc tốt đẹp, có nghĩa là bạn không thể làm fdbecanhư vậy favẫn liền kề.

Testcase:

Lưu ý đây không phải là đầu ra hợp lệ duy nhất cho các đầu vào đã cho

Viết như input -> output:

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

Ghi điểm:

Đây là để có ít byte nhất trong mỗi ngôn ngữ !


No character is adjacent to a character that it was originally adjacent to. Có thứ tự không quan trọng cho kề. Vì vậy, đầu vào "abcd" không thể có "ab" ở bất cứ đâu và cũng không thể có "ba" ở bất cứ đâu?
DrZ214

@ DrZ214 đúng
Skidsdev

Câu trả lời:


5

Thạch , 24 23 byte

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

Hãy thử trực tuyến!

Vô cùng lâu bởi sự kinh khủng của tôi tại Jelly, nhưng cuối cùng nó cũng hoạt động, ít nhất là ... vẫn đang trong quá trình chơi gôn.

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

Đã thử nghiệm với tất cả các testcase trong OP, hoạt động cho tất cả chúng
Skidsdev

Điều này có thể thực sự dài đối với Jelly, nhưng nó cực kỳ ngắn đối với mọi thứ khác (ngoại trừ có thể là 05AB1E và một vài ngôn ngữ chơi golf điên rồ khác.)
Gryphon - Tái lập Monica

vâng, nó cực kỳ ngắn, tôi thậm chí không mong đợi Jelly sẽ làm điều này một cách vô tư, ngay cả giải pháp sai lầm của 05AB1E mà không kiểm tra vị trí char ban đầu là 45 byte
Skidsdev

Có một mod khác, bị hỏng bởi Jelly. Buồn làm sao.
caird coinheringaahing

3

Python 2 , 185 byte

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]

Hãy thử trực tuyến!
In tất cả các chuỗi hợp lệ


kiểm tra mayube, stephenshelowi, dường như làm việc cho tất cả 3. Tôi cần phải thực hiện một validator đầu ra để làm một số xét nghiệm chuyên sâu hơn mặc dù
Skidsdev

Đã hết thời gian aabcdeffghij, nhưng điều đó không có nghĩa là nó không hoạt động, chỉ là nó mất nhiều hơn một phút cho đầu vào đó
Skidsdev

Phải mất một thời gian dài để chạy "aabcdeffghij" trên máy của tôi. Cho đến nay> 2 phút. Cũng có vẻ như điều này in nhiều hơn một hoán vị, không theo thông số kỹ thuật.
Không phải Charles

Rod - Bạn có thể lưu một số byte bằngprint 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))))
Không phải Charles

@NotthatCharles bạn đã quên `l`[2::5]= /
Rod

3

PHP> = 7.1, 147 byte

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 Sandbox trực tuyến

PHP> = 7.1, 184 byte

Sử dụng khoảng cách levenshtein thay vì cách Regex

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 Sandbox trực tuyến

PHP , 217 byte

Phiên bản dưới 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;

Hãy thử trực tuyến!


Ôi chúa ơi nó hoạt động
Skidsdev

Tại sao nó không hoạt động? Tôi thực hiện mọi regex có thể. Nếu nó khớp xáo trộn chuỗi cho đến khi nó không khớp
Jörg Hülsermann

chờ đợi, thất bại trên helowi, kết quả đầu ra ioewlh, ihliền kề
Skidsdev

@Mayube Được rồi, bây giờ sẽ làm cho trường hợp cuối cùng an toàn
Jörg Hülsermann

Yup, đã thử nghiệm với tất cả các thử nghiệm trong OP, tất cả đều hoạt động
Skidsdev

3

Brachylog , 21 byte

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

Hãy thử trực tuyến!

Giải trình

Tôi thực sự muốn p.;?z≠ᵐ&j¬{s₂p~s~j}làm việc với 2 byte ít hơn, nhưng có vẻ như nó ~jkhông đủ thông minh ...

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, 136 131 byte

lấy cảm hứng từ giải pháp Jörg bàos :

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;

Chạy như ống với -rhoặc kiểm tra nó trực tuyến . (Đảm bảo rằng phiên bản PHP 7.1 trở lên được chọn)

Yêu cầu PHP 7.1; thêm 14 byte cho PHP cũ hơn: Thay thế $k-1bằng ($k?:strlen($a))-1;
(thêm hai byte cho PHP <5.3 $k?$k-1:strlen($a)-1:)

phá vỡ

# 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 nhiều hơn nữa;)
Tít

@ JörgHülsermann Trường hợp gói được xử lý trong lần lặp đầu tiên ( $c=$a[$k=0], $d=$a[$k-1]) qua $s.$s.
Tít

Được rồi, mẹo hay
Jörg Hülsermann

1

PHP 7.1, 187 185 172 178 143 byte

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;

Chạy như ống với -rhoặc kiểm tra nó trực tuyến . (Đảm bảo rằng phiên bản PHP 7.1.0 trở lên được chọn!)

phá vỡ

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

Thất bại trên đầu vào mayube, đầu ra yeuamb, maliền kề
Skidsdev

1
Ngoài ra, trình kiểm tra trực tuyến của bạn có vẻ không tốt lắm, mọi bài kiểm tra tôi đã thử chỉ sau 3 giây
Skidsdev

@Mayube Tôi quên đề cập: Sử dụng phiên bản PHP 7.1
Titus

1

Ruby, 110 97 102 byte

->s{x=s.chars
t=s*2
x.shuffle!while s.size.times.any?{|i|a,b=(x*2)[i,2];a==s[i]||t[a+b]||t[b+a]}
x*''}

Hãy thử trực tuyến!


Điều này không tuân theo quy tắc "bao bọc" kề; ví dụ, tôi nhận được 3594817062như một đầu ra trên liên kết TIO của bạn.
Doorknob

@Doorknob đã sửa!
daniero

1

JavaScript 6, 116 byte

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 byte

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

Chạy và gỡ lỗi trực tuyến!

Cảm ơn vì @recursive đã lưu 2 byte.

Mất một thời gian rất dài để chạy. Một phiên bản hợp lý / khả thi hơn là (chỉ dài hơn 2 byte)

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

Chạy và gỡ lỗi trực tuyến!

Giải trình

Sử dụng phiên bản giải nén để giải thích.

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

Tốt đẹp. Có một cải tiến bạn có thể thực hiện bằng cách sử dụng G. Bạn đang làm {...}X!...x!để thực hiện cùng một khối hai lần. Nói chung, bạn có thể viết lại này như G...G với }... ở phần cuối của chương trình, như này .
đệ quy

Cảm ơn bạn. Tôi đã thấy bạn sử dụng Gtrong một bài đăng khác để lưu một byte bằng cách thay thế {...}*bằng D.... Tôi đoán là tôi vẫn chưa quen với nó ...
Weijun Zhou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.