付帯条件なし!


42

イントロ

壁には3本の釘があります。あなたは、両端で額縁に固定された文字列を持っています。写真を吊るすために、あなたは爪にひもをからませました。しかし、写真を手放す前に、爪がどのように紐で包まれているかを見て、画像が落ちるかどうかを予測できますか?

最初の例では、画像は落ちません。2番目の例では、写真が落ちます。

チャレンジ

N爪の周りの文字列のパスを指定して、画像が落ちるかどうかを決定します。絵が落ちそうな場合は真実の値を返し、そうでない場合は偽の値を返します。

詳細

  • 爪と写真は通常のN+1-gonに配置され、写真が下にあると仮定できます。
  • ロープに結び目がないと仮定できます。つまり、ロープを2つの端の一方から連続して巻き付けることができます。
  • 各爪はアルファベットの文字で時計回りに列挙されます。最大26本の爪(AZ)があると仮定できます。
  • 爪の周りの時計回りのラップは小文字で示され、反時計回りのラップは大文字で示されます。

上からの最初の例はとしてエンコードされBcA、2番目の例はとしてエンコードされCAbBacます。

傾いた読者の場合:この問題は、釘のセットによって生成されたフリーグループの要素がアイデンティティであるかどうかを判断することと同じです。つまり、固定点に到達するまで、aAまたはAa固定点に達するまで、部分文字列を繰り返しキャンセルすれば十分です。固定小数点が空の文字列の場合、これは中立要素です。それ以外の場合はそうではありません。

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja

3
文字列のパスを書き留めるために手を離すと、とにかく絵が落ちるようです。その後、この課題は本当に簡単になります。
owacoder

@owacoderあなたは十分に速くする必要があります:D
flawr

関連性:youtube.com/watch
v

回答:


11

網膜、21バイト

+`(.)(?!\1)(?i)\1

^$

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

flawrのソリューションと同様に、これは単に隣接する大文字/小文字のペアを繰り返し削除し、結果が空かどうかをチェックします。

大文字/小文字のペアをどのように一致させるかについて:

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.

7

MATLAB、76バイトオクターブ、82 79 77バイト

MATLABが実際にOctave よりも(バイト全体で)短い場所を見たのはこれが初めてかもしれません!

MATLABの新しい答え:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

オクターブで回答:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

保存された3つの flawrに5バイトの感謝を。~nnz(c)より短いisempty(c)、そして'Aa'より2バイト短いです[0,32]

オクターブバージョンをオンラインでお試しください!


説明:

c=input('')ユーザーに入力を求めます。k='Aa'文字配列として定義します。

while k++<1e5:の両方の要素がループしながらk各反復、インクリメントされAaBbCcなど。ループは、最大の要素が1e5になるまで続きます。これは、ほとんどの文字列に対して十分に高い値です。9e9バイト数を増やすことなくに増やすことができます。

strrep中央から始めて、関数を段階的に実行します。

を使用mod(k,64)すると、アルファベットの最後に到達したときに次のようになります(k文字に変換し直す場合)。

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

ご覧のとおり、間にいくつかの記号がありますが、その後、再びアルファベットで始まり、最初は小文字で始まります。これはAaとの両方をチェックする非常に短い方法aAです。

['',65+mod(k,64)]-callの数値をmod空の文字列で連結し、数字を文字に変換します。

strrep文字列から要素を削除してc返すために使用されます。k文字列内のすべての出現を検索し、空の文字列に置き換えます。

1e5繰り返しの後、空の文字列または空でない文字列が作成されます。をc使用する要素があるかどうかを確認しnnz(c)ます。を返しますnot(nnz(c))。したがって1、空の場合、および0文字が残っている場合c


6

Minkolang 0.15、30バイト

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

ここで試してみてください!

説明

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

ここではMinkolangのトロイダルの性質が活用され、外側のループが不要になります。ここでの一般的な考え方は、スタックの上位2つの要素が32ユニット離れているかどうかをチェックし(大文字と小文字のペアであることを意味します)、それらがあれば、両方をポップします。これはいわば「リアルタイム」で行われるため、ペアのネストは適切に処理されます。


5

Haskell、62バイト

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

オンラインで試す

功績のためflawrabsするためにLaikoni fromEnumマップ

ヘルパー関数%は、すでに単純化されたstringを受け取り、結果を単純化するl前にシンボルを付加しaます。lの逆文字で始まる場合a、キャンセルされます。それ以外の場合は、a単に先頭に追加されます。この段階では、さらに単純化する必要はありません。

main関数fは、を介して各文字を順番に追加して単純化しfoldrます。次に、結果が空かどうかを確認します。

2つの文字が反対のケースであり、キャンセルする必要があるかどうかを確認するには、ASCII値が32だけ異なるかどうかを確認します。各要素はfromEnumに渡される前に処理され%ます。


いいね!そして、説明のおかげで、私は毎回新しいことを学んでいます!
-flawr

4

05AB1E、17のバイト

DvADu‚øDíìvyK}}õQ

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

説明

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string

4

Haskell98 97 85 81バイト

これは、変更がなくなるまで隣接する文字を繰り返しキャンセルしようとする単純な実装であり、その結果を決定します。

-12バイトを@nimiに、さらに-4バイトを@xnorに感謝します!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

オンラインでお試しください!またはすべての例を確認してください!


f=null.until(\a->r a==a)r.map fromEnum2バイトを節約する必要があります。
ライコニ

(\a->r a==a)できると思います((==)=<<r)
xnor

1
2行目で、私はあなたが変えることができると思う=r llアイデアは、それが唯一の実行ごとに交換を行うことで十分であること、。
-xnor

ありがとうございました!2番目のヒントは理解していますが、何が起こっているのかわかりません。=<<魔法のXDのようです
-flawr

1
@flawr このヒントを参照してください。=<<以下のようなものです>>=が、交換された引数で。この表現は、((==)=<<r)「下では不変」を意味する形で現れることがよくありますr
-xnor

3

Mathematica、102バイト

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

入力としてアルファベット文字列を取り、Trueまたはを返す名前のない関数False

実装の中心は、文字列から、"Pp"またはなどのキャンセルペアを削除する関数を作成することです"gG"。この式{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}は、文字のリストの順序付けられたペアを作成します。最初のリスト{"a","b",...,"Z"}と2番目のリスト{"A","B",...,"z"}です。次に#<>#2&~MapThread~、これら2つのリストの対応する要素が連結されたリスト、つまり{"aA","bB",...,"Zz"}。楽しい表現""|##&@@は(引数シーケンスの魔法を通して##)選択肢のリストを生成し"" | "aA" | "bB" | ... | "Zz"ます; 最後に、StringDelete[...]これらの代替の出現を文字列から削除する関数です。

結果が変わらないまで入力文字列にその関数を繰り返し適用すれば十分であり、これはによって達成され~FixedPoint~#、結果がで空の文字列かどうかをテストし""==ます。


3

JavaScript(ES6)、73バイト

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

.NETとは異なり、JavaScriptには一致の途中で大文字と小文字の区別を無効にする方法がないため、代わりに、大文字と小文字を区別せずに繰り返される文字のすべての部分文字列を検索し、この時点で隣接する文字の不一致ペアを削除する必要があります大文字/小文字のペア。


3

Perl、28バイト

1 while s/.(??{$&^' '})//;$_

説明:

Perlでは、動的に生成された正規表現を標準正規表現内に含めることができます。

.何も一致しました。

これ(??{は、生成された正規表現の始まりです。

$&変数は、この場合には、単に何でもさ、これまでの文字列にマッチした全体、含まれています.一致します。

^演算子は、オペランドの値に応じて、いずれかの数値や文字列XOR XORを行います。この場合、文字列xorになります。

これ' 'は、スペースを含む単なる文字列であり、便利なascii(またはunicode!)値は32です。スペースがazまたはAZの範囲のcharとxor-edされると、大文字から小文字またはバイスに変更されます。その逆。

これ})は、生成された正規表現の終わりです。

1 while s/whatever// パターンを繰り返し検索し、空の文字列に置き換えます。

$_デフォルトの変数です。この変数は、別の変数を指定しない場合にperlが楽しくエキサイティングなことを行うものです。ここでは、長さゼロの文字列が偽であり、等しくない長さゼロ以外の文字列"0"が真であるため、真理値または偽の値を返すために使用しています。また、入力文字列が元々そこに置かれていると仮定しています。

ここで試してみてください


技術的には、これはチャレンジが要求するものの反対を返します(偽である場合は真実を返し、逆も同様です)。修正するには、単に!finalの前に追加し$_ます。このように保持しても問題ない場合はs/.(??{$&^' '})//&&redo-pフラグを+1バイトに変更することで4バイト節約できます。これは{ code }実際にはループではないため(つまり&&redo動作しません)、サブルーチン内では現在のようには機能しませんが、ループ-p内に配置しwhileます。
ガブリエルベナミー

また、交換することにより、別のバイトを保存することができ' '$"これを見て、コードがどのように見えるかを確認してください。
ガブリエルベナミー

2

プロローグ(SWI)、151バイト

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

バックトラッキングのために、より長い偽のケースで実行するには長い時間がかかります。

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

非ゴルフ

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL、20バイト

t"[]yd|32=fX<tQh(]n~

オンラインでお試しください!または、すべてのテストケースを確認します(時間がかかります)。

説明

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.