Salve! Sono lo sceriffo del codice golf!


30

È probabile che chiunque abbia usato Twitter un paio di mesi fa sia a conoscenza di "Howdy! Sono lo sceriffo del meme X. Dove una semplice immagine di uno sceriffo è disegnata con emoji e cambia per adattarsi a un tema. Quindi ho pensato che fosse il momento per lo sceriffo di Code Golf. Eccolo:

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

Questo in particolare ha "pixel" che sono larghi un carattere e alti un carattere. Per generarlo, gli argomenti saranno 1 e 1.

E se dovesse essere più largo di quanto sia alto?

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

Ha un'altezza di 1, ma una larghezza di 2.


Regole:

  • La sfida è scrivere codice per disegnare il tuo sceriffo di Code Golf, nel minor numero possibile di personaggi.
  • Usa qualsiasi linguaggio di programmazione desiderato dal tuo cuore.
  • Il tuo codice dovrebbe prendere due argomenti, entrambi interi, per l'altezza e la larghezza dello sceriffo.
  • L'output dovrebbe essere composto da singoli spazi bianchi per lo sfondo e da tutti gli altri personaggi scelti per lo sceriffo. (Ho usato gli hash per i casi di test, ma non importa cosa usi).
  • Dovrebbe essere possibile che l'altezza sia un numero intero negativo, invertendo l'immagine.
  • La larghezza può essere un numero intero negativo, ma poiché l'immagine è simmetrica, sarà identica al suo valore positivo.
  • Gli spazi bianchi finali sono irrilevanti.
  • Se uno dei due argomenti è 0, quella dimensione viene "appiattita" su una singola riga o colonna. La lunghezza di questa linea è l'altro argomento moltiplicato per l'altezza o la larghezza dello sceriffo, rispettivamente.
  • Se entrambi gli argomenti sono 0, entrambe le righe vengono "appiattite", lasciando un singolo carattere positivo.
  • Non essenziale, ma si prega di includere un collegamento a un interprete online come tio.run
  • L'output deve essere una stringa, su più righe o output sulla console.

Casi test

1 alto, 1 largo

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

2 alti, 1 largo

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

1 alto, 2 largo

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

2 alti, 2 larghi

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

-1 alto, 1 largo

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

1 alto, -1 largo

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

0 alto, 0 largo

#

1 alto, 0 largo

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

0 alto, 2 largo

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

Buon divertimento a tutti!


1
Questa sfida mi ha ricordato il romanzo di Inverted World .
Charlie,

Correlati: foto di un vecchio amico nell'arte ASCII (scale variabili; nessuna inversione o appiattimento)
Luis Mendo,

Osservazione: 1 alto, 2 largo è l'aspetto più umano dei casi di test, anche se sono obbligato a tifare per l'australiano nel mezzo di esso
Jo King,

@JoKing Se li avessi nominati, avrei sicuramente (-1, 1) come "Australian" e (-1, 2) come "Realistic Australian". Anche se ... Forse questo potrebbe essere frainteso.
AJFaraday,

Risposte:


39

JavaScript (ES6), 171 byte

Accetta input nella sintassi del curry (width)(height). Restituisce una matrice di stringhe.

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

Provalo online!

Come?

Solo la metà sinistra dello sceriffo è codificata come maschere di bit binarie, inclusa la colonna centrale:

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

0x80y15(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

6
Non importa quante risposte
pubblichi

Ho abbreviato la tua versione di 10 byte. Non sono sicuro se pubblicarlo come mio o semplicemente migliorare il tuo. Il mio trae ispirazione dal tuo, quindi sembra quasi un duplicato. Ottimo pensiero a proposito: D. Buon lavoro!
Ibrahim Mahrir,

... di 8 byte non 10. :-P
ibrahim mahrir,

@ibrahimmahrir A volte, c'è una linea sottile tra superata e migliorata . Quindi dipende da te. Se pensi che la tua implementazione sia abbastanza diversa, non mi dispiace affatto se la pubblichi come una risposta separata.
Arnauld,

2
@ibrahimmahrir vedo. Penso che dovrei lasciarlo così com'è. Puoi comunque pubblicare i tuoi come versione alternativa separata. Per me va bene! (Mi assicurerei di aggiungere un link nella mia risposta.)
Arnauld,

16

Python 2 , 228 218 202 189 173 byte

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

Provalo online!


alternative:

Python 2 , 173 byte

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 byte

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

Provalo online!

Forse si potrebbe guadagnare di più giocando un po '.


1
Ottimo approccio! Ho giocato con la tua risposta e con alcune modifiche puoi salvare parecchi byte: provalo online! È esattamente lo stesso approccio usando semplicemente I / O leggermente diversi e alcuni trucchi per riordinare gli elementi e memorizzarli per meno byte! Felice di elaborare qualsiasi cosa, se necessario!
Dom Hastings,

Grazie per il suggerimento split, lo sto usando ora e ho salvato due byte. Anche rasato uno perdendo la 's attorno agli indici. Non riuscivo però saya lavorare.
Kjetil S.

Grazie anche per avere larghezza e altezza "gratis" con -a, perso 9 byte in più con quello.
Kjetil S.

Nessun problema! Puoi abilitare saycon -M5.010, ma non a tutti piace, puoi -linvece usare e mantenere print, ma in caso contrario puoi usare una nuova riga letterale o $_.$/per -1. Bello vedere un altro giocatore di golf Perl!
Dom Hastings,

Non potevo lasciarlo solo e sono riuscito a ridurne di qualche altro. saynon funzionava perché la nuova riga era stata aggiunta in mapmodo da utilizzarla richiede una chiamata leggermente diversa. Mi sono anche reso conto che quando il tuo codice termina in una variabile e stai usando -po qualcosa che puoi usare @;in quanto include quello: Provalo online! Spero non ti dispiaccia il mio commento!
Dom Hastings,

7

Carbone , 61 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

NθNη

Inserisci le dimensioni.

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

Se l'altezza è diversa da zero, avvolgi la metà destra dello sceriffo ...

E↔θ

... ripetendo il numero di altezza assoluto di volte ...

∨⭆ι×μ↔η#

... se la larghezza è diversa da zero, ripete ogni carattere il numero assoluto di volte, altrimenti a #.

×#∨×⁵↔η¹

Ma se l'altezza è zero, ripeti #5 volte la larghezza assoluta, ma almeno 1 #.

‖OO←∨↔η¹

Rifletti per produrre la metà sinistra dello sceriffo.

¿‹θ⁰‖↓

Se l'altezza è negativa, capovolgi lo sceriffo.


4

Python 2 , 217 216 byte

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]

Provalo online!

Un riff Pythonic sull'approccio di Arnauld .

Ugh! Ora funziona per tutte le condizioni del bordo ...


3

Pulito , 299 275 272 byte

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

Provalo online!


2

Powershell, 174 170 byte

Ispirato al Javascript di 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])}

Ungolf, spiegato e testato 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.