Howdy! Saya sheriff kode golf!

30

Kemungkinan siapa pun yang menggunakan Twitter beberapa bulan lalu akan tahu tentang 'Howdy! Saya sheriff meme X ". Di mana gambar sederhana sheriff digambar dengan emoji, dan perubahan agar sesuai tema. Jadi saya pikir sudah waktunya untuk Sheriff of Code Golf. Ini dia:

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

Yang satu ini khususnya memiliki 'piksel' yang lebar satu karakter, dan satu karakter tinggi. Untuk menghasilkannya, argumennya adalah 1 dan 1.

Bagaimana jika dia ingin lebih lebar dari tinggi?

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

Dia memiliki tinggi 1, tetapi lebar 2.


Aturan:

  • Tantangannya adalah menulis kode untuk menggambar Sheriff of Code Golf Anda sendiri, dengan karakter sesedikit mungkin.
  • Gunakan bahasa pemrograman apa pun yang diinginkan hati Anda.
  • Kode Anda harus mengambil dua argumen, yang keduanya bilangan bulat, untuk tinggi dan lebar Sheriff.
  • Outputnya harus terdiri dari spasi putih tunggal untuk latar belakang, dan karakter lain yang Anda pilih untuk Sheriff. (Saya telah menggunakan hash untuk kasus uji, tetapi tidak masalah apa yang Anda gunakan).
  • Seharusnya dimungkinkan untuk ketinggian menjadi bilangan bulat negatif, membalikkan gambar.
  • Lebar dapat berupa bilangan bulat negatif, tetapi karena gambarnya simetris, itu akan identik dengan nilai positifnya.
  • Mengejar ruang putih tidak relevan.
  • Jika salah satu argumen adalah 0, dimensi itu 'diratakan' menjadi satu baris atau kolom. Panjang garis ini adalah argumen lain yang dikalikan dengan tinggi, atau lebar Sheriff, masing-masing.
  • Jika kedua argumen adalah 0, kedua baris 'diratakan', meninggalkan karakter positif tunggal.
  • Tidak penting, tetapi harap sertakan tautan ke juru bahasa online seperti tio.run
  • Outputnya harus berupa string, lebih dari beberapa baris, atau output ke konsol.

Uji Kasus

1 tinggi, 1 lebar

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

2 tinggi, 1 lebar

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

1 tinggi, 2 lebar

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

2 tinggi, 2 lebar

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

-1 tinggi, 1 lebar

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

1 tinggi, -1 lebar

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

0 tinggi, 0 lebar

#

1 tinggi, 0 lebar

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

0 tinggi, 2 lebar

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

Bersenang-senanglah, kalian semua!

AJFaraday
sumber
1
Tantangan ini mengingatkan saya pada novel Inverted World .
Charlie
Terkait: Gambar seorang teman lama dalam seni ASCII (skala variabel; tidak ada inversi atau perataan)
Luis Mendo
Pengamatan: 1 tinggi, 2 lebar adalah yang terlihat paling manusiawi dari kasus uji, meskipun saya berkewajiban untuk mendukung Australia di tengahnya
Jo King
@JoKing Jika saya menamai mereka, saya pasti akan menyebut (-1, 1) sebagai 'Australia' dan (-1, 2) sebagai 'Realistis Australia'. Meskipun ... Mungkin itu bisa disalahpahami.
AJFaraday
Erat terkait
Digital Trauma

Jawaban:

39

JavaScript (ES6), 171 byte

Mengambil input dalam sintaks currying (width)(height). Mengembalikan array string.

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

Cobalah online!

Bagaimana?

Hanya separuh kiri sheriff yang dikodekan sebagai bitary biner, termasuk kolom tengah:

    ##.         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
Arnauld
sumber
6
Tidak peduli berapa banyak jawaban yang Anda posting, saya terkesan setiap saat ..
Kevin Cruijssen
Saya telah mempersingkat versi Anda sebesar 10 byte. Saya tidak yakin apakah mempostingnya sebagai milik saya atau hanya untuk meningkatkan milik Anda. Milik saya menarik inspirasi dari Anda sehingga terlihat hampir seperti duplikat. Omong-omong pemikiran bagus: D. Kerja bagus!
ibrahim mahrir
... dengan 8 byte bukan 10. :-P
ibrahim mahrir
@ibrahimmahrir Terkadang, ada garis tipis antara kalah bersaing dan lebih baik . Jadi terserah kamu. Jika Anda menganggap implementasi Anda cukup berbeda, saya tidak keberatan sama sekali jika Anda mempostingnya sebagai jawaban terpisah.
Arnauld
2
@ibrahimmahrir, begitu. Saya pikir saya lebih baik membiarkan yang satu ini apa adanya. Anda masih dapat memposting milik Anda sebagai versi alternatif yang terpisah. Tidak masalah dengan saya! (Saya akan pastikan untuk menambahkan tautan dalam jawaban saya.)
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'#']

Cobalah online!


Alternatif:

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'#']
TFeld
sumber
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;

Cobalah online!

Mungkin lebih banyak yang bisa diperoleh dengan sedikit mengutak-atik.

Kjetil S.
sumber
1
Pendekatan hebat! Saya telah bermain dengan jawaban Anda dan dengan beberapa perubahan Anda dapat menyimpan beberapa byte: Cobalah secara online! Ini persis pendekatan yang sama hanya menggunakan I / O yang sedikit berbeda dan beberapa trik untuk menyusun ulang elemen dan menyimpannya dengan byte lebih sedikit! Senang menguraikan apa pun jika perlu!
Dom Hastings
Terima kasih atas tipnya split, saya menggunakannya sekarang dan menyimpan dua byte. Juga mencukur habis dengan menghilangkan 's di sekitar indeks. Tidak bisa mulai saybekerja.
Kjetil S.
Terima kasih juga untuk mendapatkan lebar dan tinggi "gratis" dengan -a, kehilangan 9 byte lebih banyak dengan itu.
Kjetil S.
Tidak masalah sama sekali! Anda dapat mengaktifkan saydengan -M5.010, tetapi tidak semua orang suka, Anda dapat menggunakan -ldan menyimpannya print, tetapi jika tidak, Anda dapat menggunakan baris baru literal atau $_.$/untuk -1. Senang melihat pegolf Perl lain!
Dom Hastings
Tidak dapat meninggalkan ini sendirian dan berhasil mengurangi beberapa lagi. saytidak berfungsi karena baris baru ditambahkan di mapsehingga untuk menggunakannya memerlukan panggilan yang sedikit berbeda. Saya juga menyadari bahwa ketika kode Anda berakhir pada variabel dan Anda menggunakan -patau sesuatu yang dapat Anda gunakan @;karena itu termasuk: Cobalah secara online! Semoga Anda tidak keberatan dengan komentar saya!
Dom Hastings
7

Arang , 61 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

NθNη

Masukkan dimensi.

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

Jika tingginya bukan nol, lingkar di atas bagian kanan sheriff ...

E↔θ

... Mengulangi ketinggian absolut beberapa kali ...

∨⭆ι×μ↔η#

... jika lebarnya bukan nol maka ulangi setiap karakter jumlah absolut kali, jika tidak a #.

×#∨×⁵↔η¹

Tetapi jika tingginya nol, maka ulangi #5 kali lebar absolut, tetapi setidaknya 1 #.

‖OO←∨↔η¹

Merefleksikan untuk menghasilkan setengah bagian kiri sheriff.

¿‹θ⁰‖↓

Jika tingginya negatif, balikkan sheriff.

Neil
sumber
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]

Cobalah online!

Riff Pythonic pada pendekatan Arnauld .

Ugh! Sekarang berfungsi untuk semua kondisi tepi ...

Chas Brown
sumber
3

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

Cobalah online!

Suram
sumber
2

Powershell, 174 170 byte

Terinspirasi oleh 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])}

Tidak digabungkan, dijelaskan, dan diuji skrip:

<#

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
}
mazzy
sumber