Bu ipi boz!


20

Bir dize girdi olarak verildiğinde, dizenin bir veya daha fazla varyantını şu şekilde çıktılar:

  • Orijinal konumunda hiçbir karakter yok
  • Başlangıçta bitişik olduğu bir karaktere bitişik karakter yok

Bunun verilen dize için her zaman mümkün olacağını ve yalnızca tek harfli alfabetik karakterler içerdiğini ( [a-z]veya [A-Z]isterseniz)

Aynı karakterin kopyalarının benzersiz kabul edilmediğini unutmayın.

Örneğin, girdi göz önüne alındığında, programmingçıkış m7. veya 8. karakterde a içeremez gve 4. veya 11. karakterde (1 dizin oluşturulmuş) a içeremez.

Örnek:

Dizeyi al abcdef

Aşağıdakiler geçerli bir çıktı olacaktır: daecfb

Ancak aşağıdakiler geçersiz olacaktır: fdbcaebu örnekteki gibi cve bhala bitişiktir.

Bitişiklik ayrıca yapamadı anlamı sarar fdbecaolarak fve ahala bitişiktir.

testcases:

Bunların verilen girişler için sadece geçerli çıkışlar olmadığını unutmayın

Şu şekilde yazılmıştır input -> output:

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

puanlama:

Bu kadar her dilde en az bayt kazanır!


No character is adjacent to a character that it was originally adjacent to. Sıra, bitişiklik için önemli değil mi? Yani "abcd" girdisi hiçbir yerde "ab" olamaz ve hiçbir yerde "ba" olamaz?
DrZ214

@ DrZ214 doğru
Skidsdev

Yanıtlar:


5

Jöle , 24 23 bayt

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

Çevrimiçi deneyin!

Jelly'de korkunç olduğum için son derece uzun, ama nihayet çalışıyor, en azından ... hala golf sürecinde.

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


Bu Jelly için gerçekten uzun olabilir, ancak her şey için son derece kısa (05AB1E ve birkaç çılgın golf dili hariç).
Gryphon - Monica

evet delicesine kısa, Jelly'in bile bu golfçü yapmasını beklemiyordum, orijinal char pozisyonunu kontrol etmeyen 05AB1E'nin yanlış çözümü 45
bayttı

Jelly tarafından bozulan başka bir mod daha var. Ne kadar üzücü.
caird coinheringaahing

3

Python 2 , 185 bayt

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]

Çevrimiçi deneyin!
Tüm geçerli dizeleri yazdırır


için test mayube, stephensve helowi, bir çıkış doğrulayıcı olsa biraz daha yoğun testler yapmak için tüm 3. Ben ihtiyacı için işe görünüyor
Skidsdev

Zaman aşımına aabcdeffghij
uğradı

Makinemde "aabcdeffghij" çalıştırmak çok uzun sürüyor. Şimdiye kadar> 2dk. Ayrıca bu, spesifikasyonlara göre olmayan birden fazla permütasyon yazdırıyor gibi görünüyor.
Charles

Çubuk - Bazı baytlarla tasarruf edebilirsinizprint 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))))
Charles

Unuttuğun @NotthatCharles `l`[2::5]= /
Çubuk

3

PHP> = 7,1, 147 Bayt

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 Korumalı Alanı Çevrimiçi

PHP> = 7,1, 184 Bayt

Regex yolu yerine levenshtein mesafesini kullanın

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 Korumalı Alanı Çevrimiçi

PHP , 217 bayt

7.1 altındaki sürüm

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;

Çevrimiçi deneyin!


Aman tanrım işe yarıyor
Skidsdev

Neden işe yaramasın ki? Ben mümkün olan her normal ifadeyi yaparım.
Eşleşmezse

başarısız, dur helowi, çıkışları ioewlh, ive hbitişik
Skidsdev

@Mayube Tamam, bu son davayı güvenli hale
getirmeli

Yup,
OP'deki

3

Brachylog , 21 bayt

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

Çevrimiçi deneyin!

açıklama

Gerçekten p.;?z≠ᵐ&j¬{s₂p~s~j}2 bayt daha az çalışmak istedim , ama ~jyeterince akıllı değil gibi görünüyor ...

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, 136131 bayt

Jörg'in çözümünden ilham alan :

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;

Pipo ile çalıştırın -rveya çevrimiçi test edin . (PHP sürüm 7.1 veya üstü seçili olduğundan emin olun)

PHP 7.1 gerektirir; Eski PHP için 14 bayt ekleyin: Değiştir $k-1ile ($k?:strlen($a))-1;
(PHP <5.3 için iki tane daha bayt: $k?$k-1:strlen($a)-1)

Yıkmak

# 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 çok daha fazla;)
Titus

@ JörgHülsermann Sarma kasası ilk iterasyonda ( $c=$a[$k=0], $d=$a[$k-1]) üzerinden işlenir $s.$s.
Titus

Tamam güzel hile
Jörg Hülsermann

1

PHP 7.1, 1871851717178143 bayt

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;

Pipo ile çalıştırın -rveya çevrimiçi test edin . (PHP 7.1.0 veya daha sonraki bir sürümün seçili olduğundan emin olun!)

Yıkmak

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

Giriş başarısız mayube, çıkışları yeuamb, mve abitişik
Skidsdev

1
Ayrıca, çevrimiçi test cihazınız çok iyi görünmüyor, 3 saniye sonra sadece zaman aşımını denediğim her testcase
Skidsdev

@Mayube Bahsetmeyi unuttum: PHP 7.1 sürümünü kullanın
Titus

1

Yakut, 110 97 102 bayt

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

Çevrimiçi deneyin!


Bu, bitişikliği "sarma" kuralına uymaz; örneğin, 3594817062TIO bağlantınızda bir çıktı olarak aldım .
Kapı tokmağı

@Doorknob düzeltildi!
daniero

1

JavaScript 6, 116 Bayt

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 bayt

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

Çevrimiçi çalıştırın ve hata ayıklayın!

2 bayt kaydettiğiniz için @ recursive için teşekkürler.

Koşmak çok uzun zaman alıyor. Daha makul / uygulanabilir bir sürüm (sadece 2 bayt daha uzun)

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

Çevrimiçi çalıştırın ve hata ayıklayın!

açıklama

Açıklamak için ambalajsız sürümü kullanır.

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üzel. Kullanabileceğiniz bir gelişme var G. Sen yapıyorsun {...}X!...x!iki kez aynı bloğu çalıştırmak. Genel olarak, bu yeniden yazabilirsiniz G...G ile }... olduğu gibi, program sonunda bu .
özyinelemeli

Teşekkür ederim. Ben kullandığınız gördük Gdeğiştirerek bir bayt kaydetmek için başka bir yazı {...}*ile D.... Sanırım hala buna pek alışkın değilim ...
Weijun Zhou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.