1Dのルークの動きを数える


31

ルークの列または空のスペース、あるいはその両方の位置が与えられた場合、いくつの異なるルークの動きが可能なかを出力します。ルークは左または右に空のスペースに移動できますが、別のルークを通過する必要があるスペースには移動できません。ルークが移動しても、他のルークはそのまま残ります。

たとえば、この位置から、6つの移動が可能です。

.R..RRR.
  • 最初の(左端の)ルークは、左に1スペース、または右に1または2スペース移動できます(3移動)
  • 次のルークは、左に1つまたは2つのスペースしか移動できません(2つの移動)
  • 3番目のルークは、他の2つのルークの間で圧迫されているため、まったく移動できません(0移動)
  • 最後のルークは右に1スペースしか移動できません(1移動)

ポジションにはルークがまったくないか、空のスペースがまったくないことに注意してください。

入力:ルークと空のスペースの空ではないリスト(文字列、配列など)。それらは、True/ False1/ 0'R'/ '.'、または任意の2つの一貫した異なるシングルバイト文字または1桁の数字として表すことができます。どれがルークを意味し、どれが空きスペースを意味するかはあなた次第です。

出力:負でない整数。整数の浮動小数点数でも問題ありません。

テストケース

出力は左側の数字です。

6 .R..RRR.
0 .
0 R
4 R..RR
3 ...R
8 ..R..R..
0 ......

より多くのテストケースについては、長さ5までのすべての入力があります。

0 .
0 R
0 ..
1 .R
1 R.
0 RR
0 ...
2 ..R
2 .R.
1 .RR
2 R..
2 R.R
1 RR.
0 RRR
0 ....
3 ...R
3 ..R.
2 ..RR
3 .R..
3 .R.R
2 .RR.
1 .RRR
3 R...
4 R..R
3 R.R.
2 R.RR
2 RR..
2 RR.R
1 RRR.
0 RRRR
0 .....
4 ....R
4 ...R.
3 ...RR
4 ..R..
4 ..R.R
3 ..RR.
2 ..RRR
4 .R...
5 .R..R
4 .R.R.
3 .R.RR
3 .RR..
3 .RR.R
2 .RRR.
1 .RRRR
4 R....
6 R...R
5 R..R.
4 R..RR
4 R.R..
4 R.R.R
3 R.RR.
2 R.RRR
3 RR...
4 RR..R
3 RR.R.
2 RR.RR
2 RRR..
2 RRR.R
1 RRRR.
0 RRRRR

回答:


9

網膜14 9バイト

w`_+R|R_+

オンラインでお試しください!リンクにはテストケースが含まれます。_最も快適な非正規表現文字であるため、空のスペースに使用します。有効なルークの動きに対応する部分文字列の数をカウントすることにより機能します。それは少なくとも一つ含まれている場合は、サブストリングは、有効なルークの動きである_プラスシングルR先頭または末尾のいずれかでを。


ああ、あなたは基本的に私の答えで言及したことをどのように行うかを理解しました。Idkなぜ私はそれを考えなかった。
mbomb007

9

Pythonの330の 29バイト

lambda s:sum((s+s).strip())/9

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

@JoKingのおかげで-1バイト

この関数は、入力としてPythonバイト文字列を受け取ります。各空のスペースはタブとしてエンコードされ、各ルークはb'\x00'valueを持つバイトとしてエンコードされます0

計算は次と等価です lambda s:(s+s).strip().count(b'\t')、バイト数が少ない場合です。


6

JavaScript(ES6)、  38  33バイト

@JoKingのおかげで5バイト節約

入力を文字列として受け取ります。空の正方形にはスペースが、ルークには他の文字が必要です。

s=>(s+s).trim().split` `.length-1

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

コメント済み

s =>          // s = input, e.g. " R  RRR "
  (s + s)     // double -> " R  RRR  R  RRR "
  .trim()     // remove leading and trailing spaces -> "R  RRR  R  RRR"
  .split` `   // split on spaces -> [ 'R', '', 'RRR', '', 'R', '', 'RRR' ]
  .length - 1 // return the length - 1 -> 6

Pythonの2 40  33バイト

@Grimyのおかげで7バイト節約

lambda s:(s+s).strip().count(' ')

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


1
Pythonバージョンは(TIO)のcount代わりに使用する必要がありますsplit
Grimmy

@Grimyありがとう。:)
アーナウルド




3

網膜23 15バイト

ルーク間のスペースの数を2倍にし、少なくとも1つのルークがあるgrep行を作成してから、スペースの数を数えます。

R.+R
$0$0
G`R
 

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

プログラムはピリオドの代わりにスペースを使用しますが、提供されたテストケースを簡単に貼り付けて使用できるようにプレフィックスコードを追加しました。

で重複する一致を使用できることを望ん(?<=R.*) | (?=.*R)でいましたが、重複はそれほど積極的ではありません。そのメソッドで正しい結果を返すには、一致が得られる可能性のあるすべての方法をカウントする必要があります。


1
.R.R.R.最初の行を変更するとR.+R役立つかもしれませんが、間違った結果を与えるようです?
ニール

@Neil修正。ありがとう。
mbomb007

2

ゼリー、6バイト

t1;ḟẠS

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

0for rookと1spaceのリストを取得し、移動数とともに整数を返すモナドリンク。TIOリンクは、質問で指定された可能なボードの貼り付けられたリストを取得し、正しい形式に変換してから、計算された正解を出力します。

説明

t1     | Trim 1s from end
  ;    | Concatenate to input
   ḟẠ  | Filter out 1s if all input were 1s, otherwise filter out 0s
     S | Sum



2

ゼリー、5バイト

ḲẈ+ƝS

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

-1 ジョナサン・アランに感謝します。

0ルークを1表し、空のスペースを表します。


1
あなたはルークのための空白文字とスペースのために別の文字を使用する場合は、使用することができます:5取得するにはḲẈ+ƝS
ジョナサン・アラン

@JonathanAllan LOLはそれを考えていませんでした。そして、その前に私は実験をしましたが、ṣ0代わりに使用していました...
アウトゴルファーのエリック


2

C(clang)、57バイト

i,r,o;g(*n,z){for(o=r=i=0;z--;i=-~i*!*n++)o+=*n?r=1,i:r;}

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

  • @ceilingcatのおかげで1を保存しました

空のリストでは機能しませんでした。さらに、いくつかのバイトを節約しました!

1 =ルーク。0 =スペース。

for(.. i + = n ++?-i:1)//スペースをカウントするか、余分な動きをリセット=> i = -〜i!* n ++(@ceilingcat)

o + = * n?r = 1、i:r; //ルークが満たされ、さらに-r-(rook met)が設定されると、出力に-i-(余分な移動)が追加されます。-i-は、インクリメント文でクリアされます。

すべてのスペースに-r-を追加します(ルックは保証されています)


岩?あなたの岩は動きますか?
マスト

1
@mast lolごめんなさい!編集
アステカ


2

Haskell、33バイト

sum.(t.reverse<>t)
t=snd.span(>0)

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

入力を1(スペース)と0(ルーク)のリストとして受け取る匿名関数。これにより、リストの先頭と末尾からスペースが削除され、リストの2つのバージョンが連結されて合計されます。

これはGHC 8.4.1以降を使用して、<>インポートせずにオペレーターにアクセスします。







1

Javaの11、35の、32バイト

s->(s+s).strip().chars().sum()/9

@JoelのPython 3回答のポート。
-3バイトのおかげで@Joelのにもます。

\0ルークにはNULLバイト()を使用し\t、スペースにはタブ()を使用します。

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

私が使用しようとしたs->(s+s).trim().chars().sum()/931-byterとして最初に、しかしので、これは仕事をしないString#trim組み込みは、先頭と末尾のスペース/タブ/改行を除去するだけでなく、より小さいか等しい、他のすべてのバイトだけでなく、U+0020(ユニコード32;空間) 、それは同様にバイトNULLを削除します..だから
おかげジョエル私に新しいJava 11+推薦するString#strip組み込みを()を代替として。これは、末尾/先頭部分も削除しますが、この場合は空白のみであるため、NULLバイトが保持されます。

説明:

s->                              // Method with String as parameter & integer return-type
  (s+s)                          //  Concatenate the input to itself
       .strip()                  //  Then trim all leading and trailing tabs
               .chars().sum()    //  Sum the unicode values of the remaining characters
                             /9  //  And divide it by 9 to get the amount of remaining tabs

1
Java 11以降では、String.strip()空白のみの削除に使用できます。32バイト
Joel

@ジョエルああ、それを完全に忘れてしまった!ありがとう。:)
ケビンクルーッセン





1

C183の 156 151 137 96 91バイト

91バイトのceilingcatに感謝します。

c,e;char*z,b[9];main(d){for(gets(z=b);e=*z>81?c-=e*~!d,d=0:e+1,*++z;);printf("%i",d?:c+e);}

Rはルーク、他はすべてスペースです。

TIO


いくつかのこと- (代わりにフルプログラムの)関数は、長い間、あなたのプログラムは、少なくとも一つのコンパイラで正常に動作するようとして、それを使用するために短いです(例えば、自動的にゼロ)を使用すると、未定義の動作に依存することができ、許可されている82代わりに、または'R'それはより短いですが、 use e+e*dthan e*(1+d)e=0,d=1;else e++; can be changed to e = -1、d = 1; e ++; , and b [a] ` b[++a]に置き換えられ、*band に置き換えることができます*++b
ASCIIのみ


0

x86-64-26バイト

入力は、最大32ビットの配列と、平方数を表す整数、1はルーク、0は空を表します。

C4 E2 69 F7 C1       shlx        eax,ecx,edx
0B C1                or          eax,ecx  
F3 0F BC C8          tzcnt       ecx,eax  
D3 E8                shr         eax,cl  
F3 0F BD C8          lzcnt       ecx,eax  
F7 D0                not         eax  
F3 0F B8 C0          popcnt      eax,eax  
2B C1                sub         eax,ecx  
C3                   ret  

ビットをコピーして、その左側に追加し、末尾のゼロビットを削除します。次に、先行ゼロビットの数を取得し、ゼロビットの総数からそれを減算します。

x86-64マシンコード-22バイト-通常の長さのチェスランクのみ。

入力は、ルークを表す8ビットで構成される最下位バイトを持つ32ビット整数です。1はルーク、0は空です。

8A E9                mov         ch,cl  
91                   xchg        eax,ecx
F3 0F BC C8          tzcnt       ecx,eax
D3 E8                shr         eax,cl 
F3 0F BD C8          lzcnt       ecx,eax
F7 D0                not         eax  
F3 0F B8 C0          popcnt      eax,eax
2B C1                sub         eax,ecx
C3                   ret  

ビットを次の重要なバイトにコピーし、末尾のゼロビットを削除します。次に、先行ゼロビットの数を取得し、ゼロビットの総数からそれを減算します。


だから、これは正確に長さ8の行に対してのみ機能しますか?はいの場合、それはチャレンジに対して少し具体的すぎるようです。
ar4093

偶然に彼らが通常のルークランクであると仮定しましたが、現在修正されています。
me '
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.