Ôi trời! Tôi là cảnh sát trưởng của mã golf!


30

Có vẻ như bất cứ ai đã sử dụng Twitter vài tháng trước đều biết về 'Howdy! Tôi là cảnh sát trưởng của X "meme. Trong đó một hình ảnh đơn giản của cảnh sát trưởng được vẽ bằng biểu tượng cảm xúc, và thay đổi để phù hợp với một chủ đề. Vì vậy, tôi nghĩ rằng đã đến lúc cho Cảnh sát trưởng Code Golf. Đây là:

    ###
   #####
    ###
    ###
    ###
     #
   #####
  #  #  #
 #   #   #
 #   #   #
     #
    ###
   #   #
   #   #
   #   #
   #   #

Đặc biệt, cái này có 'pixel' rộng một ký tự và cao một ký tự. Để tạo ra anh ta, các đối số sẽ là 1 và 1.

Nếu anh ta rộng hơn anh ta thì sao?

      ######
    ##########
      ######
      ######
      ######
        ##
    ##########  
  ##    ##    ##
##      ##      ##
##      ##      ##
        ##
      ######
    ##      ##
    ##      ##
    ##      ##
    ##      ##

Anh ấy có chiều cao là 1, nhưng chiều rộng là 2.


Quy tắc:

  • Thách thức là viết mã để vẽ Sheriff of Code Golf của riêng bạn, trong số ít nhân vật nhất có thể.
  • Sử dụng bất kỳ ngôn ngữ lập trình mà trái tim bạn mong muốn.
  • Mã của bạn nên có hai đối số, cả hai đều là số nguyên, cho chiều cao và chiều rộng của Cảnh sát trưởng.
  • Đầu ra phải bao gồm các khoảng trắng đơn cho nền và bất kỳ ký tự nào khác bạn chọn cho Cảnh sát trưởng. (Tôi đã sử dụng băm cho các trường hợp thử nghiệm, nhưng không quan trọng bạn sử dụng cái gì).
  • Có thể cho chiều cao là một số nguyên âm, đảo ngược hình ảnh.
  • Chiều rộng có thể là một số nguyên âm, nhưng vì hình ảnh đối xứng nên nó sẽ giống hệt với giá trị dương của nó.
  • Trailing-space trắng là không liên quan.
  • Nếu một trong hai đối số là 0, kích thước đó được 'làm phẳng' thành một hàng hoặc cột đơn. Độ dài của dòng này là đối số khác nhân với chiều cao hoặc chiều rộng của Cảnh sát trưởng, tương ứng.
  • Nếu cả hai đối số đều bằng 0, cả hai dòng đều 'phẳng', để lại một ký tự dương duy nhất.
  • Không cần thiết, nhưng vui lòng bao gồm một liên kết đến một trình thông dịch trực tuyến như tio.run
  • Đầu ra phải là một chuỗi, trên nhiều dòng hoặc đầu ra cho bàn điều khiển.

Các trường hợp thử nghiệm

1 cao, 1 rộng

    ###
   #####
    ###
    ###
    ###
     #
   #####
  #  #  #
 #   #   #
 #   #   #
     #
    ###
   #   #
   #   #
   #   #
   #   #   

2 cao, 1 rộng

    ###
    ###
   #####
   #####
    ###
    ###
    ###
    ###
    ###
    ###
     #
     #
   #####
   #####
  #  #  #
  #  #  #
 #   #   #
 #   #   #
 #   #   #
 #   #   #
     #
     #
    ###
    ###
   #   #
   #   #
   #   #
   #   #   
   #   #
   #   #
   #   #
   #   #  

1 cao, 2 rộng

      ######
    ##########
      ######
      ######
      ######
        ##
    ##########  
  ##    ##    ##
##      ##      ##
##      ##      ##
        ##
      ######
    ##      ##
    ##      ##
    ##      ##
    ##      ##

2 cao, 2 rộng

      ######
      ######
    ##########
    ##########
      ######
      ######
      ######
      ######
      ######
      ######
        ##
        ##
    ##########  
    ##########  
  ##    ##    ##
  ##    ##    ##
##      ##      ##
##      ##      ##
##      ##      ##
##      ##      ##
        ##
        ##
      ######
      ######
    ##      ##
    ##      ##
    ##      ##
    ##      ##
    ##      ##
    ##      ##
    ##      ##
    ##      ##

-1 cao, 1 rộng

   #   #
   #   #
   #   #
   #   #   
    ###
     #
 #   #   #
 #   #   #
  #  #  #
   #####
     #
    ###
    ###
    ###
   #####
    ###

1 cao, rộng -1

    ###
   #####
    ###
    ###
    ###
     #
   #####
  #  #  #
 #   #   #
 #   #   #
     #
    ###
   #   #
   #   #
   #   #
   #   #   

0 cao, 0 rộng

#

1 cao, 0 rộng

#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#

0 cao, 2 rộng

##################

Chúc các bạn vui vẻ!


1
Thử thách này đã khiến tôi nhớ đến cuốn tiểu thuyết Thế giới đảo ngược .
Charlie

Liên quan: Hình ảnh của một người bạn cũ trong nghệ thuật ASCII (thang đo thay đổi; không đảo ngược hoặc làm phẳng)
Luis Mendo

Quan sát: 1 cao, 2 rộng là hình ảnh giống con người nhất trong các trường hợp thử nghiệm, mặc dù tôi bắt buộc phải cổ vũ cho người Úc ở giữa nó
Jo King

@JoKing Nếu tôi đặt tên cho chúng, tôi chắc chắn có (-1, 1) là 'Úc' và (-1, 2) là 'Úc thực tế'. Mặc dù ... Có lẽ điều đó có thể bị hiểu lầm.
AJFaraday

Câu trả lời:


39

JavaScript (ES6), 171 byte

Đưa đầu vào theo cú pháp currying (width)(height). Trả về một chuỗi các chuỗi.

w=>h=>[...Array((h>0?h:-h)*16||1)].map((_,y)=>'012345678'.replace(/./g,x=>' #'[((c=+'3733317900134444'[(h<0?16-~y/h:y/h)|0]||17)>>4-x|c>>x-4)&1|!h].repeat(w>0?w:-w))||'#')

Hãy thử trực tuyến!

Làm sao?

Chỉ một nửa bên trái của cảnh sát trưởng được mã hóa dưới dạng bitmas nhị phân, bao gồm cả cột giữa:

    ##.         00011     3
   ###..        00111     7
    ##.         00011     3
    ##.         00011     3
    ##.         00011     3
     #          00001     1
   ###..        00111     7
  #  #  .       01001     9
 #   #   .  --> 10001 --> 17
 #   #   .      10001     17
     #          00001     1
    ##.         00011     3
   #   .        00100     4
   #   .        00100     4
   #   .        00100     4
   #   .        00100     4

9170

'3733317900134444'

0xsố 80y15(x,y) được cho bởi:

' #'[                                  // character lookup:
  (                                    //   0 = space
    (                                  //   1 = '#'
      c = +'3733317900134444'[y] || 17 // extract the bitmask for this row; 0 -> 17
    )   >> 4 - x                       // test the left part, middle column included
    | c >> x - 4                       // test the right part, middle column also included
  ) & 1                                // isolate the least significant bit
]                                      // end of character lookup

6
Cho dù bạn có đăng bao nhiêu câu trả lời, tôi vẫn ấn tượng mỗi lần ..
Kevin Cruijssen 27/07/18

Tôi đã rút ngắn phiên bản của bạn xuống 10 byte. Tôi không chắc chắn nên đăng nó như của riêng tôi hay chỉ để nâng cao của bạn. Mine lấy cảm hứng từ bạn để nó trông giống như một bản sao. Bằng cách này, suy nghĩ tuyệt vời: D. Làm tốt lắm!
ibrahim mahrir

... Bằng 8 byte chứ không phải 10 .:-P
ibrahim mahrir

@ibrahimmahrir Đôi khi, có một ranh giới mỏng manh giữa lỗi thờiđược cải thiện . Vì vậy, nó tùy thuộc vào bạn. Nếu bạn nghĩ rằng việc thực hiện của bạn là đủ khác nhau, tôi không bận tâm nếu bạn đăng nó dưới dạng một câu trả lời riêng biệt.
Arnauld

2
@ibrahimmahrir Tôi thấy. Tôi nghĩ rằng tôi nên để cái này như cũ. Bạn vẫn có thể đăng bài của bạn dưới dạng phiên bản thay thế riêng biệt. Điều đó tốt với tôi! (Tôi chắc chắn sẽ thêm một liên kết trong câu trả lời của tôi.)
Arnauld

16

Con trăn 2 , 228 218 202 189 173 byte

lambda h,w:sum(([''.join('# '[int(n)]*abs(w)for n in bin([62,120,224,238,438,750][int(l)])[2:])or'#']*abs(h)for l in'1211102455013333'),[])[::1-(h<0)*2]or['#'*9*abs(w)or'#']

Hãy thử trực tuyến!


Lựa chọn thay thế:

Python 2 , 173 byte

lambda h,w:sum(([''.join('# '[int(n)]*abs(w)for n in bin(ord(' >w(8\x96I'[l])*l)[2:])or'#']*abs(h)for l in map(int,'3433314655132222')),[])[::1-(h<0)*2]or['#'*9*abs(w)or'#']
lambda h,w:sum(([''.join('# '[int(n)]*abs(w)for n in bin(ord(' >w(8\x96I'[int(l)])*int(l))[2:])or'#']*abs(h)for l in'3433314655132222'),[])[::1-(h<0)*2]or['#'*9*abs(w)or'#']

8

Perl 5 , 169 166 157 byte

@a=map"$_\n",(split 1,'  #####1   ###1    #1 #  #  #1#   #   #1  #   #')
[1011120344215555=~/./g];
print s/./$&x abs"@F"/ger x abs$F[1]for$F[1]<0?reverse@a:@a;

Hãy thử trực tuyến!

Có lẽ nhiều hơn có thể đạt được bằng cách nghịch ngợm.


1
Cách tiếp cận tuyệt vời! Tôi đã chơi với câu trả lời của bạn và với một vài thay đổi, bạn có thể tiết kiệm được một vài byte: Hãy thử trực tuyến! Đó chính xác là cùng một cách tiếp cận chỉ sử dụng I / O hơi khác nhau và một vài thủ thuật để sắp xếp lại các phần tử và lưu trữ chúng với ít byte hơn! Hạnh phúc để xây dựng trên bất cứ điều gì nếu cần thiết!
Dom Hastings

Thx cho mẹo trên split, tôi đang sử dụng nó bây giờ và lưu hai byte. Cũng cạo một cái bằng cách mất các 's xung quanh các chỉ mục. Không thể sayđi làm mặc dù.
Kjetil S.

Thx cũng để có được chiều rộng và chiều cao "miễn phí" với -a, mất thêm 9 byte với điều đó.
Kjetil S.

Không có vấn đề gì cả! Bạn có thể kích hoạt sayvới -M5.010, nhưng không phải ai cũng thích, bạn có thể sử dụng -lthay thế và giữ print, nhưng nếu không, bạn có thể sử dụng một dòng mới theo nghĩa đen hoặc $_.$/cho -1. Rất vui khi thấy một tay golf Perl khác!
Dom Hastings

Không thể để điều này một mình và quản lý để giảm thêm một vài. saykhông hoạt động vì dòng mới được thêm vào mapđể sử dụng nó đòi hỏi một cuộc gọi hơi khác. Tôi cũng nhận ra rằng khi mã của bạn kết thúc bằng một biến và bạn đang sử dụng -phoặc thứ gì đó bạn có thể sử dụng @;vì nó bao gồm: Hãy thử trực tuyến! Hy vọng bạn không quan tâm đến ý kiến ​​của tôi!
Dom Hastings

7

Than , 61 byte

NθNη¿θF⪪”{“↷C¿2t´⁴Q19·“*Ty”!E↔θ∨⭆ι×μ↔η#×#∨×⁵↔η¹‖OO←∨↔η¹¿‹θ⁰‖↓

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

NθNη

Nhập kích thước.

¿θF⪪”{“↷C¿2t´⁴Q19·“*Ty”!

Nếu chiều cao là khác không, hãy vòng qua nửa bên phải của cảnh sát trưởng ...

E↔θ

... lặp lại số lần chiều cao tuyệt đối ...

∨⭆ι×μ↔η#

... Nếu chiều rộng là khác không thì lặp lại mỗi ký tự số lần tuyệt đối, nếu không thì a #.

×#∨×⁵↔η¹

Nhưng nếu chiều cao bằng 0, thì lặp lại #5 lần chiều rộng tuyệt đối, nhưng ít nhất là 1 #.

‖OO←∨↔η¹

Phản ánh để tạo ra một nửa bên trái của cảnh sát trưởng.

¿‹θ⁰‖↓

Nếu chiều cao là âm, lật cảnh sát trưởng.


4

Python 2 , 217 216 byte

h,w=input();t=[];w=abs(w)
for i in range(16):c=bin(32+int('37333179HH134444'[i],26))[-5:];t+=[[''.join(abs(w)*' #'[d>'0']for d in c+c[3::-1]),'#'][w==0]]*abs(h)
print['\n'.join(t[::[1,-1][h<0]]),'#'*(w*16or 1)][h==0]

Hãy thử trực tuyến!

Một riff Pythonic trên cách tiếp cận của Arnauld .

Ừ Bây giờ hoạt động cho tất cả các điều kiện cạnh ...


3

Sạch sẽ , 299 275 272 byte

import StdEnv,Data.List
f=flatlines
r=repeatn
$0 0=['#']
$h w#w=abs w
|h==0=r(w*9)'#'
|w<1=f(r(abs h*16)['#'])
=f(if(h<0)reverse id[cjustify(w*9)(intercalate(spaces((0xde35945rem n)*10/n*w))(r((0xc8d88154f8fberem n)*10/n)(r w'#')))\\n<-map((^)10o~)[-16..0],_<-[1..abs h]])

Hãy thử trực tuyến!


2

Powershell, 174 170 byte

Lấy cảm hứng từ Javascript của Arnauld

param($w,$h)('CGCCCAGIQQACDDDD'[((0..15),(15..0))[$h-lt0]],31)[!$h]|%{$n=+$_
,(-join(4..0+1..4|%{,' #'[($n-shr$_)%2]*[Math]::Abs($w)}),'#')[!$w]*[Math]::Abs(($h,1)[!$h])}

Ungolfed, giải thích và kiểm tra kịch bản:

<#

Script uses 5 bits of integer as 5 left chars of a line of a sheriff
Script ignores other bits in this integer, so we can use 6 bit to take a ASCII letter
    ##.         1 00011     C
   ###..        1 00111     G
    ##.         1 00011     C
    ##.         1 00011     C
    ##.         1 00011     C
     #          1 00001     A
   ###..        1 00111     G
  #  #  .       1 01001     I
 #   #   .  --> 1 10001 --> Q
 #   #   .      1 10001     Q
     #          1 00001     A
    ##.         1 00011     C
   #   .        1 00100     D
   #   .        1 00100     D
   #   .        1 00100     D
   #   .        1 00100     D

#>

$f = {

param($w,$h)
(
    'CGCCCAGIQQACDDDD'[             # 5 bits of each char correspond to 5 left symbols of line of sheriff.
        ((0..15),(15..0))[$h-lt0]], # forward or reverse sequence of chars
    31                              # or sequence of one element = 11111
)[!$h]|%{                           # choose a sequence and for each
    $n=+$_                          # integer or ASCII code
    ,(  -join(
            4..0+1..4|%{            # loop on bit range 4..0 and append fliped range 1..4
                ,' #'[($n-shr$_)%2]*[Math]::Abs($w)
            }                       # returns space or # depend on bit, repeat $w times
        ),
        '#'                         # returns # for $w equal 0
    )[!$w]*[Math]::Abs(($h,1)[!$h]) # choose a sheriff line, repeat $h times
}

}

@(
    ,(1,0)
    ,(0,1)
    ,(1,-1)
    ,(0,0)
    ,(1,1)
    ,(0,0)
    ,(-2,-1)
    ,(0,0)
    ,(2,2)
) | % {
    $w,$h = $_
    $r = &$f $w $h
    $r
}
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.