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!


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

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


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!


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.

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;

@ 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

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!


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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.