乱码!


20

给定一个字符串作为输入,输出该字符串的一个或多个变体,使得:

  • 没有字符在其原始位置
  • 没有与该字符原本相邻的字符相邻的字符

您可以假设,对于给定的字符串,这将始终是可能的,并且仅包含单写字母字符([a-z]或者[A-Z]您愿意)

请注意,相同字符的重复项不被视为唯一。

例如,给定输入programming,输出不能m在第7个第8个字符处包含a,并且不能g在第4个第11个字符处包含a (索引为1)

例:

拿弦 abcdef

以下是有效的输出: daecfb

但是,以下内容将无效:fdbcae在本示例中cb它们仍然相邻。

邻接还包装,这意味着你不能做fdbecafa仍在相邻。

测试用例:

请注意,这些不是给定输入的唯一有效输出

撰写为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 '17

@ DrZ214是正确的
Skidsdev

Answers:


5

果冻24 23字节

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

在线尝试!

由于我对Jelly的糟糕表现,这已经非常漫长了,但它终于奏效了,至少……仍然在打高尔夫球。

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

对于Jelly来说,这可能确实很长,但是对于其他所有内容,它却都非常短(可能是05AB1E和其他一些疯狂的高尔夫语言除外。)
恢复莫妮卡(Monica)

是的,它太短了,我没想到连果冻都会这么做,甚至05AB1E的不检查原始字符位置的错误解决方案都是45个字节
Skidsdev

还有另一个由果冻破坏的mod。多么悲伤。
caird coinheringaahing

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。尽管如此,我需要使输出验证器进行一些更深入的测试
Skidsdev

超时了aabcdeffghij,但这并不意味着它不起作用,只是输入所花费的时间超过一分钟
Skidsdev

在我的计算机上运行“ aabcdeffghij”需要很长时间。到目前为止> 2分钟。还看起来像这样打印了多个排列,这与规范不符。
并不是查尔斯(Charles)

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))))
不是查尔斯

@NotthatCharles您忘了`l`[2::5]= /
Rod Rod

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字节

使用levenshtein距离代替正则表达式

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

为什么不起作用?我做所有可能的正则表达式。如果匹配洗牌字符串,直到它不匹配
约尔格Hülsermann

等待,失败helowi,输出ioewlhi并且h相邻
Skidsdev

@Mayube好了,现在应该让过去的情况下,安全
约尔格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,136个 131字节

受到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个字节:替换$k-1($k?:strlen($a))-1;
(两个用于PHP <5.3多个字节:$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),

好漂亮的绝招
约尔格Hülsermann

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,输出yeuambma邻近
Skidsdev

1
另外,您的在线测试仪似乎还不是很好,我尝试过的每个测试用例都在3秒后
超时

@Mayube我忘了提及:使用PHP版本7.1
Titus

1

Ruby 110 97102字节

->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*''}

在线尝试!


这不遵循“包装”邻接关系的规则;例如,我3594817062在您的TIO链接上得到了输出。
门把手

@固定的门把手!
daniero

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

Stax23 21 字节

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

在线运行和调试!

感谢@recursive节省2个字节。

需要很长时间才能运行。一个更合理/可行的版本是(仅长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在另一篇文章通过更换保存一个字节{...}*D...。我想我还是不太习惯……
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.