Gargarisez cette chaîne!

20

Étant donné une chaîne en entrée, sortez une ou plusieurs variantes de la chaîne de sorte que:

  • Aucun personnage n'est dans sa position d'origine
  • Aucun personnage n'est adjacent à un personnage auquel il était à l'origine adjacent

Vous pouvez supposer que cela sera toujours possible pour la chaîne donnée et ne contiendra que des caractères alphabétiques à casse unique ( [a-z]ou [A-Z]si vous préférez)

Notez que les doublons du même caractère ne sont pas considérés comme uniques.

Par exemple, étant donné l'entrée programming, la sortie ne peut pas contenir un mau 7ème ou 8ème caractère, et ne peut pas contenir un gau 4ème ou 11ème caractère (1 indexé)

Exemple:

Prends la ficelle abcdef

Ce qui suit serait une sortie valide: daecfb

Cependant, les éléments suivants ne seraient pas valides: fdbcaecomme dans cet exemple cet bsont toujours adjacents.

L'adjacence s'enroule également, ce qui signifie que vous ne pouvez pas faire fdbecacomme fet que vous aêtes toujours adjacent.

Testcases:

Notez que ce ne sont pas les seules sorties valides pour les entrées données

Écrit comme input -> output:

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

Notation:

Il s'agit de donc le moins d'octets dans chaque langue gagne!

Skidsdev
la source
No character is adjacent to a character that it was originally adjacent to. L'ordre n'est-il pas important pour la contiguïté? Donc l'entrée "abcd" ne peut avoir "ab" nulle part, et ne peut avoir "ba" nulle part non plus?
DrZ214
@ DrZ214 qui est correct
Skidsdev

Réponses:

5

Gelée , 24 23 octets

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

Essayez-le en ligne!

Extrêmement longue en raison de mon horreur à Jelly, mais ça marche enfin, au moins ... toujours en train de jouer au golf.

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
Poignée de porte
la source
Testé avec tous les tests en OP, fonctionne pour chacun d'eux
Skidsdev
Cela peut être très long pour Jelly, mais c'est extrêmement court pour tout le reste (à l'exception possible de 05AB1E et de quelques autres langues de golf insensées.)
Gryphon - Reinstate Monica
oui, c'est incroyablement court, je ne m'attendais pas à ce que Jelly le fasse aussi golfiquement, même la mauvaise solution de 05AB1E qui n'a pas vérifié la position d'origine du caractère était de 45 octets
Skidsdev
Il y a un autre mod, corrompu par Jelly. Quelle tristesse.
caird coinheringaahing du
3

Python 2 , 185 octets

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]

Essayez-le en ligne!
Imprime toutes les chaînes valides

Barre
la source
testé pour mayube, stephenset helowi, semble fonctionner pour tous 3. J'ai besoin de faire un validateur de sortie pour faire des tests plus intensifs
Skidsdev
Chronométré pour aabcdeffghij, mais cela ne signifie pas qu'il ne fonctionne pas, il faut juste que plus d'une minute pour cette entrée
Skidsdev
L'exécution de "aabcdeffghij" sur ma machine prend beaucoup de temps. Jusqu'à présent> 2min. Il semble également que cela imprime plus d'une permutation, ce qui n'est pas conforme aux spécifications.
Pas que Charles
Rod - Vous pouvez économiser quelques octets avecprint 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))))
Pas que Charles
@NotthatCharles vous avez oublié le `l`[2::5]= /
Rod
3

PHP> = 7.1, 147 octets

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 Online

PHP> = 7.1, 184 octets

Utilisez la distance levenshtein au lieu d'une méthode 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 Online

PHP , 217 octets

Version sous 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;

Essayez-le en ligne!

Jörg Hülsermann
la source
Oh mon dieu ça marche
Skidsdev
Pourquoi cela ne fonctionnerait-il pas? Je fais tous les regex possibles. S'il correspond, mélangez la chaîne jusqu'à ce qu'elle ne corresponde pas
Jörg Hülsermann
attendre, échoue sur helowi, sorties ioewlh, iet hsont adjacentes
Skidsdev
@Mayube D'accord, cela devrait maintenant rendre le dernier cas sûr
Jörg Hülsermann
Ouaip, testé avec toutes les testcases du PO, ils fonctionnent tous
Skidsdev
3

Brachylog , 21 octets

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

Essayez-le en ligne!

Explication

J'aurais vraiment voulu p.;?z≠ᵐ&j¬{s₂p~s~j}travailler pour 2 octets de moins, mais il semble que ce ne ~jsoit pas assez intelligent ...

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
la source
2

PHP 7.1, 136 131 octets

inspiré par la solution de 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;

Exécuter en tant que pipe avec -rou tester en ligne . (Assurez-vous que PHP version 7.1 ou supérieure est sélectionné)

Nécessite PHP 7.1; ajouter 14 octets pour les anciens PHP: remplacer $k-1par ($k?:strlen($a))-1;
(deux octets pour PHP <5.3: $k?$k-1:strlen($a)-1)

panne

# 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
la source
@ JörgHülsermann beaucoup plus;)
Titus
@ JörgHülsermann Le cas d'emballage est traité dans la première itération ( $c=$a[$k=0], $d=$a[$k-1]) via $s.$s.
Titus
Bon truc ok
Jörg Hülsermann
1

PHP 7.1, 187 185 172 172 178 143 octets

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;

Exécuter en tant que pipe avec -rou tester en ligne . (Assurez-vous que PHP version 7.1.0 ou supérieure est sélectionné!)

panne

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
la source
Échoue sur l' entrée mayube, les sorties yeuamb, met asont adjacentes
Skidsdev
1
De plus, votre testeur en ligne ne semble pas être très bon, tous les cas de test que j'ai essayés juste après un délai de 3 secondes
Skidsdev
@Mayube J'ai oublié de mentionner: Utilisez PHP version 7.1
Titus
1

Ruby, 110 97 102 octets

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

Essayez-le en ligne!

daniero
la source
Cela ne suit pas la règle de contiguïté "enveloppante"; par exemple, j'ai obtenu 3594817062une sortie sur votre lien TIO.
Poignée de porte
@ Doorknob fixed!
daniero
1

JavaScript 6, 116 octets

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
la source
1

Stax , 23 21 octets

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

Exécutez et déboguez en ligne!

Merci pour @recursive d'avoir sauvé 2 octets.

Prend très longtemps à courir. Une version plus raisonnable / réalisable est (seulement 2 octets de plus)

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

Exécutez et déboguez en ligne!

Explication

Utilise la version décompressée pour expliquer.

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
la source
Agréable. Il y a une amélioration que vous pouvez apporter en utilisant G. Vous faites {...}X!...x!pour exécuter deux fois le même bloc. En général, vous pouvez réécrire cela comme G...G avec }... à la fin du programme, comme cela .
récursif
Je vous remercie. Je vous ai vu utilisé Gdans un autre post pour économiser un octet en le remplaçant {...}*par D.... Je suppose que je n'y suis toujours pas habitué ...
Weijun Zhou