Olá! Eu sou o xerife do código de golfe!

30

É provável que alguém que usou o Twitter alguns meses atrás saiba sobre o 'Howdy! Eu sou o xerife do meme X ". Onde uma imagem simples de um xerife é desenhada com emoji e muda para se ajustar a um tema. Então, pensei que estava na hora do xerife do Code Golf. Aqui está ele:

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

Este em particular possui 'pixels' com um caractere de largura e um caractere de altura. Para gerá-lo, os argumentos serão 1 e 1.

E se ele for mais largo do que alto?

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

Ele tem uma altura de 1, mas uma largura de 2.


Regras:

  • O desafio é escrever um código para desenhar o seu próprio xerife do Code Golf, com o menor número possível de caracteres.
  • Use qualquer linguagem de programação que seu coração desejar.
  • Seu código deve receber dois argumentos, sendo ambos inteiros, para a altura e largura do xerife.
  • A saída deve ser composta de espaços em branco únicos para o plano de fundo e quaisquer outros caracteres que você escolher para o xerife. (Eu usei hashes para os casos de teste, mas não importa o que você usa).
  • Deve ser possível que a altura seja um número inteiro negativo, invertendo a imagem.
  • A largura pode ser um número inteiro negativo, mas como a imagem é simétrica, será idêntica ao seu valor positivo.
  • Espaços em branco à direita são irrelevantes.
  • Se um dos argumentos for 0, essa dimensão será 'achatada' em uma única linha ou coluna. O comprimento dessa linha é o outro argumento multiplicado pela altura ou largura do xerife, respectivamente.
  • Se ambos os argumentos forem 0, ambas as linhas serão 'achatadas', deixando um único caractere positivo.
  • Não é essencial, mas inclua um link para um intérprete on-line, como tio.run
  • A saída deve ser uma sequência, em várias linhas, ou saída para o console.

Casos de teste

1 alto, 1 largo

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

2 de altura, 1 de largura

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

1 alto, 2 largo

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

2 altos, 2 largos

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

-1 de altura, 1 de largura

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

1 alto, -1 de largura

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

0 alto, 0 amplo

#

1 alta, 0 ampla

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

0 alto, 2 largo

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

Divirtam-se!

AJFaraday
fonte
1
Esse desafio me lembrou o romance Mundo Invertido .
2626 Charlie
Relacionados: Imagem de um velho amigo na arte ASCII (escalas variáveis; nenhuma inversão ou achatamento)
Luis Mendo
Observação: 1 de altura e 2 de largura é o aspecto mais humano dos casos de teste, embora eu seja obrigado a torcer pelo australiano no meio dele
Jo King
@JoKing Se eu os estivesse nomeando, definitivamente teria (-1, 1) como 'Australiano' e (-1, 2) como 'Realista Australiano'. Embora ... Talvez isso possa ser mal interpretado.
AJFaraday
Intimamente relacionada
Digital Trauma

Respostas:

39

JavaScript (ES6), 171 bytes

Recebe entrada na sintaxe de currying (width)(height). Retorna uma matriz de seqüências de caracteres.

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

Experimente online!

Quão?

Somente a metade esquerda do xerife é codificada como máscaras de bits binárias, incluindo a coluna do meio:

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

'3733317900134444'

0 0x80 0y15(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
Arnauld
fonte
6
Não importa quantas respostas você postar, estou impressionado cada vez ..
Kevin Cruijssen
Reduzi sua versão em 10 bytes. Não tenho certeza se devo publicá-lo como meu ou apenas melhorar o seu. A mina se inspira na sua e, portanto, parece quase uma duplicata. Grande pensamento a propósito: D. Bom trabalho!
ibrahim mahrir
... por 8 bytes não 10. :-P
ibrahim mahrir
@ibrahimmahrir Às vezes, há uma linha tênue entre superado e melhorado . Então a escolha é sua. Se você acha que sua implementação é diferente o suficiente, não me importo de publicá-la como uma resposta separada.
Arnauld 29/07
2
@ibrahimmahrir eu vejo. Acho melhor deixar como está. Você ainda pode postar o seu como uma versão alternativa separada. Tudo bem para mim! (Eu certifique-se de adicionar um link na minha resposta.)
Arnauld
16

Python 2 , 228 218 202 189 173 bytes

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

Experimente online!


Alternativas:

Python 2 , 173 bytes

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'#']
TFeld
fonte
8

Perl 5 , 169 166 157 bytes

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

Experimente online!

Talvez mais pudesse ser ganho com um pouco de brincadeira.

Kjetil S.
fonte
1
Ótima abordagem! Eu brinquei com sua resposta e, com algumas alterações, você pode economizar alguns bytes: Experimente online! É exatamente a mesma abordagem, usando E / S ligeiramente diferentes e alguns truques para reordenar elementos e armazená-los por menos bytes! Prazer em elaborar qualquer coisa, se necessário!
Dom Hastings
Obrigado pela dica split, estou usando isso agora e salvei dois bytes. Também raspe um ao soltar os 's ao redor dos índices. Não foi possível começar saya trabalhar.
precisa
Thx também por obter largura e altura "de graça" com -a, perdeu mais 9 bytes com isso.
precisa
Não tem problema nenhum! Você pode ativar saycom -M5.010, mas nem todo mundo gosta, você pode usar -le manter print, mas, se não, você pode usar uma nova linha literal ou $_.$/para -1. É bom ver outro jogador de golfe Perl!
Dom Hastings
Não foi possível deixar isso em paz e conseguiu reduzir em mais alguns. saynão estava funcionando porque a nova linha foi anexada ao mapmodo de uso que requer uma ligação um pouco diferente. Também percebi que quando seu código termina em uma variável e você está usando -pou algo que pode ser usado @;, inclui: Experimente online! Espero que você não se importe com os meus comentários!
Dom Hastings
7

Carvão , 61 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

NθNη

Insira as dimensões.

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

Se a altura for diferente de zero, passe pela metade direita do xerife ...

E↔θ

... repetindo o número absoluto de altura várias vezes ...

∨⭆ι×μ↔η#

... se a largura for diferente de zero, repita cada caractere o número absoluto de vezes, caso contrário a #.

×#∨×⁵↔η¹

Mas se a altura for zero, repita #5 vezes a largura absoluta, mas pelo menos 1 #.

‖OO←∨↔η¹

Reflita para produzir a metade esquerda do xerife.

¿‹θ⁰‖↓

Se a altura for negativa, vire o xerife.

Neil
fonte
4

Python 2 , 217 216 bytes

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]

Experimente online!

Um riff Pythonic na abordagem de Arnauld .

Ugh! Agora funciona para todas as condições de borda ...

Chas Brown
fonte
3

Limpo , 299 275 272 bytes

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

Experimente online!

Furioso
fonte
2

Powershell, 174 170 bytes

Inspirado pelo Javascript de 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, explicado e teste com script:

<#

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
}
confuso
fonte