Привет! Я шериф кодового гольфа!


30

Вполне вероятно, что любой, кто использовал Twitter пару месяцев назад, знал бы о «Привет! Я - мем «Шериф Х». Где простое изображение шерифа нарисовано с помощью эмодзи и меняется в соответствии с темой. Поэтому я подумал, что пришло время для Шерифа Код Гольфа. Вот он:

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

Этот, в частности, имеет «пиксели» шириной в один символ и высотой в один символ. Чтобы сгенерировать его, аргументы будут 1 и 1.

Что если он должен быть шире, чем высокий?

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

У него рост 1, а ширина 2.


Правила:

  • Задача состоит в том, чтобы написать код для рисования собственного шерифа Code Golf, используя как можно меньше символов.
  • Используйте любой язык программирования, какой пожелаете.
  • Ваш код должен принимать два аргумента, оба из которых являются целыми числами, для высоты и ширины шерифа.
  • Вывод должен состоять из одиночных пробелов для фона и любых других символов, выбранных вами для Шерифа. (Я использовал хэши для тестовых случаев, но не имеет значения, что вы используете).
  • Должно быть возможно, чтобы высота была отрицательным целым числом, инвертируя изображение.
  • Ширина может быть отрицательным целым числом, но поскольку изображение симметрично, оно будет идентично положительному значению.
  • Конечные пробелы не имеют значения.
  • Если один из аргументов равен 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'

0Икс80Y15(Икс,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. Отличная работа!
Ибрагим Махрир

... на 8 байтов не 10. :-P
Ибрагим Махрир

@ibrahimmahrir Иногда тонкая грань между outgolfed и улучшенным . Так что решать вам. Если вы думаете, что ваша реализация достаточно отличается, я совсем не против, если вы опубликуете ее как отдельный ответ.
Арно

2
@ibrahimmahrir я вижу. Я думаю, что лучше оставить все как есть. Вы по-прежнему можете публиковать свои как отдельную альтернативную версию. Я не против! (Я обязательно добавлю ссылку в свой ответ.)
Арнаулд

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
Отличный подход! Я поиграл с вашим ответом, и с некоторыми изменениями вы можете сэкономить немало байтов: попробуйте онлайн! Это точно такой же подход, только с использованием немного другого ввода / вывода и нескольких хитростей, чтобы переупорядочить элементы и сохранить их для меньшего количества байтов! Рад разработать что-нибудь, если это необходимо!
Дом Гастингс

Спасибо за подсказку split, я использую это сейчас и сохранил два байта. Также сбрил один, потеряв 's вокруг индексов. Не могу добраться sayдо работы, хотя.
Кжетил С.

Спасибо также за получение ширины и высоты "бесплатно" с -a , потеряв при этом еще 9 байтов.
Кжетил С.

Совершенно никаких проблем! Вы можете включить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↔θ

... повторять абсолютную высоту количество раз ...

∨⭆ι×μ↔η#

... если ширина отлична от нуля, то повторять каждый символ абсолютное количество раз, в противном случае # .

×#∨×⁵↔η¹

Но если высота равна нулю, то повторите #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])}

Разоблаченный, объясненный и проверенный сценарий:

<#

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
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.