Mô phỏng xoay bảng


14

Giới thiệu

Bạn đang chơi một trò chơi phù hợp, trong đó các đồng xu được chèn ở trên cùng và rơi xuống dưới cùng (lên đồng tiền trên cùng) do trọng lực.

Vậy đây

O <- inserting this coin

OO O
OOOOO

sẽ trở thành này

O
OO O
OOOOO

Bây giờ hãy tưởng tượng ai đó xoay bảng theo chiều kim đồng hồ. Sau đây sẽ xảy ra:

1. Bảng được xoay

OOO
OO
O
OO
O

2. Tiền xu rơi xuống do trọng lực

O
O
OO
OO
OOO

Nhiệm vụ của bạn

Nhiệm vụ của bạn là mô phỏng vòng quay của bảng bằng cách viết chương trình hoặc hàm. Để đơn giản, chúng tôi chỉ giao dịch với một loại tiền xu (đây không phải là một trò chơi phù hợp quá thú vị, đó là trò chơi). Bạn có thể giả định rằng trọng lực chỉ được áp dụng sau khi xoay xong. Bảng được xoay theo chiều kim đồng hồ.

Đầu vào

Đầu vào sẽ là một chuỗi, chứa 3 loại ký tự:

  • O (vốn o) HOẶC 0 (không) - một đồng tiền (bạn quyết định giải pháp nào hỗ trợ cho bạn)
  • (dấu cách) - một trường trống
  • \ n (dòng mới) - cuối hàng

Đầu vào đại diện cho trạng thái của hội đồng quản trị. Bạn có thể giả sử, đầu vào được hình thành tốt và chứa trạng thái hợp lệ của bảng (không có đồng xu nào được thả nổi). Đầu vào có thể là một tham số chức năng, hoặc có thể được đọc từ đầu vào tiêu chuẩn hoặc từ một tệp.

Đầu ra

Đầu ra là trạng thái mới của bảng sau khi xoay. Đầu ra chứa 3 loại ký tự giống như đầu vào. Đầu ra có thể được trả về từ chức năng của bạn hoặc có thể được ghi vào đầu ra tiêu chuẩn hoặc vào một tệp.

Mẫu vật

Đầu vào1:

O
OO O
OOOOO

Đầu ra1:

O
O
OO
OO
OOO

Đầu vào2:

O O
O O

Đầu ra2:

OO
OO

Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện tiêu chuẩn của ngôn ngữ đã chọn. Chương trình ngắn nhất trong byte thắng.


Là các dòng ngắn hơn được đệm với không gian dấu?
Ventero

Nếu bạn cần như vậy thì có.
David Frank

Các yêu cầu cho kích thước bảng là gì? Tôi có thể chọn kích thước tối đa hợp lý không, hoặc ứng dụng / chức năng có cần phải hoạt động cho tất cả các kích thước có thể không?
Dành cho

2
Nếu trọng lực được áp dụng sau khi quay, làm thế nào Input2 trở thành Output2? Tôi có thể nghĩ rằng nó sẽ thả những đồng tiền hàng đầu xuống nhưng không theo chiều ngang?
Matt

2
@Matt Lưu ý rằng không có hàng trống nào trong Input2, cũng như trong Output2 (SE hiển thị lề giữa các hàng).
David Frank

Câu trả lời:


16

GolfScript, 14 12 ký tự

' '-n%zip$n*

Đầu vào phải được đưa ra trên STDIN, ký tự cho tiền có thể là bất kỳ ký tự không phải khoảng trắng nào. Hãy thử ở đây . Cảm ơn Peter đã chỉ ra một giảm hai ký tự.


Ồ, những gì tôi sẽ không cung cấp cho transposeRuby có thể xử lý các mảng với độ dài khác nhau ...
Ventero

@Ventero Hầu hết các lần tôi sử dụng phiên bản hack này : ([nil]*a.map(&:size).max).zip(*a). Không tốt cho chơi golf mặc dù.
Howard

Bạn có thể lưu 2 ký tự: vì các dòng dài nhất luôn kết thúc ở dưới cùng, bạn có thể thay thế -1%bằng $.
Peter Taylor

@PeterTaylor Bạn nói đúng - chúng ta có thể lưu vào ký tự. Cảm ơn bạn.
Howard

1
@PeterTaylor Vâng, tôi đã bao gồm một bí danh một ký tự cho " ".
aditsu

6

Javascript (E6) 103

Thử đầu tiên, chỉ hoạt động ma trận. Mỗi hàng trong chuỗi đầu vào cần phải được đệm.
Khá dài dòng.

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

Mã giả

  1. chuỗi -> mảng hàng
  2. mảng lên / xuống ngược
  3. mỗi hàng -> mảng char
  4. sắp xếp từng hàng (xu 'rơi' sang phải)
  5. hoán vị
  6. mỗi mảng char trong một hàng -> một chuỗi
  7. tham gia mảng -> chuỗi đơn

Ôi chà, sắp xếp thật thông minh (+1)! Tâm trí nếu tôi ăn cắp nó?
xem

Tôi chưa bao giờ thấy cú pháp [...x]trước đây. Đó là những gì được gọi là?
ComFalet

2
@ComFreak nó được gọi là spread[ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

2
@ edc65 Bạn đã phá vỡ liên kết của riêng bạn với dấu ngoặc. Đây là liên kết chính xác
Chris Cirefice

6

Ruby 2.0, 59 ký tự

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

Nhập qua stdin, giả sử các dòng có cùng độ dài. Điều này có lẽ lâu hơn nhiều so với cần thiết. Nhưng ít nhất nó có thể đọc được ...


Tôi nghĩ rằng bạn có thể sử dụng $<.mapthay thế.
Howard

@Howard Đó là một điều tôi luôn quên. Cảm ơn!
Ventero

1
[1,50] đang làm gì ở đó?
Không phải Charles

1
@Charles Nó bỏ qua hàng đầu tiên, chứa tất cả các dòng mới từ đầu vào. David đã đề cập trong một nhận xét rằng 50x50 là kích thước tối đa có thể, vì vậy thay vì chọn tất cả trừ hàng đầu tiên ( 1..-1), tôi chỉ chọn 50 hàng bắt đầu bằng hàng thứ hai ( 1,50).
Ventero

@Ventero hiểu rồi. mát mẻ. cảm ơn!
Không phải là Charles

3

J - 49 31 24 byte

Tôi nghĩ rằng có thể có những vòng quay không cần thiết trong đó, nhưng nếu không thì nó hoạt động tốt. Đây là một chức năng lấy đầu vào như được chỉ định, đang tồn tại O. Không có khoảng trắng ở cuối được yêu cầu trong đầu vào.

Phiên bản mới, lấy cảm hứng từ câu trả lời Javascript của edc65 :

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

Giải trình:

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.

Phiên bản cũ:

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

Giải trình:

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.

Ví dụ (lưu ý rằng các chuỗi đa dòng bắt đầu bằng 0 : 0và kết thúc bằng một dấu ngoặc):

   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

Nếu bạn có thể, hãy sắp xếp trước khi xoay
edc65

@ edc65 Bạn là một người đàn ông thông minh.
Seequ

2

Haskell - 86

Chỉ học, vì vậy tôi chắc chắn điều này có thể được cải thiện.

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

Đầu vào mẫu:

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

Đầu ra mẫu:

O
O
OO
OO
OOO

OO
OO

2

Con trăn 2 (69) (79)

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

Đưa đầu vào được đệm bằng khoảng trắng để tất cả các dòng có độ dài bằng nhau. Việc splittạo ra một arrat của mỗi dòng. Hiệu zipquả chuyển mảng. Sau đó, các sortedloại sắp xếp theo thứ tự từ điển, làm cho tất cả các đồng tiền rơi xuống đáy. Cuối cùng, chúng tôi in từng dòng, biến nó trở lại thành một chuỗi, mặc dù chúng tôi phải đảo ngược nó trước. Làm print'O'*c.count('O')là tương đương và sử dụng cùng một số ký tự.

Chạy ví dụ:

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

1

C, 167 119 byte

Phiên bản ngắn hơn này (không may?) Rõ ràng hơn nhiều so với bản gốc.

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

Vợt: 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)))))

Nó đòi hỏi bạn phải có khoảng trống để các đường thẳng bằng nhau.


0

C # - 209 174 byte

Phải, tôi phải thử chơi Code Code này vào một lúc nào đó tôi nghĩ. Tạo một hàm (r) để xoay bảng và in nó. Tôi đoán là tôi gian lận một chút khi tôi in mảng char của mình, nhưng nếu bạn không thể hiểu tại sao bạn không nên nổi điên :)

Cảm ơn ProgramFOX về các mẹo :)

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);}

Lừa đảo

new char[x*x+x]điền vào mảng có '\0'và không' '


1
Xóa các dòng mới và xóa khoảng trắng giữa char[]ysẽ giảm số ký tự của bạn xuống 192 ký tự. Ngoài ra, không thực sự cần thiết phải cung cấp từ khóa statickhi đăng câu trả lời ở đây. Xóa nó sẽ giảm số ký tự của bạn xuống còn 185 ký tự.
Chương trìnhFOX

Tôi cũng có thể xóa 'ref' đã bị lãng quên ở đó kể từ lần thử trước đó.
WozzeC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.