루크 백작 이동 1D


31

루크 행 및 / 또는 빈 공간이있는 위치가 주어지면, 얼마나 많은 다른 루크 이동이 가능한지 출력하십시오. 루크는 왼쪽이나 오른쪽으로 빈 공간으로 이동할 수 있지만 다른 루크를 지나야하는 곳으로는 이동할 수 없습니다. 루크가 움직일 때 다른 루크는 그대로 남아 있습니다.

예를 들어이 위치에서 6 개의 이동 이 가능합니다.

.R..RRR.
  • 첫 번째 (가장 왼쪽) 루크는 1 칸 왼쪽으로 이동하거나 1 또는 2 칸 오른쪽으로 이동 (3 이동)
  • 다음 루크는 1 ~ 2 칸만 왼쪽으로 이동할 수 있습니다 (2 칸 이동).
  • 세 번째 루크는 다른 두 루크 사이에 압착되어 전혀 움직일 수 없습니다 (0 이동)
  • 마지막 루크는 오른쪽으로 1 칸만 이동할 수 있습니다 (1 칸 이동).

위치에 루크가 없거나 빈 공간이 없을 수도 있습니다.

입력 : 빈 공간과 빈 공간으로 구성된 비어 있지 않은 목록 (문자열, 배열 등). 당신은 그들에게 나타낼 수 등 True/ False, 1/ 0, 'R'/ '.', 또는 두 일치 별개의 단일 바이트 문자 또는 원하는 한 자리 숫자. 루크를 의미하고 빈 공간을 의미하는 것은 당신에게 달려 있습니다.

출력 : 음이 아닌 정수. 정수 부동 소수점도 좋습니다.

테스트 사례

출력은 왼쪽의 숫자입니다.

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_+

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. _가장 유쾌한 비정규 문자이므로 빈 공간에 사용 합니다. 유효한 Rook 이동에 해당하는 하위 문자열 수를 계산하여 작동합니다. 부분 문자열은 시작 또는 끝 부분에 하나 이상을 _더한 단일 루크 이동 R입니다.


오, 당신은 기본적으로 내 대답에서 언급 한 것을 수행하는 방법을 알아 냈습니다. 내가 왜 그렇게 생각하지 않았는지 Idk.
mbomb007

9

파이썬 3 , 30 29 바이트

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

온라인으로 사용해보십시오!

@JoKing 덕분에 -1 바이트

이 함수는 Python 바이트 문자열을 입력으로 사용합니다. 각 빈 공간은 탭으로 인코딩되고 각 루크는 b'\x00'값을 갖는 바이트로 인코딩됩니다 0.

lambda s:(s+s).strip().count(b'\t')바이트 수가 적은 동안 계산이 동일합니다 .


6

자바 스크립트 (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

파이썬 2 ,  40  33 바이트

@Grimy 덕분에 7 바이트 절약

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

온라인으로 사용해보십시오!


1
파이썬 버전은 ( TIO ) count대신 사용해야 합니다split
Grimmy

@Grimy 감사합니다. :)
Arnauld




3

망막 , 23 15 바이트

루크 사이의 간격 수를 두 번, 적어도 하나의 루크가있는 그렙 라인을 두 배로 한 다음 간격 수를 세십시오.

R.+R
$0$0
G`R
 

온라인으로 사용해보십시오!

프로그램은 마침표 대신 공백을 사용하지만 제공된 테스트 사례를 쉽게 붙여 넣을 수 있도록 접두사 코드를 추가했습니다.

와 겹치는 일치 항목을 사용할 수 있기를 (?<=R.*) | (?=.*R)원했지만 겹치는 부분은 그리 공격적이지는 않습니다. 해당 메소드로 올바른 결과를 리턴하기 위해 일치하는 방법을 모두 계산해야합니다.


1
.R.R.R.첫 번째 줄을 변경해도 R.+R도움 이 될 수 있지만 잘못된 결과를 얻는 것 같습니다.

@ 닐 고정. 감사.
mbomb007

2

젤리 , 6 바이트

t1;ḟẠS

온라인으로 사용해보십시오!

0루크 및 1공간 에 대한 목록을 가져 오고 이동 횟수가있는 정수를 리턴하는 모나드 링크 입니다. 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

온라인으로 사용해보십시오!

Jonathan Allan 에게 -1 감사합니다 .

0루크를 1나타내며 빈 공간을 나타냅니다.


1
루크에 공백 문자를 사용하고 공백에 다른 문자를 사용 하면 다음 5 가지를 얻을 수 있습니다 .ḲẈ+ƝS
Jonathan Allan

@JonathanAllan LOL은 그렇게 생각하지 않았습니다. 그리고 그 전에는 실험을 했지만 ṣ0대신 사용 했습니다.
Outgolfer Erik


2

C (클랑) , 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; // 루크가 충족되면 출력 -i- (추가 이동)에 추가하고 -r- (rook met)를 설정하면 -i-가 증가하여 문장이 증가합니다.

모든 공간에 -r- 추가 (루크 만점 보장)


바위? 바위가 움직입니까?
마스트

1
@Mast lol 죄송합니다! 편집
AZTECCO


2

하스켈 , 33 바이트

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

온라인으로 사용해보십시오!

1 (공백) 및 0 (루크)의 목록으로 입력을받는 익명 함수. 이렇게하면 목록의 시작과 끝에서 공백이 잘린 다음 목록의 두 버전을 연결하고 합칩니다.

GHC 8.4.1 이상을 사용하여 <>가져 오지 않고 운영자 에게 액세스 할 수 있습니다.







1

자바 11, 35 32 바이트

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

@Joel 의 Python 3 답변 포트 . @Joel
덕분에 -3 바이트 .

\0루크에는 NULL 바이트 ( )를 사용 \t하고 공백에는 탭 ( )을 사용합니다.

온라인으로 사용해보십시오.

s->(s+s).trim().chars().sum()/9처음에는 31 바이트로 사용하려고 시도했지만 String#trim기본 제공 문자는 선행 및 후행 공백 / 탭 / 줄 바꿈뿐만 아니라 U+0020(유니 코드 32; 공백) 보다 작거나 같은 다른 모든 바이트를 제거 하기 때문에 작동하지 않습니다 . 따라서 NULL 바이트도 제거
됩니다. Joel 덕분에 새로운 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

@Joel Ah, 완전히 잊어 버렸습니다! 감사. :)
Kevin Cruijssen





1

C , 183 (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'것이 더 짧습니다. e+e*d보다 사용 e*(1+d), e=0,d=1;else e++; can be changed to e = -1, d = 1; e ++; , and b [a]` b[++a]로 대체 가능 *b*++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  

비트가 왼쪽에 추가되도록 비트를 복사하고 후행 0 비트를 제거합니다. 그런 다음 선행 0 비트 수를 가져와 총 0 비트 수에서 뺍니다.

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  

비트를 다음 유효 바이트로 복사하고 후행 0 비트를 제거합니다. 그런 다음 선행 0 비트 수를 가져와 총 0 비트 수에서 뺍니다.


따라서 이것은 정확히 길이가 8 인 행에만 작동합니까? 그렇다면 도전에 대해 너무 구체적으로 보입니다.
ar4093

실수로 그들이 지금은 고정 된 루크 계급이라고 가정했습니다.
나 '
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.