หมอตำแย! ฉันเป็นนายอำเภอของรหัสกอล์ฟ!


30

เป็นไปได้ว่าทุกคนที่ใช้ Twitter เมื่อสองสามเดือนก่อนจะรู้เกี่ยวกับ 'Howdy! ฉันเป็นนายอำเภอแห่ง X "meme ภาพวาดที่เรียบง่ายของนายอำเภอถูกวาดด้วยอิโมจิและการเปลี่ยนแปลงเพื่อให้เข้ากับธีมดังนั้นฉันคิดว่ามันถึงเวลาแล้วที่ Sheriff of Code Golf ที่นี่เขาอยู่:

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

โดยเฉพาะอันนี้มี 'พิกเซล' ซึ่งมีความกว้างหนึ่งอักขระและสูงหนึ่งตัว เพื่อสร้างเขาข้อโต้แย้งจะเป็น 1 และ 1

เกิดอะไรขึ้นถ้าเขาจะกว้างกว่าเขาสูง?

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

เขามีความสูง 1 แต่ความกว้าง 2


กฎ:

  • ความท้าทายคือการเขียนโค้ดเพื่อวาดนายอำเภอของ Code Golf ของคุณในจำนวนอักขระน้อยที่สุด
  • ใช้ภาษาการเขียนโปรแกรมใด ๆ ที่คุณต้องการ
  • รหัสของคุณควรมีอาร์กิวเมนต์สองตัวซึ่งทั้งคู่เป็นจำนวนเต็มสำหรับความสูงและความกว้างของนายอำเภอ
  • ผลลัพธ์ควรประกอบด้วยช่องว่างสีขาวเดียวสำหรับพื้นหลังและอักขระอื่น ๆ ที่คุณเลือกสำหรับนายอำเภอ (ฉันใช้แฮชสำหรับกรณีทดสอบ แต่ไม่สำคัญว่าคุณจะใช้อะไร)
  • มันควรจะเป็นไปได้สำหรับความสูงที่จะเป็นจำนวนเต็มลบลบภาพ
  • ความกว้างสามารถเป็นจำนวนเต็มลบได้ แต่เนื่องจากภาพมีความสมมาตรจึงจะเหมือนกับค่าบวก
  • ช่องว่างสีขาวต่อท้ายนั้นไม่เกี่ยวข้อง
  • หากอาร์กิวเมนต์ใดเป็น 0 มิตินั้นจะ 'แบน' เป็นแถวหรือคอลัมน์เดียว ความยาวของบรรทัดนี้คืออาร์กิวเมนต์อื่น ๆ คูณด้วยความสูงหรือความกว้างของนายอำเภอตามลำดับ
  • หากทั้งสองข้อโต้แย้งเป็น 0 ทั้งสองบรรทัดจะ 'แบน' ทำให้เหลืออักขระตัวเดียว
  • ไม่จำเป็น แต่โปรดรวมลิงก์ไปยังล่ามออนไลน์เช่นtio.run
  • เอาต์พุตควรเป็นสตริงมากกว่าหลายบรรทัดหรือเอาต์พุตไปยังคอนโซล

กรณีทดสอบ

1 สูง 1 กว้าง

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

2 สูง 1 กว้าง

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

1 สูง 2 กว้าง

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

2 สูง 2 กว้าง

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

-1 สูง 1 กว้าง

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

1 สูง -1 กว้าง

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

0 สูง 0 กว้าง

#

1 สูง 0 กว้าง

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

0 สูง 2 กว้าง

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

ขอให้สนุกนะ!


1
ความท้าทายนี้ทำให้ฉันนึกถึงนวนิยายInverted World
Charlie

ที่เกี่ยวข้อง: รูปภาพของเพื่อนเก่าในงานศิลปะ ASCII (ปรับขนาดได้ไม่ผกผันหรือแบนราบ)
Luis Mendo

การสังเกต: 1 สูง 2 กว้างเป็นรูปลักษณ์ที่ดูเป็นมนุษย์มากที่สุดในกรณีทดสอบถึงแม้ว่าฉันจะต้องเป็นกำลังใจให้ชาวออสเตรเลียอยู่ตรงกลาง
โจคิง

@ โจกิ้งถ้าฉันตั้งชื่อพวกเขาฉันก็จะมี (-1, 1) ว่า 'Australian' และ (-1, 2) เป็น 'Australian Australian' แม้ว่า ... บางทีนั่นอาจจะเข้าใจผิด
AJFaraday

คำตอบ:


39

JavaScript (ES6), 171 ไบต์

(width)(height)จะเข้าในไวยากรณ์ currying ส่งคืนอาร์เรย์ของสตริง

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

ลองออนไลน์!

อย่างไร?

เฉพาะครึ่งทางซ้ายของนายอำเภอเท่านั้นที่ถูกเข้ารหัสเป็นไบนารี bitmasks รวมถึงคอลัมน์กลาง:

    ##.         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
ไม่ว่าคุณจะโพสต์ตอบไปเท่าไหร่ฉันก็ประทับใจทุกครั้ง ..
Kevin Cruijssen

ฉันย่อรุ่นของคุณลง 10 ไบต์ ฉันไม่แน่ใจว่าจะโพสต์เป็นของตัวเองหรือเพื่อปรับปรุงของคุณ ฉันได้รับแรงบันดาลใจจากคุณดังนั้นมันจึงดูเหมือนซ้ำกัน ความคิดที่ยอดเยี่ยมโดยวิธี: D เยี่ยมมาก!
อิบราฮิม mahrir

... คูณด้วย 8 ไบต์ไม่ใช่ 10 :-P
ibrahim mahrir

@ibrahimmahrir บางครั้งมีเส้นบาง ๆ ระหว่างoutgolfedและปรับปรุงให้ดีขึ้น ดังนั้นมันขึ้นอยู่กับคุณ หากคุณคิดว่าการนำไปใช้ของคุณนั้นแตกต่างออกไปฉันก็ไม่รังเกียจถ้าคุณโพสต์มันเป็นคำตอบที่แยกต่างหาก
Arnauld

2
@ibrahimmahrir ฉันเห็น ฉันคิดว่าฉันควรปล่อยให้เรื่องนี้ดีกว่านี้ คุณยังสามารถโพสต์ของคุณเป็นรุ่นอื่นได้ นั่นโอเคสำหรับฉัน! (ฉันต้องแน่ใจว่าได้เพิ่มลิงก์ในคำตอบของฉัน)
Arnauld

16

Python 2 , 228 218 202 189 173 ไบต์

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

ลองออนไลน์!


ทางเลือก:

Python 2 , 173 ไบต์

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 ไบต์

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

ลองออนไลน์!

อาจจะมากกว่านี้ได้โดยเล่นซอ


1
วิธีการที่ยอดเยี่ยม! ฉันได้เล่นกับคำตอบของคุณและมีการเปลี่ยนแปลงเล็กน้อยคุณสามารถบันทึกได้ไม่กี่ไบต์: ลองออนไลน์! มันเป็นวิธีการเดียวกันโดยใช้ I / O ที่แตกต่างกันเล็กน้อยและเทคนิคเล็กน้อยในการจัดลำดับองค์ประกอบใหม่และจัดเก็บให้น้อยลง! ยินดีที่จะอธิบายรายละเอียดเกี่ยวกับสิ่งต่างๆหากจำเป็น!
Dom Hastings

ขอบคุณสำหรับเคล็ดลับที่splitฉันใช้ตอนนี้และบันทึกสองไบต์ นอกจากนี้ยังโกนหนึ่งออกโดยการสูญเสีย's รอบดัชนี ไม่สามารถsayทำงานได้
Kjetil S.

ขอบคุณสำหรับความกว้างและความสูง "ฟรี" ด้วย-aหายไปอีก 9 ไบต์
Kjetil S.

ไม่มีปัญหาเลย! คุณสามารถเปิดใช้งานsayด้วย-M5.010แต่ไม่ใช่ทุกคนที่ชอบคุณสามารถใช้-lแทนและเก็บไว้printแต่ถ้าไม่คุณสามารถใช้ newline ตัวอักษรหรือ$_.$/สำหรับ -1 ดีใจที่ได้เห็นนักกอล์ฟ Perl คนอื่น!
Dom Hastings

ไม่สามารถละทิ้งสิ่งนี้เพียงลำพังและจัดการเพื่อลดได้อีกสองสามรายการ sayไม่ทำงานเนื่องจากมีการเพิ่มบรรทัดใหม่ในส่วนต่อท้ายmapเพื่อใช้งานทำให้จำเป็นต้องมีการโทรที่แตกต่างออกไปเล็กน้อย ฉันยังตระหนักว่าเมื่อรหัสของคุณสิ้นสุดลงในตัวแปรและคุณกำลังใช้-pหรือบางสิ่งที่คุณสามารถใช้ได้@;เนื่องจากมันรวมถึง: ลองออนไลน์! หวังว่าคุณจะไม่รังเกียจความคิดเห็นของฉัน!
Dom Hastings

7

ถ่าน , 61 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

NθNη

ใส่ขนาด

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

หากความสูงไม่ใช่ศูนย์ให้วนรอบครึ่งขวาของนายอำเภอ ...

E↔θ

... ซ้ำจำนวนความสูงแน่นอนซ้ำ ...

∨⭆ι×μ↔η#

... #ถ้าความกว้างจะไม่ใช่ศูนย์แล้วทำซ้ำตัวละครแต่ละตัวจำนวนที่แน่นอนของครั้งมิฉะนั้น

×#∨×⁵↔η¹

แต่ถ้าความสูงเป็นศูนย์แล้วทำซ้ำ#5 ครั้งความกว้างที่แน่นอน แต่อย่างน้อย #1

‖OO←∨↔η¹

สะท้อนการผลิตครึ่งซ้ายของนายอำเภอ

¿‹θ⁰‖↓

หากความสูงเป็นลบให้พลิกนายอำเภอ




2

Powershell, 174 170 ไบต์

แรงบันดาลใจจาก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])}

Ungolfed อธิบายและทดสอบสคริปต์:

<#

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.