Добре! Я шериф кодового гольфу!


30

Цілком імовірно, що хтось, хто користувався Twitter пару місяців тому, дізнався б про "Зло! Я шериф мему X ". Де просте зображення шерифа намальовано емоджи і змінюється, щоб відповідати темі. Тому я подумав, що настав час шерифа з Кодечного гольфу. Ось він:

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

Цей, зокрема, має "пікселі", які мають один символ і високий один символ. Для його генерування аргументи будуть 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 байт

Здійснює введення в синтаксис 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'

0х80у15(х,у)

' #'[                                  // 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 Іноді між товщиною та покращеною тоненькою лінією є тонка грань . Отже, це залежить від вас. Якщо ви вважаєте, що ваша реалізація є досить різною, я не заперечую проти того, якщо ви розмістите це як окрему відповідь.
Арнольд

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
Чудовий підхід! Я грав з вашою відповіддю і за допомогою декількох змін ви можете зберегти досить багато байт: Спробуйте це в Інтернеті! Це абсолютно той самий підхід, просто використовуючи трохи різні введення / виведення та декілька хитрощів для впорядкування елементів та збереження їх на менше байтів! Раді детально розробити будь-що, якщо потрібно!
Дом Гастінгс

Thx для підказки split, я використовую це зараз і зберег два байти. Також поголився, скинувши 's навколо індексів. Не міг sayби працювати на роботі.
Kjetil S.

Thx також для отримання ширини та висоти "безкоштовно" за допомогою цього -aпрограла ще 9 байт.
Kjetil S.

Ніяких проблем взагалі! Ви можете ввімкнути функцію за 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 байт

Натхненний Javascript 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, пояснив і випробував сценарій:

<#

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.