Hola! Soy el sheriff del código golf!


30

Es probable que cualquiera que haya usado Twitter hace un par de meses conozca el '¡Hola! Soy el sheriff de X "meme. Donde una simple imagen de un sheriff se dibuja con emoji y cambia para adaptarse a un tema. Así que pensé que era hora del Sheriff de Code Golf. Aquí está:

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

Este en particular tiene 'píxeles' que tienen un carácter de ancho y un carácter de alto. Para generarlo, los argumentos serán 1 y 1.

¿Qué pasa si va a ser más ancho que alto?

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

Tiene una altura de 1, pero un ancho de 2.


Reglas:

  • El desafío es escribir código para dibujar su propio Sheriff de Code Golf, en la menor cantidad de caracteres posible.
  • Use cualquier lenguaje de programación que su corazón desee.
  • Su código debe tomar dos argumentos, los cuales son enteros, para la altura y el ancho del Sheriff.
  • La salida debe estar compuesta de espacios en blanco individuales para el fondo y cualquier otro personaje (s) que elija para el Sheriff. (He usado hashes para los casos de prueba, pero no importa lo que uses).
  • Debería ser posible que la altura sea un número entero negativo, invirtiendo la imagen.
  • El ancho puede ser un número entero negativo, pero como la imagen es simétrica, será idéntica a su valor positivo.
  • Los espacios en blanco finales son irrelevantes.
  • Si cualquiera de los argumentos es 0, esa dimensión se 'aplana' a una sola fila o columna. La longitud de esta línea es el otro argumento multiplicado por la altura o el ancho del Sheriff, respectivamente.
  • Si ambos argumentos son 0, ambas líneas se 'aplanan', dejando un solo carácter positivo.
  • No es esencial, pero incluya un enlace a un intérprete en línea como tio.run
  • La salida debe ser una cadena, a través de varias líneas, o salida a la consola.

Casos de prueba

1 alto, 1 ancho

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

2 de alto, 1 de ancho

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

1 alto, 2 ancho

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

2 de alto, 2 de ancho

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

-1 alto, 1 ancho

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

1 alto, -1 ancho

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

0 alto, 0 ancho

#

1 alto, 0 ancho

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

0 alto, 2 ancho

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

Que se diviertan!


1
Este desafío me ha recordado la novela del mundo invertido .
Charlie

Relacionado: Imagen de un viejo amigo en el arte ASCII (escalas variables; sin inversión ni aplanamiento)
Luis Mendo

Observación: 1 alto, 2 de ancho es el aspecto más humano de los casos de prueba, aunque estoy obligado a animar al australiano en el medio
Jo King

@JoKing Si los nombrara, definitivamente tendría (-1, 1) como 'Australiano' y (-1, 2) como 'Australiano realista'. Aunque ... Tal vez eso podría ser mal entendido.
AJFaraday

Respuestas:


39

JavaScript (ES6), 171 bytes

Toma entrada en la sintaxis de curry (width)(height). Devuelve una matriz de cadenas.

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

Pruébalo en línea!

¿Cómo?

Solo la mitad izquierda del sheriff está codificada como máscaras de bits binarias, incluida la columna central:

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

9 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

66
No importa cuántas respuestas publiques, estoy impresionado cada vez ..
Kevin Cruijssen

Acorté su versión en 10 bytes. No estoy seguro de si publicarlo como propio o simplemente mejorar el tuyo. El mío se inspira en el tuyo, por lo que parece casi un duplicado. Gran pensamiento por cierto: D. ¡Buen trabajo!
ibrahim mahrir

... por 8 bytes no 10.
:-P

@ibrahimmahrir A veces, hay una delgada línea entre superado y mejorado . Eso depende de ti. Si cree que su implementación es lo suficientemente diferente, no me importa en absoluto si la publica como una respuesta separada.
Arnauld

2
@ibrahimmahrir ya veo. Creo que será mejor que deje esto como está. Todavía puede publicar la suya como una versión alternativa separada. ¡Eso está bien para mí! (Me aseguraría de agregar un enlace en mi respuesta.)
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'#']

Pruébalo en línea!


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

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;

Pruébalo en línea!

Tal vez se podría ganar más jugando un poco.


1
Gran enfoque! He jugado con tu respuesta y con algunos cambios puedes guardar bastantes bytes: ¡ Pruébalo en línea! ¡Es exactamente el mismo enfoque con solo usar E / S ligeramente diferentes y algunos trucos para reordenar elementos y almacenarlos por menos bytes! ¡Feliz de elaborar cualquier cosa si es necesario!
Dom Hastings

Gracias por el consejo split, lo estoy usando ahora y ahorré dos bytes. También afeitó uno al perder la 's alrededor de los índices. Sin sayembargo, no pude llegar al trabajo.
Kjetil S.

Thx también para obtener ancho y alto "gratis" con -a, perdió 9 bytes más con eso.
Kjetil S.

¡No hay problema! Puede habilitar saycon -M5.010, pero no a todos les gusta, puede usar -len su lugar y mantener print, pero si no, puede usar una nueva línea literal o $_.$/para -1. ¡Qué bueno ver a otro golfista de Perl!
Dom Hastings

No podía dejar esto solo y logró reducirlo un poco más. sayno funcionaba porque la nueva línea se adjuntaba en el, mappor lo que para usarla se necesita una llamada ligeramente diferente. También me di cuenta de que cuando su código termina en una variable y está usando -palgo que puede usar, @;ya que incluye eso: ¡ Pruébelo en línea! Espero que no te molesten mis comentarios!
Dom Hastings

7

Carbón , 61 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

NθNη

Ingrese las dimensiones.

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

Si la altura no es cero, pase sobre la mitad derecha del sheriff ...

E↔θ

... repitiendo la altura absoluta el número de veces ...

∨⭆ι×μ↔η#

... si el ancho no es cero, repite cada carácter el número absoluto de veces, de lo contrario a #.

×#∨×⁵↔η¹

Pero si la altura es cero, repita #5 veces el ancho absoluto, pero al menos 1 #.

‖OO←∨↔η¹

Reflexiona para producir la mitad izquierda del sheriff.

¿‹θ⁰‖↓

Si la altura es negativa, voltea al sheriff.


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]

Pruébalo en línea!

Un riff pitón sobre el enfoque de Arnauld .

Ugh! Ahora funciona para todas las condiciones de borde ...


3

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

Pruébalo en línea!


2

Potencia Shell, 174 170 bytes

Inspirado por Arnauld's 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, explicado y probado con guión:

<#

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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.