Naber! Ben kod golfün şerifiyim!


30

Birkaç ay önce Twitter'ı kullanan herkesin 'Howdy! Ben X "mem'in şerifiyim. Bir şerifin basit bir görüntüsünün emoji ile çizildiği ve bir temaya uyacak şekilde değiştiği yerde. Kod Golf Şerifi'nin zamanı geldiğini düşündüm.

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

Özellikle bu, bir karakter genişliğinde ve bir karakter yüksekliğinde olan 'piksellere' sahiptir. Onu üretmek için, argümanlar 1 ve 1 olacaktır.

Ya boyundan daha genişse?

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

Boyu 1, genişliği 2'dir.


Kurallar:

  • Buradaki zorluk mümkün olan en az sayıda karakterle kendi Şerif Kod Golf'ünü çizmek için kod yazmak.
  • Kalbinin istediği herhangi bir programlama dilini kullanın.
  • Kodunuz Şerifin yüksekliği ve genişliği için ikisi de tam sayı olan iki argüman almalıdır.
  • Çıktı, arka plan için tek beyaz boşluklardan ve Şerif için seçtiğiniz diğer karakterlerden oluşmalıdır. (Test durumları için hashe kullandım, fakat ne kullandığınız önemli değil).
  • Görüntüyü ters çevirerek yüksekliğin negatif bir tam sayı olması mümkün olmalıdır.
  • Genişlik negatif bir tamsayı olabilir, ancak görüntü simetrik olduğu için pozitif değeriyle aynı olacaktır.
  • İzleyen beyaz boşluklar önemsiz.
  • Her iki bağımsız değişken de 0 ise, bu boyut tek bir satır veya sütuna 'düzleştirilir'. Bu çizginin uzunluğu, sırasıyla Şerifin yüksekliği veya genişliği ile çarpılan diğer argümandır.
  • Her iki argüman 0 ise, her iki satır da tek bir pozitif karakter bırakarak 'düzleştirilmiştir.
  • Önemli değil, ancak lütfen tio.run gibi çevrimiçi bir tercümanın bağlantısını ekleyin
  • Çıktı bir dize olmalı, birden çok satır üzerinden ya da konsola çıktı olarak alınmalıdır.

Test Kılıfları

1 yüksek, 1 geniş

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

2 yüksek, 1 geniş

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

1 yüksek, 2 geniş

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

2 yüksek, 2 geniş

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

-1 yüksek, 1 geniş

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

1 yüksek, -1 geniş

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

0 yüksek, 0 geniş

#

1 yüksek, 0 geniş

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

0 yüksek, 2 geniş

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

Hepinize iyi eğlenceler!


1
Bu meydan okuma bana Inverted World romanını hatırlattı .
Charlie,

Related: ASCII sanatındaki eski bir dostun resmi (değişken ölçekler; ters çevirme veya yassılaşma yok)
Luis Mendo

Gözlem: 1 yüksek, 2 geniş, test vakalarının en insan görünüşüdür, ancak bunun ortasında Avustralya’yı neşelendirmek zorunda kalıyorum
Jo King

@JoKing Onları isimlendirirsem, (-1, 1) 'Avustralya' ve (-1, 2) 'Gerçekçi Avustralya' olarak tanımlarım. Her ne kadar ... Belki bu yanlış anlaşılabilir.
AJFaraday

Yanıtlar:


39

JavaScript (ES6), 171 bytes

Tımar sözdiziminde girişi Alır (width)(height). Bir dizi dizeyi döndürür.

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

Çevrimiçi deneyin!

How?

Şerifin yalnızca sol yarısı, orta sütun da dahil olmak üzere ikili bit maskesi olarak kodlanır:

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

Çünkü sadece iki değer daha büyük 9 ve ikisi de eşit 17ile değiştirebiliriz 0 in order to have one character per row and still have a rather straightforward decoding process. Hence the packed string:

'3733317900134444'

For 0x8 and 0y15, the 'pixel' at (x,y) is given by:

' #'[                                  // 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
No matter how many answers you post, I'm impressed every single time..
Kevin Cruijssen

I've shortened your version by 10 bytes. I'm not sure whether to post it as my own or to just enhance yours. Mine draws inspiration from yours so it looks almost as a duplicate. Great thinking by the way :D. Good job!
ibrahim mahrir

... by 8 bytes not 10. :-P
ibrahim mahrir

@ibrahimmahrir Sometimes, there's a thin line between outgolfed and improved. So, it's up to you. If you think your implementation is different enough, I don't mind at all if you post it as a separate answer.
Arnauld

2
@ibrahimmahrir I see. I think I'd better let this one as-is. You can still post yours as a separate alternate version. That's fine with me! (I'd make sure to add a link in my answer.)
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'#']

Try it online!


Alternatives:

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;

Try it online!

Maybe more could be gained by bit fiddling.


1
Great approach! I've played with your answer and with a few changes you can save quite a few bytes: Try it online! It's exactly the same approach just using slightly different I/O and a few tricks to reorder elements and store them for fewer bytes! Happy to elaborate on anything if needed!
Dom Hastings

Thx for the tip on split, I'm using that now and saved two bytes. Also shaved one off by loosing the 's around the indexes. Couldn't get say to work though.
Kjetil S.

Thx also for getting width and height "for free" with -a, lost 9 more bytes with that.
Kjetil S.

No problem at all! You can enable say with -M5.010, but not everyone likes to, you could use -l instead and keep print, but if not, you can use a literal newline or $_.$/ for -1. Nice to see another Perl golfer!
Dom Hastings

Couldn't leave this alone and managed to reduce by a few more. say wasn't working because the newline was appended in the map so to use it necessitates a slightly different call. I also realised that when your code ends in a variable and you're using -p or something you can use @; as it includes that: Try it online! Hope you don't mind my comments!
Dom Hastings

7

Charcoal, 61 bytes

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

Try it online! Link is to verbose version of code. Explanation:

NθNη

Input the dimensions.

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

If the height is nonzero, loop over the the right half of the sheriff...

E↔θ

... repeating the absolute height number of times...

∨⭆ι×μ↔η#

... if the width is nonzero then repeating each character the absolute number of times, otherwise a #.

×#∨×⁵↔η¹

But if the height is zero, then repeat # 5 times the absolute width, but at least 1 #.

‖OO←∨↔η¹

Reflect to produce the left half of the sheriff.

¿‹θ⁰‖↓

If the height is negative, flip the 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]

Try it online!

A Pythonic riff on Arnauld's approach.

Ugh! Now works for all edge conditions...


3

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

Try it online!


2

Powershell, 174 170 bytes

Inspired by 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, explained and test scripted:

<#

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.