Garble essa corda!

20

Dada uma sequência como entrada, imprima uma ou mais variantes da sequência, de modo que:

  • Nenhum personagem está em sua posição original
  • Nenhum personagem é adjacente a um personagem ao qual ele era originalmente adjacente

Você pode supor que isso sempre seja possível para a sequência especificada e conterá apenas caracteres alfabéticos em maiúsculas e minúsculas ( [a-z]ou [A-Z]se você preferir)

Observe que duplicatas do mesmo caractere não são consideradas únicas.

Por exemplo, dada a entrada programming, a saída não pode conter um mno 7º ou 8º caractere e não pode conter um gno 4º ou 11º caractere (1 indexado)

Exemplo:

Pegue a corda abcdef

O seguinte seria uma saída válida: daecfb

No entanto, o seguinte seria inválido: fdbcaecomo neste exemplo ce bainda é adjacente.

Adjacência também envolve, o que significa que você não pode fazer fdbecacomo fe aainda é adjacente.

Casos de teste:

Observe que essas não são as únicas saídas válidas para as entradas fornecidas

Escrito como input -> output:

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

Pontuação:

Isso é e o menor número de bytes em cada idioma vence!

Skidsdev
fonte
No character is adjacent to a character that it was originally adjacent to. A ordem não importa para adjacência? Portanto, a entrada "abcd" não pode ter "ab" em lugar nenhum e também não pode ter "ba" em lugar algum?
DrZ214
@ DrZ214 que está correto
Skidsdev

Respostas:

5

Geléia , 24 23 bytes

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

Experimente online!

Extremamente longo em virtude de eu ser péssimo em Jelly, mas finalmente funciona, pelo menos ... ainda no processo de jogar golfe.

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
Maçaneta da porta
fonte
Testado com todos os casos de teste em OP, funciona para todos eles
Skidsdev
Isso pode ser muito longo para Jelly, mas sua extremamente curto para tudo o resto (com a possível exceção de 05AB1E, e algumas outras línguas de golfe louco.)
Gryphon - Reintegrar Monica
sim, é insanamente suma, eu não esperava mesmo Jelly para fazê-lo desta golfily, mesmo de 05AB1E errado solução que não verificar a posição de char original foi de 45 bytes
Skidsdev
Lá vai outro mod, corrompido por Jelly. Que triste.
caird coinheringaahing
3

Python 2 , 185 bytes

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]

Experimente online!
Imprime todas as strings válidas

Cajado
fonte
testado para mayube, stephense helowi, parece trabalho para todos necessidade 3. I para fazer um validador de saída para fazer alguns testes mais intensivo embora
Skidsdev
Cronometrado para fora para aabcdeffghij, mas isso não significa que ele não funciona, só que demora mais de um minuto para que a entrada
Skidsdev
Leva muito tempo para executar "aabcdeffghij" na minha máquina. Até agora> 2min. Também parece que isso imprime mais de uma permutação, o que não está de acordo com as especificações.
Não que Charles,
Rod - Você pode salvar alguns bytes comprint 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))))
Não que Charles
@NotthatCharles você esqueceu o `l`[2::5]= /
Rod
3

PHP> = 7.1, 147 bytes

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;

Sandbox do PHP Online

PHP> = 7.1, 184 bytes

Use a distância levenshtein em vez de uma maneira 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;

Sandbox do PHP Online

PHP , 217 bytes

Versão sob 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;

Experimente online!

Jörg Hülsermann
fonte
Ah, meu Deus, isso funciona #
Skidsdev
Por que não deveria funcionar? Eu faço todo o possível regex. Se ele corresponder embaralhar a corda até que não combinam
Jörg Hülsermann
esperar, falha em helowi, saídas ioewlh, ie hsão adjacentes
Skidsdev
@Mayube Tudo bem que agora deve fazer o último caso segura
Jörg Hülsermann
Yup, testado com todos os casos de teste do OP, todos eles trabalham
Skidsdev
3

Braquilog , 21 bytes

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

Experimente online!

Explicação

Eu realmente gostaria p.;?z≠ᵐ&j¬{s₂p~s~j}de trabalhar por 2 bytes a menos, mas parece que ~jnão é inteligente o suficiente ...

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.
Zgarb
fonte
2

PHP 7.1, 136 131 bytes

inspirado na solução da 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;

Execute como tubo -rou teste-o online . (Verifique se a versão 7.1 ou superior do PHP está selecionada)

Requer PHP 7.1; adicione 14 bytes para o PHP mais antigo: Substitua $k-1por ($k?:strlen($a))-1;
(mais dois bytes para PHP <5.3: $k?$k-1:strlen($a)-1)

demolir

# 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;
Titus
fonte
@ JörgHülsermann more more;)
Titus
@ JörgHülsermann O invólucro é tratado na primeira iteração ( $c=$a[$k=0], $d=$a[$k-1]) via $s.$s.
Titus
Ok, bom truque
Jörg Hülsermann 8/17
1

PHP 7.1, 1871851721717380 bytes

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;

Execute como tubo -rou teste-o online . (Verifique se a versão 7.1.0 ou superior do PHP está selecionada!)

demolir

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
Titus
fonte
Falha na entrada mayube, saídas yeuamb, me asão adjacentes
Skidsdev
1
Também o seu tester on-line não parece ser muito bom, todos os testcase Eu tentei apenas timesout após 3 segundos
Skidsdev
@Mayube eu esqueci de mencionar: Use PHP versão 7.1
Titus
1

Ruby, 110 97 102 bytes

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

Experimente online!

daniero
fonte
Isso não segue a regra de "quebra automática" de adjacência; por exemplo, recebi 3594817062como saída no seu link TIO.
Maçaneta
@Doorknob fixed!
Daniero 9/06
1

JavaScript 6, 116 bytes

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'));

l4m2
fonte
1

Stax , 23 21 bytes

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

Execute e depure online!

Obrigado por @recursive por salvar 2 bytes.

Leva muito tempo para ser executado. Uma versão mais razoável / viável é (apenas 2 bytes a mais)

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

Execute e depure online!

Explicação

Usa a versão descompactada para explicar.

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
Weijun Zhou
fonte
Agradável. Há uma melhoria que você pode fazer usando G. Você está executando {...}X!...x!para executar o mesmo bloco duas vezes. Em geral, você pode reescrever isso como G...G com }... no final do programa, como este .
recursivo em
Obrigado. Eu já o vi usado Gem outra postagem para salvar um byte, substituindo {...}*por D.... Eu acho que estou apenas ainda não completamente acostumado com isso ...
Weijun Zhou