안녕! 저는 코드 골프 보안관입니다!


30

몇 달 전에 트위터를 사용한 사람이라면 누구나 'Howdy! 저는 X "밈의 보안관입니다. 간단한 보안관 이미지가 이모 지로 그려지고 테마에 맞게 변경됩니다. 그래서 코드 골프 보안관의 시간이라고 생각했습니다.

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

이것은 특히 하나의 문자 너비와 하나의 문자 높이 인 '픽셀'을 갖습니다. 그를 생성하기 위해 인수는 1과 1입니다.

만약 그가 키보다 넓다면 어떻게 될까요?

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

높이는 1이지만 너비는 2입니다.


규칙 :

  • 문제는 가능한 한 적은 문자로 코드 보안관을 작성하는 코드를 작성하는 것입니다.
  • 마음에 드는 프로그래밍 언어를 사용하십시오.
  • 코드는 보안관의 높이와 너비에 대해 정수인 두 가지 인수를 취해야합니다.
  • 출력은 배경을위한 단일 공백과 보안관을 위해 선택한 다른 문자로 구성되어야합니다. (테스트 사례에는 해시를 사용했지만 사용하는 것은 중요하지 않습니다).
  • 높이가 음의 정수가되어 이미지를 반전시킬 수 있어야합니다.
  • 너비는 음의 정수일 수 있지만 이미지는 대칭이므로 양수 값과 동일합니다.
  • 후행 공백은 관련이 없습니다.
  • 인수가 0이면 해당 차원은 단일 행 또는 열로 '평 평화'됩니다. 이 선의 길이는 보안관의 높이 또는 너비를 각각 곱한 다른 인수입니다.
  • 두 인수가 모두 0이면 두 줄 모두 '평면화'되어 단일 양수 문자가 남습니다.
  • 필수는 아니지만 tio.run 과 같은 온라인 통역사에 대한 링크를 포함하십시오.
  • 출력은 문자열이거나 여러 줄에 걸쳐 있거나 콘솔로 출력되어야합니다.

테스트 사례

1 높이, 1 너비

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

높이 2 개, 폭 1 개

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

1 높이, 2 너비

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

높이 2 개, 폭 2 개

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

높이 -1, 너비 1

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

높이 1, 너비 -1

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

높이 0, 너비 0

#

1 높이, 0 너비

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

높이 0, 너비 2

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

재미있게 보내세요!


1
이 도전은 저에게 반전 세계 소설을 상기시켜주었습니다 .
Charlie

관련 : ASCII 예술에서 옛 친구의 사진 (가변 규모; 반전 또는 평평하지 않음)
Luis Mendo

관찰 : 높이 1, 너비 2는 가장 인간적인 테스트 사례이지만, 그 중간에 호주를 응원해야합니다
Jo King

@JoKing 만약 그것들을 명명한다면, 나는 (-1, 1)을 '호주 (Australian)'로, (-1, 2)를 '현실 호주 (Realistic Australian)'로 정의 할 것입니다. 비록 ... 아마도 그것은 오해 될 수 있습니다.
AJFaraday

답변:


39

자바 스크립트 (ES6), 171 바이트

카레 구문으로 입력을 (width)(height)받습니다. 문자열 배열을 반환합니다.

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))||'#')

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

방법?

보안관의 왼쪽 절반 만 중간 열을 포함하여 이진 비트 마스크로 인코딩됩니다.

    ##.         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'

0x80y15(x,y)

' #'[                                  // 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
아무리 많은 답변을 게시하더라도 매번 감동을
받습니다

버전을 10 바이트 단축했습니다. 나는 그것을 내 자신의 것으로 게시할지 또는 당신의 것을 향상 시킬지 확실하지 않습니다. 광산은 당신에게서 영감을 얻어 거의 복제본처럼 보입니다. 그런데 좋은 생각 : D. 잘 했어!
ibrahim mahrir

... 10 바이트가 아닌 8 바이트.
:-P

@ibrahimmahrir 때로는 outgolfed개선 사이에 얇은 선이 있습니다. 따라서 그것은 당신에게 달려 있습니다. 구현이 충분히 다르다고 생각하면 별도의 답변으로 게시해도 전혀 신경 쓰지 않습니다.
Arnauld

2
@ibrahimmahrir 나는 본다. 나는 이것을 그대로 두는 것이 좋을 것이라고 생각한다. 귀하는 여전히 별도의 대체 버전으로 귀하를 게시 할 수 있습니다. 나도 괜찮아! (내 답변에 링크를 추가해야합니다.)
Arnauld

16

파이썬 (2) , 228 (218) 202 (189) 173 바이트

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'#']

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


대안 :

파이썬 2 , 173 바이트

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

펄 (5) , 169 (166) 157 바이트

@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;

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

약간의 약탈로 더 많은 것을 얻을 수 있습니다.


1
훌륭한 접근 방식! 나는 당신의 대답을 가지고 놀았으며 약간의 변경으로 당신은 꽤 많은 바이트를 절약 할 수 있습니다 : 온라인으로보십시오! 약간 다른 I / O와 몇 가지 트릭을 사용하여 요소를 재정렬하고 더 적은 바이트로 저장하는 것과 똑같은 접근법입니다! 필요한 경우 무엇이든 정교하게 작성하십시오!
Dom Hastings

에 대한 팁은 split지금 사용하고 있으며 2 바이트를 절약했습니다. 또한 '인덱스 주위 의을 잃어 버렸습니다 . say그래도 일할 수 없었습니다 .
Kjetil S.

또한 너비와 높이를 "무료로"얻기 위해 -a9 바이트를 잃었습니다.
Kjetil S.

전혀 문제 없습니다! 을 사용 say하도록 설정할 수 -M5.010있지만 모든 사람이 좋아하지는 않지만 -l대신 사용하고 유지할 수 print있지만 그렇지 않은 경우 리터럴 줄 바꿈 또는 $_.$/-1을 사용할 수 있습니다 . 다른 Perl 골퍼를 만나서 반갑습니다!
Dom Hastings

이것을 내버려 두지 않고 몇 가지 더 줄일 수있었습니다. say줄 바꿈이 추가되어 map약간 다른 호출이 필요 하기 때문에 개행이 작동하지 않았습니다 . 또한 코드가 변수로 끝나고 사용 중이 -p거나 다음을 @;포함 하여 사용할 수있는 것이 있음을 깨달았 습니다. 온라인으로 사용해보십시오! 내 의견이 마음에 들지 않기를 바랍니다!
Dom Hastings

7

, 61 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

NθNη

치수를 입력하십시오.

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

높이가 0이 아닌 경우 보안관의 오른쪽 절반을 반복합니다.

E↔θ

... 절대 높이 반복 횟수 ...

∨⭆ι×μ↔η#

... 너비가 0이 아닌 경우 각 문자를 절대 횟수만큼 반복하고, 그렇지 않으면 a #.

×#∨×⁵↔η¹

그러나 높이가 0이면 #절대 너비의 5 배 를 반복 하지만 적어도 1 을 반복 #합니다.

‖OO←∨↔η¹

보안관의 왼쪽 절반을 생산하십시오.

¿‹θ⁰‖↓

높이가 음수이면 보안관을 뒤집습니다.



3

클린 , 299 275 272 바이트

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]])

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


2

Powershell, 174170 바이트

Arnauld의 Javascript에서 영감을 얻음

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, 설명 및 테스트 스크립트 :

<#

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.