你好!我是代码高尔夫的警长!


30

几个月前使用Twitter的任何人都有可能了解'Howdy!我是X“模因的警长。在那里,用表情符号绘制了一个简单的警长图像,并根据主题进行了更改。因此,我认为现在是Code Golf警长的时候了。在这里,他是:

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

特别地,该像素具有一个字符宽度为一个字符高度的“像素”。要生成他,参数将为1和1。

如果他要比他高个子该怎么办?

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

他的身高为1,但宽度为2。


规则:

  • 挑战在于编写代码以尽可能少的字符来绘制自己的“治安警长”。
  • 使用您内心渴望的任何编程语言。
  • 您的代码应为Sheriff的高度和宽度使用两个参数,这两个参数都是整数。
  • 输出应由单个空白空格作为背景,以及您为警长选择的任何其他字符。(我已经在测试用例中使用了哈希,但是使用什么都没有关系)。
  • 高度应为负整数,从而反转图像。
  • 宽度可以是负整数,但由于图像是对称的,因此它将等于其正值。
  • 尾随空格无关紧要。
  • 如果任一参数为0,则该维将“展平”为单个行或列。这条线的长度是另一个自变量分别乘以警长的高度或宽度。
  • 如果两个参数都为0,则两行都被“拉平”,只剩下一个正号。
  • 不是必需的,但请包括指向在线解释器的链接,例如tio.run
  • 输出应该是一个字符串,跨越多行,或者输出到控制台。

测试用例

1高​​1宽

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

2高1宽

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

1高​​2宽

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

2高2宽

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

-1高1宽

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

1高​​,-1宽

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

0高0宽

#

1高​​0宽

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

0高2宽

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

玩得开心,大家!


1
这一挑战使我想起了《倒置世界》小说。
查理

相关:ASCII艺术中的一位老朋友的图片(可变比例;无反转或变平)
Luis Mendo,

观察:1高2宽是测试用例中最人性化的外观,尽管我有义务为其中的澳大利亚人加油
Jo King

@JoKing如果要命名它们,则将(-1,1)定义为“ Australian”,将(-1,2)定义为“ Realistic Australian”。虽然...也许这可能会被误解。
AJFaraday

Answers:


39

JavaScript(ES6),171字节

以currying语法接受输入(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'

0X80ÿ15Xÿ

' #'[                                  // 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。做得好!
易卜拉欣·莫里尔

...由8个字节而不是10个字节组成::-P
易卜拉欣·莫里尔

@ibrahimmahrir有时,超越改进之间存在一条细线。因此,取决于您。如果您认为自己的实现方式与众不同,那么我根本不介意将其作为单独的答案发布。
Arnauld

2
@ibrahimmahrir我明白了。我想我最好还是这样。您仍然可以将其发布为单独的替代版本。这对我来说没问题!(我将确保在答案中添加一个链接。)
Arnauld

16

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

在线尝试!


备择方案:

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

Perl 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 '18

谢谢split,我现在正在使用它并保存了两个字节。还可以通过松散'索引周围的s来减少一个。say虽然不能上班。
Kjetil S.

Thx还用于“免费”获得宽度和高度-a,从而损失了9个字节。
Kjetil S.

没问题!您可以启用say-M5.010,但不是每个人都喜欢,你可以使用-l,而不是和保持print,但如果没有,你可以用字面换行符或$_.$/为-1。很高兴见到另一个Perl高尔夫球手!
Dom Hastings '18

不能离开这个,设法减少更多。say之所以不起作用,是因为在换行符后附加了换行符,map因此使用它需要稍有不同的调用。我还意识到,当您的代码以变量结尾并且正在使用时,-p或者可以使用的东西@;包括以下内容:在线尝试!希望你不介意我的评论!
Dom Hastings '18

7

木炭,61字节

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

在线尝试!链接是详细版本的代码。说明:

NθNη

输入尺寸。

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

如果高度不为零,则在警长的右半边循环...

E↔θ

重复绝对高度的次数

∨⭆ι×μ↔η#

...如果宽度不为零,则每个字符重复绝对次数,否则为#

×#∨×⁵↔η¹

但是,如果高度为零,则重复#绝对宽度的5倍,但至少为1 #

‖OO←∨↔η¹

反射产生警长的左半部分。

¿‹θ⁰‖↓

如果高度为负,则翻转警长。


4

Python 2中217个 216字节

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]

在线尝试!

关于Arnauld的方法的 Python式即兴之处

啊! 现在适用于所有边缘条件...


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

脱节,解释和测试脚本:

<#

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.