ハウディ!私はコードゴルフの保安官です!


30

数か月前にTwitterを使った人なら誰でも、「ハウディ!私はX "ミームの保安官です。保安官のシンプルなイメージが絵文字で描かれ、テーマに合わせて変化します。だから、コードゴルフの保安官の時間だと思いました。

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

特にこれには、幅が1文字、高さが1文字の「ピクセル」があります。彼を生成するには、引数は1と1になります。

彼が背が高いよりも広くなるとどうなりますか?

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

彼の身長は1ですが、幅は2です。


ルール:

  • 課題は、可能な限り少ない文字数で、独自のコードゴルフの保安官を描くコードを書くことです。
  • あなたの心が望むプログラミング言語を使用してください。
  • コードは、保安官の高さと幅に対して2つの引数(両方とも整数)を取る必要があります。
  • 出力は、背景用の単一の空白と、保安官用に選択したその他の文字で構成する必要があります。(テストケースにはハッシュを使用しましたが、何を使用してもかまいません)。
  • 高さが負の整数で、画像を反転させることが可能であるべきです。
  • 幅は負の整数でもかまいませんが、画像は対称的であるため、正の値と同じになります。
  • 末尾の空白は関係ありません。
  • いずれかの引数が0の場合、その次元は単一の行または列に「フラット化」されます。この行の長さは、他の引数に保安官の高さまたは幅をそれぞれ掛けたものです。
  • 両方の引数が0の場合、両方の行が「フラット化」され、単一の正の文字が残ります。
  • 必須ではありませんが、tio.runなどのオンライン通訳へのリンクを含めてください
  • 出力は、複数行にわたる文字列、またはコンソールへの出力でなければなりません。

テストケース

高さ1、幅1

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

高さ2、幅1

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

高さ1、幅2

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

高さ2、幅2

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

高さ-1、幅1

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

高さ1、幅-1

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

高さ0、幅0

#

高さ1、幅0

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

高さ0、幅2

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

楽しんでください!


1
この挑戦は、逆世界の小説を思い出させました。
チャーリー

関連:ASCIIアートの古い友人の写真(可変スケール、反転または平坦化なし)
ルイスメンドー

観察:テストケースの中で最も人間に近いのは高さ1、幅2です。ただし、途中でオーストラリア人を応援する義務があります
ジョーキング

@JoKing名前を付けた場合、(-1、1)を「オーストラリア」、(-1、2)を「リアルなオーストラリア」と定義します。しかし...おそらくそれは誤解される可能性があります。
AJFaraday

回答:


39

JavaScript(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
、私は毎回感動していますあなたが投稿どのように多くの答えどんなに...
ケビンCruijssen

バージョンを10バイト短縮しました。それを自分のものとして投稿するのか、それとも単にあなたのものを強化するのかはわかりません。私のものはあなたのものからインスピレーションを得ているので、ほとんど同じように見えます。ちなみに素晴らしい思考:D。よくやった!
イブラヒムmahrir

... 10バイトではなく8バイトずつ。:-P
イブラヒムマハリール

@ibrahimmahrir時々、outgolfed改良の間には細い線があります。だから、それはあなた次第です。実装が十分に異なると思われる場合は、別の回答として投稿しても構いません。
アーナルド

2
@ibrahimmahrirなるほど。これをそのままにしておいた方がいいと思います。個別の代替バージョンとして自分のものを引き続き投稿できます。それは私でいいです!(答えにリンクを必ず追加します。)
アーナルド

16

パイソン2228の 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'#']

オンラインでお試しください!


代替案:

Python 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

パール5169の 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といくつかのトリックを使用して要素を並べ替えて、より少ないバイトで保存するというまったく同じアプローチです!必要に応じて何でも詳しく説明させていただきます。
ドムヘイスティングス

上のヒントのThxをsplit使用して、2バイト節約しました。また'、インデックスの周りのsを失うことにより、1つを削りました。sayしかし、仕事に着くことができませんでした。
KjetilS。18年

Thxは、「無料」で幅と高さを取得するために-a、さらに9バイトを失いました。
KjetilS。18年

全く問題無い!あなたは、有効にすることができsay-M5.010、誰もが、あなたが使用できるのが好きではない-l代わりにしておくprintが、ない場合は、リテラル改行を使用するか、することができます$_.$/について-1。別のPerlゴルファーに会えてうれしいです!
ドムヘイスティングス

これをそのままにしておくことはできず、さらにいくつか削減することができました。sayで改行が追加されたため、機能しませんでした。mapそれを使用するには、わずかに異なる呼び出しが必要です。また、コードが変数で終了し、それを含む-pように使用し@;ている、または使用できるものがあることにも気付きました。オンラインで試してみてください!私のコメントを気にしないでください!
ドムヘイスティングス

7

、61バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

NθNη

寸法を入力します。

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

高さがゼロでない場合、保安官の右半分をループします...

E↔θ

...絶対高さの回数を繰り返します...

∨⭆ι×μ↔η#

...幅がゼロ以外の場合、各文字を絶対回数繰り返します#。それ以外の場合はa です。

×#∨×⁵↔η¹

ただし、高さがゼロの場合は#、絶対幅の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、174 170バイト

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.