Zniszcz ten sznurek!


20

Biorąc pod uwagę ciąg wejściowy, wypisz jeden lub więcej wariantów ciągu, tak aby:

  • Żadna postać nie jest na swojej pierwotnej pozycji
  • Żadna postać nie sąsiaduje z postacią, z którą pierwotnie sąsiadowała

Możesz założyć, że zawsze będzie to możliwe dla danego ciągu i będzie zawierać tylko pojedyncze litery alfabetu ( [a-z]lub [A-Z]jeśli wolisz)

Pamiętaj, że duplikaty tego samego znaku nie są uważane za unikalne.

Na przykład, biorąc pod uwagę dane wejściowe programming, dane wyjściowe nie mogą zawierać znaku m7 lub 8 i nie mogą zawierać znaku g4 lub 11 (1 indeksowany)

Przykład:

Weź sznurek abcdef

Prawidłowe dane wyjściowe: daecfb

Jednak następujące elementy byłyby nieprawidłowe: fdbcaejak w tym przykładzie ci bnadal są przyległe.

Adiacencja również się zawija, co oznacza, że ​​nie możesz zrobić fdbecatak , jak fi anadal sąsiadujesz.

Przypadki testowe:

Uwaga: nie są to jedyne prawidłowe dane wyjściowe dla danych wejściowych

Zapisane jako input -> output:

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

Punktacja:

To jest więc wygrywa najmniej bajtów w każdym języku !


No character is adjacent to a character that it was originally adjacent to. Czy zamówienie nie ma znaczenia dla sąsiedztwa? Więc wejście „abcd” nie może mieć nigdzie „ab”, a nigdzie też nie może mieć „ba”?
DrZ214,

@ DrZ214, który jest poprawny
Skidsdev,

Odpowiedzi:


5

Galaretka , 24 23 bajty

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

Wypróbuj online!

Niezwykle długo z powodu mojej okropności w Jelly, ale w końcu to działa, przynajmniej ... wciąż w trakcie gry w golfa.

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

Testowany ze wszystkimi testami w OP, działa dla wszystkich
Skidsdev

To może być naprawdę długie dla Jelly, ale jest bardzo krótkie dla wszystkiego innego (z możliwym wyjątkiem 05AB1E i kilku innych szalonych języków golfowych.)
Gryphon - Przywróć Monikę

tak, jest niesamowicie krótki, nie spodziewałem się, że nawet Jelly zrobi to w golfa, nawet złe rozwiązanie 05AB1E, które nie sprawdzało oryginalnej pozycji char było 45 bajtów
Skidsdev

Idzie kolejny mod, zepsuty przez Jelly. Jak smutno.
caird coinheringaahing

3

Python 2 , 185 bajtów

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]

Wypróbuj online!
Wyświetla wszystkie poprawne ciągi


testowane pod kątem mayube, stephensi helowiwydaje się działać dla wszystkich potrzebujących 3. I dla dokonania walidator wyjście zrobić jakieś bardziej intensywne badania choć
Skidsdev

Przekroczono limit czasu aabcdeffghij, ale to nie znaczy, że to nie działa, wystarczy, że wejście zajmie więcej niż minutę
Skidsdev

Długo trwa uruchomienie „aabcdeffghij” na mojej maszynie. Jak dotąd> 2 min. Wygląda również na to, że drukuje więcej niż jedną permutację, co nie jest zgodne ze specyfikacją.
Nie, że Charles

Rod - Możesz zaoszczędzić trochę bajtów zprint 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))))
Nie, że Charles

@NotthatCharles zapomniałeś `l`[2::5]= /
Rod

3

PHP> = 7,1, 147 bajtów

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 bajtów

Użyj odległości levenshtein zamiast 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 bajtów

Wersja poniżej 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;

Wypróbuj online!


O mój boże to działa
Skidsdev

Dlaczego to nie powinno działać? Dokonuję każdego możliwego wyrażenia regularnego. Jeśli pasuje,
przetasuj

czekać na nie helowi, wyjścia ioewlh, ii hprzylega
Skidsdev

@Mayube Dobra, to powinno sprawić, że ostatnia sprawa będzie bezpieczna
Jörg Hülsermann

Tak, przetestowane ze wszystkimi testami w OP, wszystkie działają
Skidsdev

3

Brachylog , 21 bajtów

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

Wypróbuj online!

Wyjaśnienie

Naprawdę chciałbym p.;?z≠ᵐ&j¬{s₂p~s~j}pracować za 2 bajty mniej, ale wydaje się, że ~jnie jest wystarczająco inteligentny ...

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 bajtów

zainspirowany rozwiązaniem Jörga :

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;

Uruchom jako potok -rlub przetestuj go online . (Upewnij się, że wybrano PHP w wersji 7.1 lub nowszej)

Wymaga PHP 7.1; dodać 14 bajtów dla starszych PHP: Wymienić $k-1z ($k?:strlen($a))-1;
(dwa dalsze bajty PHP: <5,3 $k?$k-1:strlen($a)-1)

awaria

# 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 dużo więcej;)
Titus

@ JörgHülsermann Opakowanie jest obsługiwane w pierwszej iteracji ( $c=$a[$k=0], $d=$a[$k-1]) przez $s.$s.
Titus

Dobra fajna sztuczka
Jörg Hülsermann

1

PHP 7.1, 187 185 172 178 143 bajtów

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;

Uruchom jako potok -rlub przetestuj go online . (Upewnij się, że wybrano PHP w wersji 7.1.0 lub nowszej!)

awaria

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

Nie na wejściu mayube, produktów yeuamb, mi aprzylega
Skidsdev

1
Również twój tester online nie wydaje się być zbyt dobry, każda próba, którą próbowałem przekroczyć limit czasu po 3 sekundach
Skidsdev

@Mayube Zapomniałem wspomnieć: użyj wersji PHP 7.1
Titus

1

Rubin, 110 97 102 bajtów

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

Wypróbuj online!


Nie jest to zgodne z zasadą „owijania” sąsiedztwa; na przykład dostałem 3594817062jako wyjście na twój link TIO.
Klamka

@Doorknob naprawiony!
daniero

1

JavaScript 6, 116 bajtów

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 bajtów

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

Uruchom i debuguj online!

Dziękujemy za @recursive za zapisanie 2 bajtów.

Uruchomienie zajmuje bardzo dużo czasu. Bardziej rozsądną / wykonalną wersją jest (tylko 2 bajty dłużej)

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

Uruchom i debuguj online!

Wyjaśnienie

Używa rozpakowanej wersji do wyjaśnienia.

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

Ładny. Istnieje ulepszenie, którego możesz dokonać za pomocą G. Robisz, {...}X!...x!aby wykonać ten sam blok dwa razy. Ogólnie rzecz biorąc, można przepisać to jako G...G ze }... na koniec programu, jak ten .
rekurencyjny

Dziękuję Ci. Widziałem, że użyłeś Gw innym poście, aby zapisać jeden bajt, zastępując {...}*go D.... Chyba po prostu wciąż nie jestem do tego przyzwyczajony ...
Weijun Zhou,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.