Cześć! Jestem szeryfem golfa kodu!

30

Prawdopodobnie każdy, kto korzystał z Twittera kilka miesięcy temu, wiedziałby o „Howdy! Jestem memem szeryfa X ". Tam gdzie prosty rysunek szeryfa jest rysowany za pomocą emoji i zmienia się, aby pasować do tematu. Pomyślałem więc, że nadszedł czas na szeryfa z Code Golf. Oto on:

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

Ten w szczególności ma „piksele” o szerokości jednego znaku i wysokości jednego znaku. Aby go wygenerować, argumentami będą 1 i 1.

Co jeśli ma być szerszy niż wysoki?

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

Ma wysokość 1, ale szerokość 2.


Zasady:

  • Wyzwanie polega na napisaniu kodu w celu narysowania własnego szeryfa Code Golf, przy użyciu jak najmniejszej liczby postaci.
  • Używaj dowolnego języka programowania, jakiego pragnie twoje serce.
  • Twój kod powinien przyjmować dwa argumenty, z których oba są liczbami całkowitymi, dla wysokości i szerokości szeryfa.
  • Wynik powinien składać się z pojedynczych białych spacji dla tła i każdej innej postaci, którą wybierzesz dla szeryfa. (Użyłem skrótów dla przypadków testowych, ale nie ma znaczenia, z czego korzystasz).
  • Wysokość powinna być ujemną liczbą całkowitą, która odwraca obraz.
  • Szerokość może być ujemną liczbą całkowitą, ale ponieważ obraz jest symetryczny, będzie identyczny z wartością dodatnią.
  • Końcowe białe znaki są nieistotne.
  • Jeśli jeden z argumentów wynosi 0, wymiar ten jest „spłaszczany” do pojedynczego wiersza lub kolumny. Długość tej linii jest drugim argumentem pomnożonym odpowiednio przez wysokość lub szerokość szeryfa.
  • Jeśli oba argumenty mają wartość 0, obie linie są „spłaszczone”, pozostawiając pojedynczy znak dodatni.
  • Nie jest to konieczne, ale proszę dołączyć link do tłumacza online, takiego jak tio.run
  • Dane wyjściowe powinny być ciągiem złożonym z wielu wierszy lub wyjściem do konsoli.

Przypadki testowe

1 wysoka, 1 szeroka

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

2 wysokie, 1 szeroki

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

1 wysoka, 2 szerokie

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

2 wysokie, 2 szerokie

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

-1 wysoka, 1 szeroka

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

1 wysoka, -1 szeroka

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

0 wysoka, 0 szeroka

#

1 wysoka, 0 szeroka

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

0 wysoka, 2 szerokie

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

Bawcie się dobrze!

AJFaraday
źródło
1
To wyzwanie przypomniało mi powieść Odwrócony świat .
Charlie
Powiązane: Zdjęcie starego przyjaciela w sztuce ASCII (zmienne skale; bez inwersji lub spłaszczania)
Luis Mendo
Obserwacja: 1 wysoki, 2 szeroki jest najbardziej ludzkim wyglądem przypadków testowych, chociaż jestem zmuszony kibicować Australijczykowi w środku
Jo King
@JoKing Gdybym je nazywał, zdefiniowałbym (-1, 1) jako „Australijczyk” i (-1, 2) jako „Realistyczny Australijczyk”. Chociaż ... Być może to może być źle zrozumiane.
AJFaraday
Ściśle związany
Cyfrowa trauma

Odpowiedzi:

39

JavaScript (ES6), 171 bajtów

Pobiera dane wejściowe w składni curry (width)(height). Zwraca tablicę ciągów.

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

Wypróbuj online!

W jaki sposób?

Tylko lewa połowa szeryfa jest zakodowana jako binarne maski bitowe, w tym środkowa kolumna:

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

Ponieważ istnieją tylko dwie wartości większe niż i obie są równe , możemy zastąpić je , aby mieć jeden znak na wiersz i nadal mieć dość prosty proces dekodowania. Stąd pakowany ciąg:17 09170

'3733317900134444'

Dla i „piksel” w jest określony przez:0 y 15 ( x , y )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
źródło
6
Bez względu na liczbę odpowiedzi, które publikujesz, jestem pod wrażeniem za każdym razem ..
Kevin Cruijssen
Skróciłem twoją wersję o 10 bajtów. Nie jestem pewien, czy opublikować go jako swój własny, czy po prostu ulepszyć swój. Mój czerpie inspirację z twojego, więc wygląda prawie jak duplikat. Nawiasem mówiąc, świetne myślenie: D. Dobra robota!
ibrahim mahrir
... o 8 bajtów nie 10. :-P
ibrahim mahrir
@ibrahimmahrir Czasami istnieje cienka granica między outgolfem a ulepszonym . Więc to zależy od ciebie. Jeśli uważasz, że Twoja implementacja jest wystarczająco inna, nie mam nic przeciwko, jeśli opublikujesz ją jako osobną odpowiedź.
Arnauld
2
@ibrahimmahrir Rozumiem. Myślę, że powinienem pozwolić, żeby ten był taki, jaki jest. Nadal możesz opublikować swoją jako osobną alternatywną wersję. Dla mnie w porządku! (Chciałbym dodać link do mojej odpowiedzi.)
Arnauld,
16

Python 2 , 228 218 202 189 173 bajtów

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

Wypróbuj online!


Alternatywy:

Python 2 , 173 bajtów

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
źródło
8

Perl 5 , 169 166 157 bajtów

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

Wypróbuj online!

Być może więcej można by zyskać na grzebieniach.

Kjetil S.
źródło
1
Świetne podejście! Grałem z twoją odpowiedzią i przy kilku zmianach możesz zaoszczędzić sporo bajtów: Wypróbuj online! To dokładnie to samo podejście, używając nieco innych I / O i kilku sztuczek, aby zmienić kolejność elementów i przechowywać je dla mniejszej liczby bajtów! W razie potrzeby chętnie omówię wszystko!
Dom Hastings,
Dzięki za wskazówkę split, używam tego teraz i zapisałem dwa bajty. Ogoliłem także jednego, tracąc 's wokół indeksów. Nie mogłem jednak zabrać się saydo pracy.
Kjetil S.
Dzięki za uzyskanie szerokości i wysokości „za darmo” z tym -astraciłem jeszcze 9 bajtów.
Kjetil S.,
Żaden problem! Możesz włączyć za saypomocą -M5.010, ale nie wszystkim się to podoba, możesz użyć -lzamiast tego i zachować print, ale jeśli nie, możesz użyć dosłownego nowego wiersza lub $_.$/dla -1. Miło widzieć kolejnego golfisty Perla!
Dom Hastings,
Nie mogłem tego zostawić w spokoju i udało mi się zmniejszyć o kilka innych. saynie działał, ponieważ nowy wiersz został dołączony do, mapwięc użycie go wymaga nieco innego wywołania. Uświadomiłem sobie również, że kiedy Twój kod kończy się na zmienną i używasz -plub możesz użyć, @;ponieważ zawiera: Wypróbuj online! Mam nadzieję, że nie masz nic przeciwko moim komentarzom!
Dom Hastings,
7

Węgiel drzewny , 61 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

NθNη

Wprowadź wymiary.

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

Jeśli wysokość jest różna od zera, należy owinąć prawą połowę szeryfa ...

E↔θ

... powtarzając absolutną liczbę razy ...

∨⭆ι×μ↔η#

... jeśli szerokość jest różna od zera, to powtarzaj każdy znak bezwzględną liczbę razy, w przeciwnym razie a #.

×#∨×⁵↔η¹

Ale jeśli wysokość wynosi zero, powtórz #5 razy szerokość bezwzględną, ale co najmniej 1 #.

‖OO←∨↔η¹

Zastanów się nad produkcją lewej połowy szeryfa.

¿‹θ⁰‖↓

Jeśli wysokość jest ujemna, odwróć szeryfa.

Neil
źródło
4

Python 2 , 217 216 bajtów

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]

Wypróbuj online!

Pytoniczny riff o podejściu Arnaulda .

Ugh! Teraz działa dla wszystkich warunków brzegowych ...

Chas Brown
źródło
3

Czysty , 299 275 272 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
2

PowerShell, 174 170 bajtów

Zainspirowany Javascriptem Arnaulda

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

Nieskluczone, wyjaśnione i przetestowane skrypty:

<#

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
źródło