उस तार को बांधो!


20

एक स्ट्रिंग को इनपुट के रूप में देखते हुए, स्ट्रिंग के एक या अधिक वेरिएंट को आउटपुट करते हैं जैसे:

  • कोई भी चरित्र इसमें नहीं है
  • कोई भी चरित्र उस चरित्र के निकट नहीं है, जो मूल रूप से उसके निकट था

आप मान सकते हैं कि यह हमेशा दिए गए स्ट्रिंग के लिए संभव होगा, और इसमें केवल एकल वर्णमाला वर्ण होंगे ( [a-z]या [A-Z]यदि आप चाहें तो)

ध्यान दें कि एक ही वर्ण के डुप्लिकेट को अद्वितीय नहीं माना जाता है।

उदाहरण के लिए, इनपुट को देखते हुए programming, आउटपुट m7 वें या 8 वें वर्ण में नहीं हो सकता है, और g4 वें या 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 जो सही है
स्किड्सदेव

जवाबों:


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

जेली द्वारा दूषित एक और मॉड चला जाता है। कितने उदास हैं।
caird coinheringaahing

3

पायथन 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. मुझे कुछ और गहन परीक्षण करने के लिए आउटपुट वैलिडेटर बनाने की आवश्यकता है
स्काइड्सदेव

के लिए समय पर aabcdeffghij, लेकिन इसका मतलब यह नहीं है कि यह काम नहीं करता है, बस उस इनपुट के लिए एक मिनट से अधिक समय लगता है
Skidsdev

मेरी मशीन पर "एबैडेफिज" चलाने के लिए एक लंबा समय लगता है। अब तक> 2min। इसके अलावा यह एक से अधिक क्रमपरिवर्तन प्रिंट करता है, जो कल्पना के अनुसार नहीं है।
नहीं है कि

रॉड - आप के साथ कुछ बाइट्स बचा सकता है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;

इसे ऑनलाइन आज़माएं!


ओह
माय

यह काम क्यों नहीं करना चाहिए? मैं हर संभव regex बनाता हूं। यदि यह मेल न खाने तक स्ट्रिंग से मेल खाता है
Jörg Hülsermann

प्रतीक्षा करें, विफल रहता है helowi, आउटपुट ioewlh, iऔर hआसन्न हैं
स्काईड्सदेव

@ मेयूब ठीक है कि अब अंतिम मामले को सुरक्षित बनाना चाहिए
जोर्ज ह्यूल्सरमैन


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 बाइट्स

Jörg bys समाधान से प्रेरित :

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 की आवश्यकता है; पुराने PHP के लिए 14 बाइट्स जोड़ें: $k-1साथ बदलें ($k?:strlen($a))-1;
(दो पीएचपी <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örg Hü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आसन्न हैं
स्काइड्सदेव

1
इसके अलावा आपका ऑनलाइन परीक्षक बहुत अच्छा नहीं लगता है, हर टेस्टकेस जिसे मैंने 3 सेकंड के बाद ठीक करने की कोशिश की है
Skidsdev

@ मेयूब मैं उल्लेख करना भूल गया: PHP संस्करण 7.1 का उपयोग करें
टाइटस

1

रूबी, 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 तय!
डैनियोरो

1

जावास्क्रिप्ट 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!Ö

भागो और डिबग ऑनलाइन!

2 बाइट बचाने के लिए @recursive के लिए धन्यवाद।

दौड़ने के लिए बहुत लंबा समय लगता है। एक अधिक उचित / व्यवहार्य संस्करण है (सिर्फ 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.