Garble สายนั้น!


20

รับสตริงเป็นอินพุตเอาต์พุตหนึ่งหรือหลายตัวแปรของสตริงเช่น:

  • ไม่มีอักขระอยู่ในตำแหน่งดั้งเดิม
  • ไม่มีอักขระอยู่ติดกับอักขระที่ แต่เดิมติดกับ

คุณสามารถสันนิษฐานได้ว่าสิ่งนี้จะเป็นไปได้สำหรับสตริงที่กำหนดและจะมีเพียงตัวอักษรตัวอักษรตัวพิมพ์เล็ก ( [a-z]หรือ[A-Z]ถ้าคุณต้องการ)

โปรดทราบว่าการซ้ำซ้อนของอักขระเดียวกันจะไม่ถือว่าไม่ซ้ำกัน

ตัวอย่างเช่นเมื่อรับอินพุตprogrammingเอาต์พุตจะต้องไม่มีอักขระmat 7 หรือ 8th และไม่สามารถมีอักขระที่g4 หรือ 11 (1 ดัชนี)

ตัวอย่าง:

รับสาย abcdef

ต่อไปนี้จะเป็นผลลัพธ์ที่ถูกต้อง: daecfb

อย่างไรก็ตามสิ่งต่อไปนี้จะไม่ถูกต้อง: fdbcaeในตัวอย่างนี้cและbยังคงอยู่ติดกัน

คำคุณศัพท์ห่อหุ้มซึ่งหมายความว่าคุณไม่สามารถทำfdbecaตามfและaยังคงอยู่ติดกัน

Testcases:

โปรดทราบว่าสิ่งเหล่านี้ไม่ใช่ผลลัพธ์ที่ถูกต้องเท่านั้นสำหรับอินพุตที่กำหนด

เขียนเป็น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

ทดสอบกับ testcase ทั้งหมดใน OP ใช้งานได้กับทุกคน
Skidsdev

นี่อาจจะนานมากสำหรับเยลลี่ แต่มันสั้นมากสำหรับทุกอย่าง (ยกเว้นข้อยกเว้นที่เป็นไปได้คือ 05AB1E และภาษากอล์ฟบ้าอื่น ๆ อีกสองสามภาษา)
Gryphon - Reinstate Monica

ใช่มันสั้นอย่างบ้าคลั่งฉันไม่ได้คาดหวังแม้แต่ Jelly ที่จะทำสิ่งนี้อย่างกอล์ฟแม้กระทั่งโซลูชั่นที่ผิดพลาดของ 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 นาที ดูเหมือนว่าจะมีการเปลี่ยนแปลงมากกว่าหนึ่งการเปลี่ยนแปลงซึ่งไม่เป็นไปตามข้อกำหนด
ไม่ใช่ Charles

ร็อด - คุณอาจบันทึกไบต์ด้วย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))))
ไม่ใช่ว่า Charles

@NotthatCharles คุณลืม`l`[2::5]= /
Rod

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 Sandbox ออนไลน์

PHP> = 7.1, 184 ไบต์

ใช้ระยะทาง levenshtein แทนวิธี 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 ออนไลน์

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

ทำไมมันไม่ทำงาน? ฉันทำให้ทุก regex เป็นไปได้ ถ้ามันจับคู่สับเปลี่ยนสตริงจนกว่าจะไม่ตรงกัน
JörgHülsermann

รอ, ล้มเหลวในhelowi, ส่งออกioewlh, iและhอยู่ติดกัน
Skidsdev

@Mayube โอเคที่ควรทำให้คดีสุดท้ายปลอดภัยแล้ว
JörgHülsermann

Yup ทดสอบกับ testcase ทั้งหมดใน OP พวกเขาทำงานทั้งหมด
Skidsdev

3

Brachylogขนาด 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 ไบต์

แรงบันดาลใจจากโซลูชันของ 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;

ทำงานเป็นท่อที่มี-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ผ่าน
ติตัส

โอเคเคล็ดลับดี ๆ
JörgHülsermann

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
Titus

1

Ruby, 110 97 102 ไบต์

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

ลองออนไลน์!


สิ่งนี้ไม่เป็นไปตามกฎของการ "ห่อ" คำคุณศัพท์ ตัวอย่างเช่นฉันได้รับ3594817062เป็นผลลัพธ์ในลิงค์ TIO ของคุณ
Doorknob

@Doorknob แก้ไขแล้ว!
daniero

1

JavaScript 6, 116 Bytes

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 ไบต์

å╘┤‼¬½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...ฉันเดาว่าฉันยังไม่ชินกับมันมากนัก
Weijun Zhou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.