보드 회전 시뮬레이션


14

소개

중력으로 인해 동전이 맨 위에 삽입되고 맨 아래로 (맨 위 동전으로) 떨어지는 일치하는 게임을하고 있습니다.

그래서 이건

O <- inserting this coin

OO O
OOOOO

이 될 것입니다

O
OO O
OOOOO

이제 누군가 보드를 시계 방향으로 회전한다고 상상해보십시오. 다음과 같은 일이 발생합니다.

1. 보드가 회전

OOO
OO
O
OO
O

2. 중력으로 인해 동전이 떨어짐

O
O
OO
OO
OOO

당신의 작업

당신의 임무는 프로그램이나 기능을 작성하여 보드의 회전을 시뮬레이션하는 것입니다. 간단하게하기 위해 우리는 한 종류의 동전 만 취급하고 있습니다 (매우 흥미 진진한 매칭 게임은 아닙니다). 회전이 완료된 후에 만 ​​중력이 적용되었다고 가정 할 수 있습니다. 보드가 시계 방향으로 회전합니다.

입력

입력은 3 가지 유형의 문자를 포함하는 문자열이됩니다.

  • O (자본 o) 또는 0 (영)-동전 (해당 솔루션이 지원하는 것을 결정)
  • (공백)-빈 필드
  • \ n (새 줄)-행 끝

입력은 보드의 상태를 나타냅니다. 입력이 올바르게 구성되어 있고 보드의 유효한 상태를 포함한다고 가정 할 수 있습니다 (동전이 떠 있지 않음). 입력은 함수 매개 변수이거나 표준 입력 또는 파일에서 읽을 수 있습니다.

산출

출력은 회전 후 보드의 새로운 상태입니다. 출력은 입력과 동일한 3 가지 유형의 문자를 포함합니다. 출력은 함수에서 리턴되거나 표준 출력 또는 파일에 기록 될 수 있습니다.

견본

입력 1 :

O
OO O
OOOOO

출력 1 :

O
O
OO
OO
OOO

입력 2 :

O O
O O

출력 2 :

OO
OO

선택한 언어의 모든 언어와 표준 라이브러리를 사용할 수 있습니다. 바이트 단위의 최단 프로그램이 이깁니다.


짧은 줄은 후행 공백으로 채워져 있습니까?
Ventero

필요한 경우 예.
David Frank

보드 크기에 대한 요구 사항은 무엇입니까? 합리적인 최대 크기를 선택할 수 있습니까? 아니면 응용 프로그램 / 기능이 가능한 모든 크기에서 작동해야합니까?
Fors

2
회전 후 중력이 가해지면 Input2는 어떻게 Output2가됩니까? 나는 그것이 최고 동전을 떨어 뜨릴 것이라고 생각했을 것입니다.
Matt

2
@Matt Input2 또는 Output2에는 빈 행이 없습니다 (SE는 행 사이에 여백을 표시 함).
David Frank

답변:


16

GolfScript, 14 12 자

' '-n%zip$n*

STDIN에 입력해야하며 코인 문자는 공백이 아닌 문자 일 수 있습니다. 여기를 보십시오 . 두 글자 감소를 지적한 Peter에게 감사합니다.


아, 내가 transpose길이가 다른 배열을 처리 할 수있는 Ruby에서 제공하지 않는 것은 ...
Ventero

@Ventero 대부분의 경우이 해키 버전을 사용합니다 ([nil]*a.map(&:size).max).zip(*a). 그래도 골프에는 좋지 않습니다.
Howard

당신은이 개 문자를 저장할 수 있습니다 : 가장 긴 라인은 항상 바닥에 결국 때문에, 당신은 대체 할 수 -1%와 함께 $.
피터 테일러

@PeterTaylor 당신이 옳습니다-우리는 문자를 저장할 수 있습니다. 감사합니다.
Howard

1
@PeterTaylor 글쎄,에 대한 한 문자 별칭을 포함 시켰습니다 " ".
SE가 EVIL이기 때문에 Aditsu 종료

6

자바 스크립트 (E6) 103

먼저 행렬 연산을 시도하십시오. 입력 문자열의 각 행은 채워 져야합니다.
꽤 장황한.

R=t=>(x=t.split('\n').reverse().map(x=>[...x].sort()),x.map((c,i)=>x.map(r=>r[i]).join('')).join('\n'))

의사 코드

  1. 문자열-> 행 배열
  2. 위 / 아래 역 배열
  3. 각 행-> 문자 배열
  4. 각 행을 정렬하십시오 (오른쪽으로 동전이 떨어짐)
  5. 바꾸어 놓다
  6. 행의 각 문자 배열-> 문자열
  7. 배열 결합-> 단일 문자열

오, 정렬이 영리합니다 (+1)! 내가 훔쳐도 될까요?
seequ

나는 [...x]전에 구문을 본 적이 없다 . 뭐라고 해요?
ComFreek 2016 년


2
@ edc65 대괄호로 링크를 끊었습니다. 여기입니다 올바른 링크
크리스 Cirefice

6

루비 2.0, 59 자

puts$<.map(&:chars).reverse.transpose.sort[1,50].map &:join

stdin을 통한 입력은 줄의 길이가 모두 같다고 가정합니다. 이것은 아마도 필요한 것보다 훨씬 길다. 그러나 적어도 읽을 수 있습니다 ...


$<.map대신 사용할 수 있다고 생각합니다 .
Howard

@Howard 그것은 내가 항상 잊어 버리는 것입니다. 감사!
Ventero

1
[1,50]은 무엇을하고 있습니까?
Charles

1
@Charles 입력의 모든 개행을 포함하는 첫 번째 행을 건너 뜁니다. David는 50x50이 가능한 최대 크기라고 언급하면서 첫 번째 행 ( 1..-1)을 제외한 모든 행을 선택하는 대신 두 번째 행 ( )으로 시작하는 50 행을 선택 1,50합니다.
Ventero

@Ventero가 얻었습니다. 멋있는. 감사!
Charles Charles

3

J- 49 31 24 바이트

나는 거기에 불필요한 회전이있을 것이라고 생각하지만 그렇지 않으면 잘 작동합니다. 지정된대로 입력을받는 함수입니다 O. coins 입니다. 입력에 후행 공백이 필요하지 않습니다.

edc65의 Javascript 답변 에서 영감을 얻은 새 버전 :

f=:[:|."1@|:[:/:~"1,;._2

설명:

f=:[:|."1@|:[:/:~"1,;._2
                   ,;._2 Split the string at every fret, which is the last character in the string (newline).
              /:~"1      Sort every row separately.
     |."1@|:             Rotate the array clockwise.

구 버전:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)

설명:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)
                                          (,;._2) Split the string at every fret, which is the last character in the string (newline).
                                (|."1@|:)@        Rotate the array clockwise.
                             |:@                  Reverse the axes (columns become rows and vice-versa).
       ((#~=&' '),=&'O'#])"1                      Function that applies the "gravity"
                          "1                       Apply to every row separately:
                  =&'O'#]                           Get the O's in the row.
       (#~=&' ')                                    Get the spaces in the row.
                ,                                   Join them, spaces come first.
  [:|:                                            Reverse axes again.

예 (여러 줄 문자열 0 : 0은 대괄호로 시작 하고 끝나는 점에 유의하십시오 ) :

   f 0 : 0
O
OO O
OOOOO
) NB. output starts now
O  
O  
OO 
OO 
OOO
   f 0 : 0
O O
O O
) NB. Output starts now.

OO
OO

가능하면 회전하기 전에 정렬
edc65

@ edc65 당신은 똑똑한 사람입니다.
seequ

2

하스켈 — 86

그냥 배우기 때문에 이것이 향상 될 수 있다고 확신합니다.

import Data.List
c=putStr.unlines.filter(/="").sort.map(filter(/=' ')).transpose.lines

샘플 입력 :

let a = "O    \nOO O \nOOOOO"
let b = " O O \n O O "
c a
c b

샘플 출력 :

O
O
OO
OO
OOO

OO
OO

2

파이썬 2 (69) (79)

for c in sorted(zip(*raw_input().split("\\n"))):print''.join(c[::-1])

공백으로 채워진 입력을 취하여 모든 줄의 길이가 동일합니다. 그만큼split 각 라인의 arrat를 생성한다. 는 zip효과적으로 배열을 전치. 그런 다음 sorted어휘 순서대로 튜플을 정렬하여 모든 동전이 바닥에 떨어집니다. 마지막으로 각 줄을 인쇄하여 다시 문자열로 바꾸십시오. 하는 print'O'*c.count('O')것은 동일하며 동일한 수의 문자를 사용합니다.

예제 실행 :

>> O    \nOO O \nOOOOO
O
O
OO
OO
OOO

1

C, 167 바이트

이 짧은 버전은 불행히도 원본보다 훨씬 명확합니다.

m;j;b[99];r;main(){while(j=getchar()+1)j-11?m+=j-33&&++b[r]>m:++r;for(j=r;m+1;putchar(j--?m<b[j]?79:32:(j=r,m--,10)));}

0

라켓 : 130

(let l((a'()))(let((b(sort(string->list(read-line))char<?)))(if
(null? b)(apply map(λ x(map display x)(newline))a)(l(cons b a)))))

줄이 같은 길이가되도록 공백으로 채워야합니다.


0

C # -209 174 바이트

좋아, 나는 내가 생각하는 어느 시점 에서이 코드 골프를 시도해야합니다. 보드를 회전시켜 인쇄하는 기능 (r)을 작성했습니다. 나는 char 배열을 인쇄 할 때 약간 바람을 피우고 있다고 생각하지만, 왜 화 내지 않아야하는지 알 수 없다면 :)

팁에 대한 ProgramFOX 덕분에 :)

void r(string s){int x=s.IndexOf('\n'),j,i=-1,k,z=x+1;var y=new char[x*x+x];for(;++i<x;y[z*(i+1)-1]='\n')for(k=j=x;j>0;)if(s[i*z+--j]=='0')y[k--*z-i-2]='0';Console.Write(y);}

사기

new char[x*x+x]배열을 채우고 채우지 '\0'않음' '


1
개행 제거 사이의 공간을 제거 char[]하고 y192 개 문자로 글자 수를 줄일 수 있습니다. 또한 static여기에 답변을 게시 할 때 키워드를 제공 할 필요는 없습니다 . 제거하면 글자 수가 185 자로 줄어 듭니다.
ProgramFOX

나는 또한 이전 시도 이후 잊혀진 'ref'를 제거 할 수있었습니다.
WozzeC 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.