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


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.