その文字列を文字化けします!


20

文字列を入力として、次のような文字列の1つ以上のバリアントを出力します。

  • 元の位置にキャラクターがいない
  • 最初に隣接していたキャラクターに隣接するキャラクターはありません

これは、指定された文字列に対して常に可能であり、単一の大文字のアルファベット文字のみを含むと想定できます([a-z]または必要に[A-Z]応じて)

同じ文字の重複は一意と見なされないことに注意してください。

たとえば、inputを指定するprogrammingと、出力にm7番目または 8番目の文字を含めることはできずg、4番目または 11番目の文字に含めることはできません(1インデックス付き)

例:

文字列を取る abcdef

有効な出力は次のとおりです。 daecfb

ただし、次のfdbcae例は無効です。この例のようにcbまだ隣接しています。

隣接関係はまた、あなたが行うことができなかったという意味、ラップfdbecaなどfaまだ隣接しています。

テストケース:

指定された入力に対して有効な出力はこれらだけではないことに注意してください

として書かれた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の可能性を除いて、他のいくつかの非常識なゴルフ言語と。)
グリフォン-復活モニカ

ええ、それはめちゃくちゃ短い、私もゼリーそれをこのgolfilyを行うことを期待していなかったです、でも05AB1Eの間違った元のcharの位置をチェックしませんでした溶液を45のバイトだった
Skidsdev

Jellyによって破損した別のMODがあります。なんて悲しい。
2

3

Python 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]

オンラインでお試しください!
すべての有効な文字列を出力します


試験しmayubestephensそしてhelowi、にもかかわらずいくつかのより集中的なテストを行うために、出力バリデータを作るために、すべて3 Iの必要性のために働くようだ
Skidsdev

のためaabcdeffghijにタイムアウトしましたが、それは機能しないという意味ではなく、その入力に1分以上かかるというだけです
-Skidsdev

私のマシンで「aabcdeffghij」を実行するには長い時間がかかります。これまでのところ> 2分。また、これは複数の順列を出力するように見えますが、これは仕様に準拠していません。
チャールズ

ロッド-あなたはいくつかのバイトを保存することができます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))))
チャールズ

@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

なぜ機能しないのですか?あらゆる正規表現を作成します。一致する場合は、一致しないまで文字列をシャッフルします
ヨルグヒュルザーマン

待機、失敗helowi、出力ioewlhiおよびh隣接
-Skidsdev

@Mayubeさて、これで最後のケースが安全になります
ヨルグヒュルサーマン

うん

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、136の 131バイト

ヨルグのソリューションに触発された:

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バイトを追加$k-1($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さらに多く;)
タイタス

@JörgHülsermannラッピングのケースは、最初のイテレーション($c=$a[$k=0], $d=$a[$k-1])で処理されます$s.$s
タイタス

さて、いいトリック
ヨルグ・ヒュルサーマン

1

PHP 7.1、187の185 172 178 143バイト

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、出力yeuambmおよびa隣接で失敗
-Skidsdev

1
また、オンラインテスターはあまり良くないようです。3秒後にタイムアウトしたばかりのすべてのテストケース
Skidsdev

@Mayube私は言及を忘れてしまった:使用PHPバージョン7.1
タイタス


1

JavaScript 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

スタックス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!同じブロックを2回実行しようとしています。一般的に、あなたはこれを書き換えることができるG...G }... 同じように、プログラムの最後に、この
再帰的

ありがとうございました。G別の投稿でを使用して1バイト節約するために使用しているのを見まし{...}*D...。私は...ちょうどまだかなりそれに慣れていないです推測
Weijun周
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.