Tạo một tam giác vuông


10

Trong thử thách này, bạn phải lấy hai số (cách nhau bởi một khoảng trắng) làm đầu vào và đầu ra một tam giác vuông ASCII, được tạo thành từ xs.

Số đầu tiên sẽ là chiều rộng và chiều cao của hình tam giác bạn nên xuất ra. Số thứ hai sẽ là góc nào góc bên phải sẽ nằm trong. Các góc được đánh số từ 1 đến 4, bắt đầu từ trên cùng bên trái và đi theo thứ tự đọc tiếng Anh:

1    2



3    4

Ví dụ: (đầu vào và đầu ra tam giác tương ứng của chúng):

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

Đầu ra của chương trình của bạn phải khớp chính xác các ví dụ này với các đầu vào tương ứng của chúng.

Đầu vào sẽ luôn hợp lệ: số thứ nhất sẽ là số nguyên ≥1 và số thứ hai sẽ là 1, 2, 3 hoặc 4.

Đây là ; mã ngắn nhất (tính theo số ký tự) sẽ thắng.

Câu trả lời:


9

APL (30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

Giải trình:

  • {... }/⎕: giảm hàm đã cho so với đầu vào (vì vậy nếu đầu vào có 2 số, chỉ cần gọi hàm với hai số đó, là số bên trái và số bên phải)
  • ≤/¨⍳2⍴⍺: Tạo ma trận tọa độ -by- và đặt các vị trí trong đó tọa độ X không lớn hơn tọa độ Y, tạo ra một trường bit.
  • (⍎⍵⌷'⌽+⍉⊖'): chọn một hàm biến đổi được đưa ra bằng cách đặt tam giác sang phải.
  • ' x'[1+... ]: thêm một vào bitfield và sử dụng kết quả làm chỉ mục vào chuỗi ' x', do đó, đặt khoảng trắng cho 0 và xcho 1.

1
Càng đọc nhiều APL, tôi càng nhận ra APL là một cơn ác mộng phân tích. Nó sẽ không phải thực sự đánh giá (⍎⍵⌷'functions')phần trước khi nó quyết định làm thế nào để giải thích toàn bộ tuyên bố? Hãy xem xét ví dụ 1+(⍵⌷'12+')|40. Nó thậm chí sẽ không biết |là đơn sắc hay dyadic trước khi ing phần ngoặc đơn đó. Toàn bộ cây cú pháp trừu tượng thay đổi tùy thuộc vào đánh giá.
người bảo vệ

Ý tôi là 1+(⍎⍵⌷'12+')|40... sẽ không để tôi chỉnh sửa.
bảo vệ

2
@protist: Sự thật thú vị: f ← { [ }không đưa ra lỗi! f 1÷0đưa ra ... một lỗi tên miền ! (vì chia cho số không). Chỉ khi bạn gọi hàm như f 123bạn gặp lỗi cú pháp . Kìa: imgur.com/jtmdi4B
marinus

Bởi tất cả các vị thần !!!! Điều đó làm tan vỡ trái tim tôi một chút. Tôi đã chơi với việc viết một số thông dịch viên APL, và điều đó chứng tỏ một tội ác lớn trong các triển khai hiện tại. hahaha
người bảo vệ

Có vẻ như các chức năng được đưa vào thường xuyên bởi một số quy trình giống như mở rộng vĩ mô xấu xí. Nó sẽ phần nào chỉ ra sự mở rộng văn bản tại chỗ.
người bảo vệ

6

Ruby, 116 115 109 96

Tôi sẽ bắt đầu với giải pháp của riêng tôi.

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

Tôi chỉ biết rằng tôi sẽ bị đánh bại bởi một giải pháp GolfScript 30 ký tự gần như ngay lập tức: P

Cảm ơn minitech đã cạo sạch 19 ký tự (wow)!


Thay vì ==0, bạn có thể sử dụng <1. ?x*xcứu nhân vật khác. Ngoài ra, puts i[1]%2<1?t.rjust(s):t}sẽ làm các mẹo, phải không?
Ry-

Hmm, bạn có không gian xung quanh ?? Điều đó có cần thiết không? Ngoài ra, tôi nghĩ rằng bạn có thể làm điều tương tự với r=.
Ry-

@minitech Điều đó là cần thiết - không gian hàng đầu vì nếu không, nó phân tích cú pháp 1?dưới dạng một mã thông báo duy nhất và không gian theo dõi bởi vì nếu không, nó phân tích cú pháp là ?t(tương đương với 't'). Làm thế nào để bạn đề xuất tái cấu trúc rmột phần?
Doorknob

Bạn đã thử à? Theo phiên bản nào của Ruby? Hoạt động tốt cho tôi trên 2.0.
Ry-

@minitech lẻ, nó không hoạt động trước đây và bây giờ thì có: P Cảm ơn
Doorknob

4

GolfScript ( 34 33 ký tự)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

Thật xấu hổ khi các góc không được đánh số theo vòng quay, bởi vì điều đó sẽ cho phép một cách tiếp cận thanh lịch hơn trong việc xây dựng một mảng và sau đó xoay vòng nthời gian:

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C # - 195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

Định dạng:

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

nhập mô tả hình ảnh ở đây


Đầu vào phải được phân cách bằng dấu cách, không được phân tách bằng dấu phẩy.
Doorknob

@Doorknob: Ảnh chụp màn hình là từ một chương trình thử nghiệm mà tôi đã chọn để hiển thị đầu vào bằng dấu phẩy. Đầu vào thực sự được phân định không gian khi bạn thực hiện chương trình, mặc dù điểm này là moot vì tất cả các ứng dụng bảng điều khiển C # nhận đầu vào dưới dạng một chuỗi các chuỗi.
Igby Largeeman

2

Golf, 39 36 35 ký tự

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

bản demo trực tiếp: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

quá tệ, không phải 30 ký tự như yêu cầu


Thay thế 1${-1%}*với -1 2$?%\2>{-1%}*với \2>-1\?%sẽ net bạn 2 ký tự.
Biến động

@Volatility cảm ơn, được kết hợp
John Dvorak

@Volatility -1 2có thể được viết0~2
Howard

Và đối với một char khác, chúng ta phải cơ cấu lại một chút nữa:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
Howard

2

Toán học 122 (104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

Một phương pháp khác


Theo cách giải thích tự do về "đầu ra", các ký tự sau (104 ký tự) sẽ hoạt động.

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

Tam giác


Nếu đầu vào ở dạng danh sách được cho phép, thì (75 ký tự) sau đây sẽ đủ:

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


Về mặt kỹ thuật, điều này là trái với quy tắc: P
Doorknob

Nó vi phạm quy tắc gì?
DavidC

Các biểu đồ đầu vào / đầu ra điều tôi đặt. 122 char một là tốt mặc dù. Tôi đã chỉnh sửa câu hỏi để làm rõ
Doorknob

Giáo sư. Tôi nghĩ rằng biểu đồ chỉ đơn giản là một ví dụ.
DavidC

Tôi chỉ đặt phiên bản nghệ thuật ASCII ở vị trí đầu tiên.
DavidC

2

J, 59 55 42 38 37 36 ký tự

Nếu nó được phép có đầu vào vào cuối chương trình:

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

Nếu không (thêm 3 ký tự):

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

Sử dụng:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

hoặc là

   t 3 4
  x
 xx
xxx

Tôi nghĩ rằng điều này có thể ngắn hơn một chút vì hầu hết các ký tự là dấu ngoặc và mũ để giữ nó theo kiểu ẩn.

Chỉnh sửa
Sử dụng một gerund và động từ chương trình nghị sự đã cắt bớt một vài ký tự, nhưng vẫn còn quá nhiều mũ trong đó theo ý thích của tôi.

Chỉnh sửa 2
Đó là một chút giống như nó. Việc bỏ chương trình nghị sự cho một danh sách có bao nhiêu phép quay được yêu cầu loại bỏ hầu hết các dấu ngoặc phụ và một vài chữ hoa.

Chỉnh sửa 3
Loại bỏ nắp không liên tục cuối cùng và một cặp dấu ngoặc trong quy trình. Cần tìm một cách mã hóa rẻ hơn số lần quay cần thiết.

Chỉnh sửa 4 Sử dụng tiền tố thay vì hậu tố để cắt bỏ một ký tự. Cho phép một cách khác để tạo danh sách mà không lưu bất kỳ ký tự nào. Bugger.

Chỉnh sửa 5
Sử dụng công thức để cắt bỏ một ký tự khác. Vẫn cảm thấy bit này có thể ngắn hơn.


1

Nhân vật Python 106

w,d=map(int,raw_input().split())
for e in range(1,w+1)[::d/3*2-1]:print('%'+'-+'[d%2]+str(w)+'s')%('*'*e)

1

Trăn 3, 91

Dựa trên câu trả lời của Abhijit.

Sửa đổi việc tạo chuỗi đầu ra để tránh tổng chuỗi và 1s xấu trong range. Python 3 được loại bỏ raw_trong raw_input, nhưng cần thiết để sử dụng //cho phép chia số nguyên và thêm parantheses cho print, để chỉ lưu một ký tự.

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

Mèo con , 140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

Ung dung:

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

Bằng chứng là tôi cần triển khai quá tải và đưa ra thư viện chuẩn.

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.