Натерти цю струну!


20

Враховуючи рядок як вхід, виведіть один або кілька варіантів рядка таким чином, що:

  • Жоден персонаж не знаходиться в його початковому положенні
  • Жоден символ не примикає до персонажа, до якого він спочатку сусідив

Ви можете припустити, що це завжди буде можливим для даного рядка і буде містити лише алфавітні символи з одним регістром ( [a-z]або, [A-Z]якщо вам зручніше)

Зауважте, що дублікати одного символу не вважаються унікальними.

Наприклад, з огляду на вхід programming, висновок не може містити символу mна 7 або 8 і не може містити символ gна 4 або 11 місці (1 індексовано)

Приклад:

Візьміть рядок abcdef

Наступним буде дійсний результат: daecfb

Однак наступне було б недійсним: fdbcaeяк у цьому прикладі cта bвсе ще суміжні.

Сусідність також загортається, це означає, що ви не могли зробити так, fdbecaяк fі aдосі є сусідніми.

Тести:

Зверніть увагу, що це не єдино допустимі виходи для даних входів

Написано як input -> output:

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

Оцінка:

Це тому виграє найменше байтів на кожній мові !


No character is adjacent to a character that it was originally adjacent to. Чи порядок не має значення для сусідства? Отже, вхід "abcd" не може мати "ab" ніде і також не може бути "ba" ніде?
DrZ214

@ DrZ214 це правильно
Skidsdev

Відповіді:


5

Желе , 24 23 байти

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

Спробуйте в Інтернеті!

Надзвичайно довго в силу того, що я жахливо став в Джеллі, але він, нарешті, працює, принаймні ... все ще в процесі гольфу.

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

Перевірений з усіма тестами в ОП, працює для всіх їх
Скідсдев

Це може бути дуже довгим для Джеллі, але він надзвичайно короткий для всього іншого (за винятком 05AB1E та кількох інших божевільних мов для гольфу.)
Грифон - Відновіть Моніку

так, це божевільно коротко, я не очікував, що навіть Джеллі зробить це в гольфі, навіть неправильне рішення 05AB1E, яке не перевірило вихідну позицію, склало 45 байт
Skidsdev

Йде ще один мод, зіпсований Jelly. Як сумно.
caird coinheringaahing

3

Python 2 , 185 байт

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]

Спробуйте в Інтернеті!
Друкує всі дійсні рядки


перевірено на mayube, stephensі helowi, здається, працює на всіх 3. Мені потрібно зробити валідатор виводу, щоб зробити більш інтенсивне тестування, хоча
Skidsdev

Визначено aabcdeffghij, але це не означає, що воно не працює, лише що для цього потрібно більше хвилини
Skidsdev

Щоб запустити "aabcdeffghij" на моїй машині, потрібно довгий час. Поки що> 2 хв. Також виглядає так, що це друкує більше однієї перестановки, що не відповідає специфікації.
Не те, що Чарльз

Стрижень - Ви можете зберегти кілька байт за допомогоюprint 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))))
Не те, що Чарльз

@NotthatCharles ви забули `l`[2::5]= /
Род

3

PHP> = 7,1, 147 байт

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 Пісочниця Інтернет

PHP> = 7,1, 184 байт

Використовуйте відстань Левенштейна замість Регексу

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 Пісочниця Інтернет

PHP , 217 байт

Версія під 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;

Спробуйте в Інтернеті!


О, мій боже, це працює
Skidsdev

Чому це не повинно працювати? Я роблю всі можливі виразки. Якщо це збігається, перетасуйте рядок, поки вона не збігається
Jörg Hülsermann

чекати, чи не буде працювати на helowi, виходи ioewlh, iі hпримикають
Skidsdev

@Mayube Добре, що тепер має зробити безпечний останній випадок
Jörg Hülsermann

Так, протестовані на всіх тестах в ОП, всі вони працюють
Skidsdev

3

Брахілог , 21 байт

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

Спробуйте в Інтернеті!

Пояснення

Я б дійсно хотів p.;?z≠ᵐ&j¬{s₂p~s~j}би працювати на 2 байти менше, але, здається ~j, недостатньо розумний ...

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 байт

натхненний рішенням Йорга :

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;

Запуск труби з -rабо перевірити його в Інтернеті . (Переконайтесь, що вибрано PHP версії 7.1 або вище)

Потрібна PHP 7.1; додати 14 байт для старого PHP: замінити $k-1на ($k?:strlen($a))-1;
(Ще два байта для PHP <5.3: $k?$k-1:strlen($a)-1)

зламатися

# 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 набагато більше;)
Тіт

@ JörgHülsermann Обертовий чохол обробляється під час першої ітерації ( $c=$a[$k=0], $d=$a[$k-1]) через $s.$s.
Тіт

Гаразд, приємний трюк
Йорг Гюльсерманн

1

PHP 7.1, 187 185 172 178 143 байт

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;

Запустити як трубу -rабо випробувати його в Інтернеті . (Переконайтесь, що вибрано PHP версії 7.1.0 або вище!)

зламатися

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

Збій на вході mayube, виходів yeuamb, mі aє суміжними
Skidsdev

1
Також ваш інтернет-тестер не здається дуже хорошим, кожен тест-тест, який я пробував, пройшов тайм-аут через 3 секунди
Skidsdev

@Mayube Я забув згадати: Використовуйте PHP версії 7.1
Тіт


1

JavaScript 6, 116 байт

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

Стакс , 23 21 байт

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

Запуск та налагодження в Інтернеті!

Дякуємо за @recursive за збереження 2 байтів.

Бігати потрібно багато часу. Більш розумна / здійсненна версія - (лише на 2 байти довше)

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

Запуск та налагодження в Інтернеті!

Пояснення

Використовує розпаковану версію для пояснення.

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

Приємно. Ви можете покращити їх використання G. Ви виконуєте {...}X!...x!виконання одного і того ж блоку двічі. Загалом, ви можете переписати це як G...G з }... в кінці програми, як це .
рекурсивна

Дякую. Я бачив, як ви використовували Gв іншій публікації, щоб зберегти один байт, замінивши {...}*на D.... Я думаю, я просто ще не зовсім звик до цього ...
Вейджун Чжоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.