Colpisci quella corda!


20

Data una stringa come input, genera una o più varianti della stringa in modo tale che:

  • Nessun personaggio è nella sua posizione originale
  • Nessun personaggio è adiacente a un personaggio a cui era originariamente adiacente

Puoi presumere che ciò sarà sempre possibile per la stringa specificata e conterrà solo caratteri alfabetici maiuscoli ( [a-z]o [A-Z]se preferisci)

Si noti che i duplicati dello stesso personaggio non sono considerati unici.

Ad esempio, dato l'input programming, l'output non può contenere un carattere mal settimo o ottavo e non può contenere un carattere gal quarto o undicesimo (1 indicizzato)

Esempio:

Prendi la corda abcdef

Quanto segue sarebbe un output valido: daecfb

Tuttavia, quanto segue non sarebbe valido: fdbcaecome in questo esempio ce bsono ancora adiacenti.

Anche l'adiacenza si avvolge, il che significa che non si può fare fdbecacome fe asono ancora adiacenti.

Casi test:

Nota che queste non sono le uniche uscite valide per gli ingressi dati

Scritto come input -> output:

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

punteggio:

Si tratta di quindi vince il minor numero di byte in ogni lingua !


No character is adjacent to a character that it was originally adjacent to. L'ordine non ha importanza per l'adiacenza? Quindi input "abcd" non può avere "ab" da nessuna parte, e neanche "ba" da nessuna parte?
DrZ214,

@ DrZ214 che è corretto
Skidsdev

Risposte:


5

Gelatina , 24 23 byte

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

Provalo online!

Molto a lungo in virtù del mio essere terribile con Jelly, ma alla fine funziona, almeno ... ancora nel corso del 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

Testato con tutti i test in OP, funziona per tutti loro
Skidsdev,

Questo potrebbe essere davvero lungo per Jelly, ma è estremamente breve per tutto il resto (con la possibile eccezione di 05AB1E e alcune altre lingue da golf folli).
Gryphon - Reinstate Monica l'

sì, è follemente corto, non mi aspettavo che Jelly lo facesse così da golf, anche la soluzione sbagliata di 05AB1E che non ha verificato la posizione del char originale era di 45 byte
Skidsdev

Ecco un'altra mod, corrotta da Jelly. Che triste.
caird coinheringaahing

3

Python 2 , 185 byte

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]

Provalo online!
Stampa tutte le stringhe valide


testato per mayube, stephense helowi, sembra funzionare per tutti 3. Devo creare un validatore di output per fare alcuni test più intensi
Skidsdev

Tempo scaduto aabcdeffghij, ma ciò non significa che non funzioni, solo che ci vuole più di un minuto per quell'input
Skidsdev

Ci vuole molto tempo per eseguire "aabcdeffghij" sulla mia macchina. Finora> 2min. Sembra anche che questa stampa più di una permutazione, che non è secondo le specifiche.
Non che Charles l'

Rod - Puoi salvare alcuni byte conprint 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))))
Non che Charles l'

@NotthatCharles hai dimenticato il `l`[2::5]= /
Rod

3

PHP> = 7,1, 147 byte

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 byte

Usa la distanza del levenshtein invece del modo 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 byte

Versione sotto 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;

Provalo online!


Oh mio dio funziona
Skidsdev l'

Perché non dovrebbe funzionare? Faccio ogni possibile regex. Se corrisponde mischia la stringa fino a quando non corrisponde
Jörg Hülsermann,

attendere, non riesce in helowi, uscite ioewlh, ie hsono adiacenti
Skidsdev

@Mayube Va bene che ora dovrebbe rendere sicuro l'ultimo caso
Jörg Hülsermann,

Sì, testato con tutti i test in OP, funzionano tutti
Skidsdev l'

3

Brachylog , 21 byte

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

Provalo online!

Spiegazione

Avrei davvero voluto p.;?z≠ᵐ&j¬{s₂p~s~j}lavorare per 2 byte in meno, ma sembra che ~jnon sia abbastanza intelligente ...

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 byte

ispirato alla soluzione di 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;

Esegui come pipe -ro testalo online . (Assicurati che PHP versione 7.1 o successiva sia selezionato)

Richiede PHP 7.1; aggiungi 14 byte per PHP precedente: sostituisci $k-1con ($k?:strlen($a))-1;
(due più byte per PHP <5.3: $k?$k-1:strlen($a)-1)

abbattersi

# 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 molto di più;)
Tito

@ JörgHülsermann Il caso di wrapping viene gestito nella prima iterazione ( $c=$a[$k=0], $d=$a[$k-1]) tramite $s.$s.
Tito,

Okay bel trucco
Jörg Hülsermann,

1

PHP 7.1, 187 185 172 178 143 byte

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;

Esegui come pipe -ro testalo online . (Assicurati che PHP versione 7.1.0 o successiva sia selezionato!)

abbattersi

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

Non riesce in ingresso mayube, uscite yeuamb, me asono adiacenti
Skidsdev

1
Anche il tuo tester online non sembra essere molto buono, ogni testcase che ho provato è appena scaduto dopo 3 secondi
Skidsdev

@Mayube Ho dimenticato di menzionare: Usa PHP versione 7.1
Titus

1

Rubino, 110 97 102 byte

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

Provalo online!


Ciò non segue la regola di adiacenza "avvolgente"; per esempio, ho ottenuto 3594817062come output sul tuo link TIO.
Maniglia della porta

@Doorknob fixed!
daniero,

1

JavaScript 6, 116 byte

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 byte

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

Esegui ed esegui il debug online!

Grazie per @recursive per aver salvato 2 byte.

Ci vuole molto tempo per correre. Una versione più ragionevole / fattibile è (solo 2 byte in più)

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

Esegui ed esegui il debug online!

Spiegazione

Usa la versione decompressa per spiegare.

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

Bello. C'è un miglioramento che puoi fare usando G. Stai eseguendo {...}X!...x!due volte lo stesso blocco. In generale, puoi riscriverlo come G...G con }... alla fine del programma, in questo modo .
ricorsivo

Grazie. Ti ho visto usato Gin un altro post per salvare un byte sostituendolo {...}*con D.... Immagino che non ci sia ancora del tutto abituato ...
Weijun Zhou
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.