ひもを折りたたむ


27

このチャレンジでは、入力としてアルファベット文字列が与えられます。与えられた入力の「アンチストリング」を、すべての文字の大文字と小文字を逆にしたストリングとして定義します。例えば

AaBbbUy -> aAbBBuY

入力として文字列を受け取り、アンチストリングも連続したサブストリングである最長の連続したサブストリングを検索するプログラムを作成する必要があります。2つの部分文字列は重複しないでください。

例として、文字列が与えられた場合

fAbbAcGfaBBagF

太字の部分は、最長のストリングアンチストリングペアです。

プログラムは、ペアを見つけたら、それぞれを1つの文字に折りたたむ必要があります。これは、各部分文字列の最初の文字を除くすべてを削除することでこれを行う必要があります。たとえば、上の文字列

fAbbAcGfaBBagF

になるだろう

fAcGfagF

その後、プログラムは、最長文字列のアンチストリングペアが1文字以下になるまでプロセスを繰り返す必要があります。

たとえば、同じ文字列を使用すると、崩壊後の新しい最長のペアは

fAcGfagF

もう一度文字列を折り畳みます

fAcGag

これで、文字列をさらに折りたたむことができないため、出力する必要があります。

候補のペアが同点の場合(例AvaVA)、どちらかを削減することができます(AaAまたはAvV、ではなく、Aa)。

これはため、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。

テストケース

fAbbAcGfaBBagF  ->  fAcGag
AvaVA ->  AaA / AvV
QQQQQQQ -> QQQQQQQ
fAbbAcQQQQaBBacqqqqA -> fAbcQBcq
gaq -> gaq
fAbbAcGfaBBagFaBBa -> fcGaBBag

動機

この問題はarbitrary意的に思えるかもしれませんが、基本的なポリゴンを処理するコードを作成しているときに実際に遭遇した問題です。このプロセスを使用して、基本ポリゴンをより小さなnポリゴンに減らすことができます。それを試した後、私はそれが素敵な小さなゴルフをするだろうと思った。


反文字列部分文字列を持つ最大の部分文字列に複数のアニット文字列部分文字列がある場合、すべての部分文字列を折りたたむか、最初の2つだけにする必要がありますか?
ジョナサンフレッチ

@JonathanFrech任意の2つ。これは、候補ペア間に同点がある場合です。
小麦ウィザード

だからaaaAAAaaa -> aAaaa
ジョナサンフレッチ

この問題のサブセットに関する何かが悲鳴を上げるが、私はそれに指を置くことができない。
魔法のタコ

1
@MagicOctopusUrn プログラムの出力がアンチストリングである2サイクルのクインを書くようなものですか?
ジョナサンフレッチ

回答:


8

Perl、64 61バイト

含み+1のためにp

perl -pE 's/(.\K.{$%})(.*)(?=(.))(??{$1^$"x$%.$"})/$2$3/ while$%=--pos' <<< fAbbAcGfaBBagFaBBa

6

JavaScript(ES6)、200バイト

I / Oに文字の配列を使用します。

f=a=>(m=M=C=>a.map((_,i)=>a.map((_,j)=>C(i,j-i+1))))(I=>M((i,j)=>a.slice(i,i+j).some((n,k)=>n[c='charCodeAt']()^(a[I+k]||'')[c]()^32)|I+j>i|j<m||(x=[i,I],m=j)))&&m-->1?f(a,x.map(p=>a.splice(p+1,m))):a

オンラインでお試しください!


3

網膜、119バイト

.+
$&¶$&
T`Ll`lL`.*¶
/(.).*¶.*\1/^&0A`
¶&Lv$`(?<=(.)*)((.)(.)*).*¶(?>((?<-1>.)*.)(?<-4>.)*)(.*)\2
$5$6$3$'
N$`
$.&
}0G`

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.+
$&¶$&
T`Ll`lL`.*¶

入力を複製し、最初のコピーの大文字と小文字を入れ替えます。

/(.).*¶.*\1/^&0A`

アンチストリングがまったくない場合は、反転した複製を削除します。

¶&Lv$`(?<=(.)*)((.)(.)*).*¶(?>((?<-1>.)*.)(?<-4>.)*)(.*)\2
$5$6$3$'

可能なすべての折り畳まれたアンチストリングをリストします。

N$`
$.&
}0G`

それらを長さの順に並べ、最短(つまり最長のアンチストリング)を取り、すべてのアンチストリングが折りたたまれるまで繰り返します。


3

Pythonの3189の 181バイト

Jonathan Frechの純粋なワンライナー化の功績。

f=lambda s,x=set():any(u in s[j+i:]and(x.add(s[:j+1]+s[j+i:].replace(u,u[0],1))or 1)for i in range(len(s),1,-1)for j in range(len(s))for u in[s[j:j+i].swapcase()])and f(x.pop())or s

オンラインでお試しください!

廃止された独自バージョン(189バイト):

x=set()
def f(s):
 while any(u in s[j+i:]and(x.add(s[:j+1]+s[j+i:].replace(u,u[0],1))or 1)for i in range(len(s),1,-1)for j in range(len(s))for u in[s[j:j+i].swapcase()]):s=x.pop()
 return s

オンラインでお試しください!

any()ネストされたループを早期にブレークアウトset()し、理解で使用可能な可変グローバルオブジェクトのために。残りは、を使用した要件の単純な実装ですstr.swapcase

Python 2、160バイト

def f(s):
 for i in range(len(s),1,-1):
	for j in range(len(s)):
	 u=s[j:j+i].swapcase()
	 if u in s[j+i:]:return f(s[:j+1]+s[j+i:].replace(u,u[0],1))
 return s

オンラインでお試しください!

早期ブレークスルーを備えた通常のネストされたforループは、を使用しreturnた「巧妙な」トリックよりもはるかに短いことがわかりましたany


181バイト。再帰的アプローチ。setあなたのコードは完全に空になるようにセットをポップするので、関数のデフォルトとしての可変はさらなる呼び出しと衝突しません。
ジョナサンフレッチ

申し訳ありませんが、それxは空ではないままになると思いました。あなたがそれを持っているように、私はそれが従うと思います。
ジョナサンフレッチ

それは問題ありません。改善してくれてありがとう。
バブラー

3

C(GCC) 240の 238 227 225 222 216バイト

  • 2バイトを保存しました。浮遊変数の定義を削除しました。
  • 11バイトを保存しました。にゴルフb|=S[p+m]!=S[q+m]+32-(S[q+m]>90)*64b|=abs(S[p+m]-S[q+m])-32b|=32-S[p+m]+S[q+m]&63
  • 3バイトを保存しました。にゴルフfor(...;...;p++)S[p+1]=S[p+L];したfor(...;...;S[++p]=S[p+L]);
  • ceilingcatのおかげで6バイト節約されました
p,P,q,Q,l,L,b,m;f(char*S){for(p=0;S[p];p++)for(l=0;S[l+++p];)for(q=0;b=S[q+~-l];!b&p+l<=q&l>L?L=l,P=p,Q=q:0,q++)for(b=0,m=l;m--;)b|=32-S[p+m]+S[q+m]&63;for(;b-2;)for(p=b++?-~Q-L:P;S[p];S[++p]=S[L+p]);~-L?L=0,f(S):0;}

オンラインでお試しください!


@ceilingcatありがとうございます。
ジョナサン


0

スタックス、30 バイト

î☼fúΩ§☺æ╒ºê@Ñ▀'╫Iqa{d]∟Sa5♦⌂─╚

実行してデバッグする

同じプログラムの対応するASCII表現はこれです。

c%Dc:e{%orF..*:{_{32|^mY++_h.$1yh++R

正規表現アプローチを使用します。繰り返し正規表現の文字列置換。現在の値の各連続部分文字列からこれらを構築します。たとえば、入力の場合fAbbAcGfaBBagF、部分文字列の1つはAbbA、正規表現AbbA(.*)aBBaはに置き換えられA$1aます。

c                                       get number of characters
 %D                                     repeat rest of program that many times
   c:e                                  get all substrings
      {%or                              order substrings longest to shortest
          F                             for each substring, execute the rest
           ..*:{                        build the string "(.*)"
                _{32|^m                 current substring with case inverted
                       Y                save the inverted case in register y
                        ++              concatenate search regex together
                                            e.g. "aBc(.*)AbC"
                          _h            first character of substring
                            .$1         "$1"
                               yh       first character of inverted case
                                 ++     concatenate replacement regex together
                                            e.g. "a$1A"
                                   R    do regex replacement


0

Japt -h、33 バイト

à ñÊÅÔ£=rX+"(.*)"+Xc^H ÈÎ+Y+XÎc^H

それを試してみてください

à ñÊÅÔ£=rX+"(.*)"+Xc^H ÈÎ+Y+XÎc^H     :Implicit input of string U
à                                     :Combinations
  ñ                                   :Sort by
   Ê                                  :  Length
    Å                                 :Remove first element (the empty string)
     Ô                                :Reverse
      £                               :Map each X
       =                              :  Reassign to U
        r                             :  Global replacement
         X+"(.*)"+                    :  Append "(.*)" to X and then append
                  Xc                  :    Charcodes of X
                    ^H                :    XORed with 32
                      È               :  Pass each match X, with captured group Y, through the following function
                       Î+Y+           :    Append Y to the first character of X and then append
                           XÎc^H      :      The charcode of the first character of X XORed with 32
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.