Na cześć Adama Westa


90

Adam West zmarł i chciałbym uhonorować jego pamięć tutaj na PPCG, choć wątpię, by wiedział o naszym istnieniu. Chociaż istnieje wiele, wiele różnych rzeczy, z których ten człowiek jest znany, żadna nie jest bardziej widoczna niż jego rola jako oryginalnego batmana. Zawsze będę pamiętał mojego ojczyma, który do dziś ogląda starego szkolnego Batmana i Robina. Wyzwanie to ma charakter uproszczony i wcale nie odpowiada skomplikowanemu człowiekowi, jakim był Adam West. Jest to jednak najlepsze, co mogłem wymyślić, ponieważ jest to najbardziej kultowy obraz kariery mężczyzny.


Chciałem to opublikować wcześniej, ale czekałem, aż ktoś wymyśli coś lepszego.


Wyprowadza następujące (z lub bez końcowych spacji / nowych linii):

           *                         *
       ****          *     *          ****
     ****            *******            ****
   ******            *******            ******
  *********         *********         *********
 ***********************************************
*************************************************
*************************************************
*************************************************
 ***********************************************
  *****       *********************       *****
    ****       ***    *****    ***       ****
       **       *      ***      *       **

To jest , wygra najniższa liczba bajtów.


7
Powinieneś zabronić zakodowanych ciągów. To naprawdę nie jest fajne!
sergiol,

7
Nie był oryginalnym Batmanem. Ten zaszczyt należy do Lewisa Wilsona.
Shaggy

42
Kiedy zobaczyłem tytuł, pomyślałem, że efektem będzie „na-na-na-na-na-na-na-na-na-na-na-na-na-na-na-na-na”.
D Krueger,

3
@DKrueger: niech tak będzie w innym pytaniu :)
Olivier Dulac

4
Dlaczego to się nie zaczęło w zeszłym roku? Carrie Fisher, Prince, David Bowie i Alan Rickman!
caird coinheringaahing

Odpowiedzi:


47

Galaretka , 44 bajty

“¡©İ'¹!ðkW>ṅṙẏṙlœf:ߌÆ@Ƥ’b25o99Jx$ị⁾ *s25ŒBY

Wypróbuj online!

Jak to działa

“¡©İ'¹!ðkW>ṅṙẏṙlœf:ߌÆ@Ƥ’

To jest literał liczbowy. Wszystkie znaki są zastępowane ich indeksami opartymi na 1 na stronie kodowej Jelly, wynik jest interpretowany jako podwójna liczba całkowita base-250, co daje

58616171447449697510361193418481584558895594063391402

Następnie b25przekonwertować całkowitą do podstawy 25 i o99zastępuje 0 do 99 , otrzymując

11 1 20 4 10 1 8 4 12 4 3 6 12 4 2 9 9 5 1 99 1 24 2 5 7 11 4 4 7 3 4 3 7 2 7 1 6 2

Jx$zastępuje j th bazowych 25 cyfr n z n kopii j , otrzymując

1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 7 7 7 7 7 7 7 7 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 15 15 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 18 18 18 18 18 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 24 24 24 24 24 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 29 29 29 30 30 30 31 31 31 31 32 32 32 33 33 33 33 33 33 33 34 34 35 35 35 35 35 35 35 36 37 37 37 37 37 37 38 38

Teraz ị⁾ *indeksuje się do pary znaków. Indeksowanie jest oparte na 1 i modułowe, więc liczby nieparzyste są zastępowane spacjami, nawet tymi z gwiazdkami. To daje

           *                    ****          *        ****            ****   ******            ****  *********         ***** *************************************************************************************************** ************************  *****       ***********    ****       ***    ***       **       *      **

s25dzieli wynik na kawałki o długości 25 . Jeśli napiszemy każdy fragment we własnej linii, otrzymamy

           *             
       ****          *   
     ****            ****
   ******            ****
  *********         *****
 ************************
*************************
*************************
*************************
 ************************
  *****       ***********
    ****       ***    ***
       **       *      **

Odbicie atom ŒBpalindromizes każda porcja przez dodanie odwróconą kopię bez jego pierwszej postaci, w wyniku czego otrzymano

           *                         *           
       ****          *     *          ****       
     ****            *******            ****     
   ******            *******            ******   
  *********         *********         *********  
 *********************************************** 
*************************************************
*************************************************
*************************************************
 *********************************************** 
  *****       *********************       *****  
    ****       ***    *****    ***       ****    
       **       *      ***      *       **       

Na koniec Ywprowadza rzeczywiste linie.


1
Pomyślałem, że “QƤḣọḲ£¿ẆịµñẒṢƊ¬ƒỤ2ỴÐ,ịṁ&Ḅ<ḋsḳn.⁷ṛḃṡ⁾6bḋeṁ’ṃ⁾ *s25ŒBYjest wystarczająco krótki, bo ma 53 bajty ...
Erik, Outgolfer,

Próbowałem 14 różnych rzeczy, ale w końcu doszedłem do tego metodą prób i błędów. Nie rozumiałem, co masz na myśli przez „zamienia 0 na 99”, dopóki sam tego nie spróbowałem.
Magic Octopus Urn

156

Wordfuck , 5761 2686 bajtów

Wydaje mi się, że użycie jego imienia jako kodu źródłowego sprawia Adamowi Westowi trochę honoru.

adam west adam west adam_wes t_a dam_we st_a dam_ west adam west adam west adam west_ad am_west_a dam_we st ad am we st ad am we st ad am west_a dam_we st_a dam_ west_ada m_w est ada m_w est ada m_west_ adam west_a dam_west_ adam_we st_ ad am_west ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am_wes t_ adam_w est_ adam west adam west adam west adam west adam we st_adam west_ad am we st ad am we st adam_w es t_ ad am west_ad am we st ad am we st ad am we st_ada m_ west_ad am we st ad am west_a da m_west_ ad am we st ad am we st ad am west_a da m_ we st adam_w es t_adam_ west_ad am we st ad am west_a da m_ we st adam_we st ad am we st ad am we st ad am we st_ada m_ we st ad am we st adam_we st ad am we st ad am we st ad am we st_ada m_ we st ad am_wes t_ adam_we st_adam we st ad am_wes t_ ad am we st ad am_west ad am we st ad am we st ad am we st adam_w es t_ ad am we st ad am_west ad am we st ad am we st ad am we st adam_w es t_ ad am we st adam_w es t_adam_ west_ad am we st_ada m_ we st ad am we st ad am west_ad am we st ad am we st ad am west_a da m_ we st ad am we st ad am_west ad am we st ad am we st ad am_wes t_ ad am we st ad am we st adam_w es t_adam_ west_ad am west_a da m_ we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st_ada m_ west_ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am west_a da m_west_ ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am_wes t_ adam_we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st adam_w es t_adam_ west_ad am west_a da m_ we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st ad am we st_ada m_ west_ad am_west ad am west_a da m_ we st ad am_west ad am we st ad am we st_ada m_ we st ad am we st ad am we st ad am we st ad am we st ad am west_ad am we st ad am we st adam_w es t_ ad am we st_ada m_ west_ad am_west ad am we st adam_w es t_ ad am west_ad am we st ad am we st adam_w es t_ ad am_west ad am we st adam_w es t_ ad am we st_adam we st ad am west_a da m_ we st_adam we st ad am we st ad am_wes t_ ad am we st_ada m_ west_ad am_west ad am we st ad am we st_ada m_ we st_adam we st ad am we st ad am_wes t_ adam_we st ad am we st ad am_wes t_ ad am west_ad am we st ad am we st_ada m_ west_ad am we st ad am we st adam_w es t!

Wypróbuj online! (transpiled brainfuck)

Adam West śpiewa (dzięki @carusocomputing)


69
To jest okropne. Kocham to.
TheWanderer

25
Hmm Tak. Całkiem dobrze, ale myślę, że zapomniałeś podkreślenia na linii 1.
Mateen Ulhaq

2
Czy istnieje sposób, aby to przetestować?
Shaggy

4
@Wilf witamy w PCCG! tak naprawdę nie konkurujemy na tej stronie, oczywiście nie jest to zwycięskie rozwiązanie, ale jest to zabawne i tematyczne, więc zyskuje aprobatę, aby więcej osób mogło z niego korzystać. Mam nadzieję, że niebawem zaopiniujesz twoje odpowiedzi!
Uriel

3
@Shaggy Wypróbuj online! (STDERR)
Adám

67

Python, 530 529 528 524 bajtów

import zlib as Holy
B=list("NNAAAnAAnnAnaAannnaaaaNaAAnNanAaAanNNaNNaNaanNNANanNNANaAnAaANANAAnAaANNnAanAaNnAaAANNAaAnNANAaaANNAanAaNaNNNAaNNanAAnNNnaaaNANANANnnaaaNaaAAAANaNaNaNAnNAAAAaaaaANAaNnnAaAaNAAaANNnaaNnNnaannaaAaananannNnAAAAAanAananANAnaAAnANAAaaaAaaanaaAAaanNAnanAAnnnANAnNAnnAnnnanaNNaaaNaNNaAAnNAaaANNNANAnAaaAaNaANnNNNaaAanaaaanaaaaaAaAaNnNnnaAnANaNnnANanNA")
A=dict(N='11',A='01',n='10',a='00')   
T=""
POP=BIFF=POW=OOF=lambda:A[B.pop()]
while B:T+=chr(int(POP()+POW()+BIFF()+OOF(),2))
print Holy.decompress(T)

5
O Panie, od dłuższego czasu nie śmiałem się tak mocno. NAanANANaNANaNAANnAnaNANanaNA
Magic Octopus Urn

9
W kodzie golfa, jesteśmy powinien dokonać liczyć bajt mały, ale twoja pozycja jest dość mocny . ;)
PM 2Pier.

34
Czasami trzeba poświęcić się dla większego dobra.
rrauenza

1
Brzmi jak coś, co powiedziałby Batman. ;) Muszę przyznać, że uważam to za B.pop(0)nieco irytujące. Dlaczego nie odwrócić B, abyś mógł używać znacznie wydajniejszego (i krótszego) B.pop()? pop(0)Musi przenieść wszystkie pozostałe elementy listy w dół jednym gnieździe. Jasne, dzieje się to z prędkością C, ale wciąż jest mniej wydajne niż wyskakiwanie z końca łańcucha.
PM 2,

5
Aliasy POP, BIFF, POW, OOFmnie wypluć co piłem na moim monitorze. Dzięki lol. +1.
rayryeng

21

JavaScript (ES6), 148 146 bajtów

_=>`n2zh2
f8l2b2l8
b8pep8
7cpepc
5ijiji
3yyq
0
0
0
3yyq
5afy8fa
98f69a96f8
f4f2d6d2f4`.replace(/./g,c=>'* '[(n=parseInt(c,36))&1].repeat(n/2||49))

Próbny


12

Python, 149 142 bajty

7 bajtów zapisanych dzięki @ PM2Ring

for l in"b1d 74a13 54c4 36c4 2995 1o 0p 0p 0p 1o 257b 447343 727162".split():x=''.join(s*int(k,36)for s,k in zip(' *'*3,l));print(x+x[-2::-1])

Miły. Możesz ogolić 7 bajtów:x=''.join(s*int(k,36)for s,k in zip(' *'*3,l))
PM 2Ring

Bez obaw. Udało mi się napisać jeszcze krótszą wersję Pythona. ;)
PM 2,

1
@ PM2Ring masz moją +1
Uriel

12

MATL , 61 59 bajtów

' *'60:'*u9|K9j[~F9R,>ejc4Q,7;F\1l_=7sFR'F11:ZaY"13e)25ZvZ)

Wypróbuj online!

Jak to działa

Wykorzystuje to następujące standardowe techniki:

  • Ponieważ obraz jest symetryczny w poziomie , tylko lewa połowa (łącznie ze środkową kolumną) jest kodowana.
  • Obraz jest zlinearyzowany w porządku głównym kolumny (w dół, a następnie w poprzek), a wynikowa sekwencja jest zakodowana na całej długości .
  • Wynikowe długości przebiegów przyjmują wartości od 1do 11, więc sekwencja długości przebiegów jest kompresowana przez konwersję zasad , z zasady 11na zasadę 94(drukowalne znaki ASCII z wyjątkiem pojedynczego cudzysłowu, który wymagałby ucieczki).

1
Istnieje 60 przebiegów w kolejności głównej, ale tylko 38 w kolejności rzędowej. Czy zaoszczędziłoby to jakieś bajty?
Dennis

@ Dennis Problem polega na tym, że w takim przypadku przebiegi są takie [1:12 20 24 99], co utrudnia kompresję. Moja najlepsza próba to 60 bajtów
Luis Mendo

Zamiast konstruowania dokładnego zestawu, próbowałeś po prostu użyć bazy 25 i zastąpić 0 99, np. Y|? Nie znam wystarczającej liczby bankomatów MATL, aby sprawdzić, czy jest on rzeczywiście krótszy ...
Dennis

@Dennis To wygląda obiecująco. Korzystanie z zestawu [1:24 99]I usunięty jeden bajt . Jeśli użyję [0:24](baza 25), nie wiem, jak zmienić 0się 99w kilka bajtów
Luis Mendo

1
Prawo Y|nie działa w MATL / Octave, tak jak w Jelly / Python. W tym ostatnim 0 or 99daje 99 ...
Dennis

7

05AB1E , 47 bajtów

„ *19×S•«M;Ó8ζ?èYÑ?½¨/Ž´.δòÈÖ<•25вт<19ǝ×J13ä€û»

Wypróbuj online!


Algorytm przeniesionego Dennisa, prawda?
Erik the Outgolfer

@EriktheOutgolfer: Pożyczył replace 99 trickod niego (zapisano 4 bajty na prostej drodze). Wciąż szukam lepszego sposobu.
Emigna

-1 używając .∞zamiast €û»(mirrory domyślnie łączą listy na nowych liniach najpierw w starszej wersji, przed zastosowaniem lustra). Próbowałem też używać ₂вzamiast 25в, ale niestety sprężonego całkowita jest następnie 1 bajt już tak dobrze, więc nie ma nic zapisać: •2Ø°×á[1∊Œ)’˜Àå<тIÞ‡p5ÉQ•₂в.
Kevin Cruijssen

7

vim, 168 156 bajtów

:nm N a <C-v><ESC>
:nm A a*<C-v><ESC>
:nm B aY<C-v><ESC>yyp!!rev<C-v><CR>kJh4xo<C-v><ESC>
11NA13NB7N4A10NA3NB5N4A12N4AB3N6A12N4AB2N9A9N5ABN24AB25ABkyyppjN24AB2N5A7N11AB4N4A7N3A4N3AB7N2A7NA6N2ABdd

To zakłada środowisko Unix rev. Używam dość prostego kodowania (liczenie, znak), przy czym N i A dołączają odpowiednio a i *odpowiednio, a B kopiuje i odwraca.

W rzeczywistym pliku wpisy w nawiasach są zastępowane literalnymi bajtami, które reprezentują. <C-v>to 0x16, <ESC>to 0x1b i <CR>to 0x0d.

Wypróbuj online


Myślę, że szybciej byłoby nie zawracać sobie głowy tworzeniem makr „b” i „c”, a zamiast tego bezpośrednio mapować je. :nm N a <C-v><esc>oraz:nm A a*<C-v><esc>
DJMcMayhem

@DJMcMayhem Tak się dzieje. Z jakiegoś powodu pomyślałem, że trudniej będzie przechowywać <C-v>plik w pliku niż jest w rzeczywistości, więc użyłem metody ronda, aby móc go przetestować { cat foo.vim; echo ':wq'; } | vim out.txt. Nie jestem pewien, dlaczego nie przyszło mi do głowy, aby spróbować <C-v><C-v>wczoraj.
Ray

Cieszę się, że to działa! Innym sposobem na przetestowanie odpowiedzi vima dla wygody jest Wypróbuj online! , który naprawdę używa napisanego przeze mnie esolangu, ale i tak jest (przeważnie) kompatybilny wstecz. -vFlaga pozwala używać vim kluczowych opisów (jak <C-v>i etażerka)
DJMcMayhem

@DJMcMayhem Very nice. Dzięki.
Ray

Nie umiesz pisać <NL>zamiast <NEWLINE>?
L3viathan

7

Węgiel drzewny , 69 54 52 48 bajtów

E⪪”|↖y{{﹪yc›o”n↗πf>T≔Y¿PN|ωπQβ” ⪫Eιק* μ⌕βλω‖O←

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Dzięki tylko @ ASCII, zapisano 4 bajty, przełączając się z oddzielnej flagi na zapętlanie indeksów, 7 bajtów, używając ⸿znaku (nieudokumentowanego?) , A kolejne 4 bajty, używając alfabetu do kodowania długości przebiegu. Zapisano kolejne 2 bajty, ponieważ AtIndexautomatycznie pobiera moduł. Zapisano kolejne 4 bajty, ponieważ Mapautomatycznie tworzy zmienną indeksu. Wyjaśnienie:

Print(Map(

Zewnętrzne Mapzwraca tablicę. Printradzi sobie z tym, drukując każdy element na osobnej linii, unikając w ten sposób konieczności ręcznego Joinich ustawiania \n.

Split("anb adbke eme fjj y z z z y lhf dedhe cgbhc" " "),

Ciąg koduje wszystkie półwiersze wyniku. Litery naprzemienne odnoszą się do liczby *s i spacji ( a=0służy do obsługi wiersza rozpoczynającego się spacją). Spacja jest wygodnym wyborem ogranicznika, ale okazuje się, że dobrze się kompresuje (x kompresuje również do 55 bajtów). Każdy wiersz jest przetwarzany osobno. (Uwaga: deverbosifier nie usuwa separatora między skompresowanym i nieskompresowanym łańcuchem, w przeciwnym razie kod miałby ,czytelność.)

Join(Map(i, Times(AtIndex("* ", m), Find(b, l))), w)));

Pętlę nad każdą literą, rozwijając do odpowiedniej liczby *s lub spacji. Zmienna mjest do tego indeksem wewnętrznej pętli Map, podczas gdy lzawiera literę. Wynik jest następnie Joinedytowany w pojedynczy ciąg przy użyciu predefiniowanego pustego ciągu w.

ReflectOverlap(:Left);

Po wydrukowaniu wszystkich wierszy odzwierciedl wszystko po lewej stronie, zachodząc na środkową kolumnę.

Próbowałem obsługiwać znaki nowej linii, spacje i gwiazdy w jednej pętli, ale tak naprawdę zajęło to jeszcze dwa bajty:

Print(Join(Map("anb adbke eme fjj y z z z y lhf dedhe cgbhc", Ternary(Equals(" ", i), "\n", Times(AtIndex("* ", k), Find(b, i)))), w));
ReflectOverlap(:Left);

1
+1 Naprawdę muszę nauczyć się Węgla Drzewnego (podobnie jak Sześciokąt i Cubix). Trzy moje ulubione języki programowania, które tu widzę. Przy okazji, myślę, że już to planowałeś, ale czy możesz dodać wyjaśnienie?
Kevin Cruijssen

@KevinCruijssen Hmm, myślę, że nawet pełny kod wymaga pewnych wyjaśnień ... czy to wystarczy?
Neil

Ach, nie zauważyłem, że TIO zawierało pełną wersję tbh. Niemniej jednak wyjaśnienie w samej odpowiedzi nigdy nie boli, więc dziękuję za poświęcenie czasu na jego napisanie.
Kevin Cruijssen

Chcę nauczyć się węgla drzewnego, ale potrzebuje strony takiej jak 05AB1E, która wyjaśnia, co właściwie robi każdy znak strony kodowej bez konieczności zagłębiania się w kod.
Magic Octopus Urn

2
@ carusocomputing Nie jest tak źle: oprócz skompresowanych ciągów masz normalne ciągi (znaki ASCII i pilcrow), cyfry (cyfry w indeksie górnym), strzałki (... strzałki), polecenia (zwykle duże litery) i operatory (wszystko else), abyś mógł je następnie wyszukać na odpowiedniej stronie wiki.
Neil

6

Clojure, 833 437 bajtów

Niemal z definicji Clojure nigdy nie zdobędzie żadnych nagród dla zwięzłości, ale nie mogę się doczekać KAŻDY cera tygodnia do dwóch (count „em - DWA ) odcinków Batman (! Same Bat-czas, to samo Bat-kanałowy) To jasne, że nie ma nie ma czasu do stracenia!

Szybko, Robin - do Bat-REPL !!!

(defn r[c n](clojure.string/join(repeat n c)))(defn pl[col](loop[i 0 c " "](print(r c (nth col i)))(if(< i (dec (count col)))(recur (inc i) (if (= c " ") "*" " "))(println))))(defn p[](loop[lines [[11 1 25 1][7 4 10 1 5 1 10 4][5 4 12 7 12 4][3 6 12 7 12 6][2 9 9 9 9 9][1 47][0 49][0 49][0 49][1 47][2 5 7 21 7 5][4 4 7 3 4 5 4 3 7 4][7 2 7 1 6 3 6 1 7 2]] i 0] (pl (nth lines i))(if (< i (dec (count lines)))(recur lines (inc i))nil)))

Wersja bez gry w golfa:

(defn repstr [c n]
  (clojure.string/join (repeat n c)))

(defn print-bat-signal-line [col]
  (loop [i  0
         c  " "]
    (print (repstr c (nth col i)))
    (if (< i (dec (count col)))
      (recur (inc i) (if (= c " ") "*" " "))
      (println))))

(defn print-bat-signal []
  (loop [lines [[11 1 25 1]  ; spaces asterisks spaces asterisks
                [7 4 10 1 5 1 10 4]
                [5 4 12 7 12 4]
                [3 6 12 7 12 6]
                [2 9 9 9 9 9]
                [1 47]
                [0 49]
                [0 49]
                [0 49]
                [1 47]
                [2 5 7 21 7 5]
                [4 4 7 3 4 5 4 3 7 4]
                [7 2 7 1 6 3 6 1 7 2]]
        i      0]
    (print-bat-signal-line (nth lines i))
    (if (< i (dec (count lines)))
      (recur lines (inc i))
      nil)))

RIP Adam West. Bez względu na to, jak absurdalne były te programy, ci z nas, którzy byli dziećmi, pozdrawiają was.


Chociaż nie grał w golfa, wciąż bije kota odpowiedź heh.
Magic Octopus Urn

Dodano wersję golfową. Obróciłbym go na boki, żeby wyglądało, jakby wspiął się na ścianę, gdybym mógł. :-)
Bob Jarvis,

6

C (gcc) , 191 bajtów

#define x 16777215
char*b,*c,a[50];l[]={4096,122888,491535,2064399,4186143,x/2,x,x,x,x/2,4064255,983495,98435,0},*p=l;main(){for(;*p;p++,puts(a))for(b=c=a+23;b>=a;*p/=2)*b--=*c++=" *"[*p&1];}

Wypróbuj online!


6

Różne rozwiązania, wszystkie wykorzystujące kodowanie długości przebiegu, z różnymi technikami kodowania danych RLE.

Python 3, 125 121 bajtów

Ta wersja używa bytesciągu do przechowywania danych.

s=''
for c in b'<)@4/:),0/>/,3>/*981(WYYY(W*14=./4-.-4+4)2+':s+=' *'[c%2]*(c//2-19);s*=len(s)<25or print(s+s[-2::-1])or 0

Niech sbędzie ciąg gwiazd lub spacji. Następnie nkodowanie bajtów spodaje

n = 38 + 2*len(s) + (s[0]=='*')

Python 2, 133 126 bajtów

Ta wersja wykorzystuje kodowanie alfabetyczne. Wartość literowa określa długość ciągu wyjściowego, wielkość liter określa, czy składa się ze spacji, czy gwiazd.

s=''
for c in'kAmgDjAceDlDcFlDbIiEaXYYYaXbEgKdDgCdCgBgAfB':
 s+=' *'[c<'a']*(int(c,36)-9)
 if len(s)>24:print s+s[-2::-1];s='' 

Moje oryginalne 133 bajtowe rozwiązanie Python 2.

Ta wersja wykorzystuje ciągi zerowej długości, dzięki czemu może łatwo przełączać się między ciągami gwiazdowymi i kosmicznymi.

s=''
for c,n in zip(24*' *','b1d074a13054c436c429951o0p0p0p1o257b447343727162'):
 s+=c*int(n,36)
 if len(s)>24:print s+s[-2::-1];s=''

Dla zabawy, oto jedna linijka z alfabetycznym kodowaniem.

Python 2, 148 bajtów

print'\n'.join(''.join(s+s[-2::-1])for s in zip(*[iter(''.join(' *'[c<'a']*(int(c,36)-9)for c in'kAmgDjAceDlDcFlDbIiEaXYYYaXbEgKdDgCdCgBgAfB'))]*25))

Dla jeszcze większej zabawy, oto wzór w Game of Life Conwaya, który generuje wersję logo Batmana. Musiałem podwoić każdą linię, aby zachować proporcje mniej więcej takie same jak w wersji tekstowej. Ten wzór nie naprawdę obliczyć logo (chociaż to jest możliwe do wykonania obliczeń w życiu - to Turing-complete), to po prostu odtwarza go z pętli pamięci, więc myślę, że nie można zakładać go jako wpisu kod golfa (choć I tak go utworzyć za pomocą skryptu Pythona napisałem kilka lat temu). ;)

Jest zakodowany w dość standardowym formacie RLE, który może załadować większość silników Life. Jeśli nie masz programu GoL (np. Golly ), możesz go zobaczyć w akcji online dzięki temu silnikowi Life , który może importować pliki Life RLE. Oto wersja tego wzoru życia w formacie PNG , niektóre programy życia (w tym Golly) mogą ładować wzorce życia z plików PNG i różnych innych formatów plików obrazów.


6

T-SQL, 283 276 222 bajtów

SELECT CAST(DECOMPRESS(CAST('H4sIAAAAAAAEAFNQgAMtBVxAi5cLxgICdB3IAkAAVYuqEsLHIgRWjV0KqxBIvZYWujQeEaAGLdIALxeJGuinhXSvQEMCPVSQAbIcJPJQReGSSHxU9WAeSppAqEMoBwCfudAGawIAAA=='as XML).value('.','varbinary(max)'))AS varchar(max))

Implementowanie kompresji GZIP oryginalnego ciągu batmana, za pomocą metody zamieszczonej tutaj . Działa to tylko w SQL 2016 i nowszych.

W przypadku wcześniejszych wersji SQL użyj mojej poprzedniej metody ( 276 bajtów ):

DECLARE @ CHAR(999)=REPLACE(REPLACE(REPLACE('PRINT SPACE(11#1$25#1&$7#4$10#1$5#1$10#4&$5#4$12#7$12#4&$3#6$12#7$12#6&$2#9$9#9$9#9&$1#47&#49&#49&#49&$1#47&$2#5$7#21$7#5&$4#4$7#3$4#5$4#3$7#5&$7#2$7#1$6#3$6#1$7#2)','#',')+REPLICATE(''*'','),'$',')+SPACE('),'&',')+CHAR(13')EXEC(@)

Zasadniczo ręcznie koduję gigantyczny ciąg znaków, który określa, co wydrukować w następnej kolejności, przy użyciu następującej metody:

  • #7 zostaje zastąpiony przez +REPLICATE('*',7)
  • $4 zostaje zastąpiony przez +SPACE(4)
  • & zostaje zastąpiony przez +CHAR(13)

Po zamianie wygląda cały ciąg znaków 958 (z podziałem wierszy w każdym wierszu w symbolu Batmana:

PRINT 
SPACE(11)+REPLICATE('*',1)+SPACE(25)+REPLICATE('*',1)+CHAR(13)
+SPACE(7)+REPLICATE('*',4)+SPACE(10)+REPLICATE('*',1)+SPACE(5)+REPLICATE('*',1)+SPACE(10)+REPLICATE('*',4)+CHAR(13)
+SPACE(5)+REPLICATE('*',4)+SPACE(12)+REPLICATE('*',7)+SPACE(12)+REPLICATE('*',4)+CHAR(13)
+SPACE(3)+REPLICATE('*',6)+SPACE(12)+REPLICATE('*',7)+SPACE(12)+REPLICATE('*',6)+CHAR(13)
+SPACE(2)+REPLICATE('*',9)+SPACE(9)+REPLICATE('*',9)+SPACE(9)+REPLICATE('*',9)+CHAR(13)
+SPACE(1)+REPLICATE('*',47)+CHAR(13)
+REPLICATE('*',49)+CHAR(13)
+REPLICATE('*',49)+CHAR(13)
+REPLICATE('*',49)+CHAR(13)
+SPACE(1)+REPLICATE('*',47)+CHAR(13)
+SPACE(2)+REPLICATE('*',5)+SPACE(7)+REPLICATE('*',21)+SPACE(7)+REPLICATE('*',5)+CHAR(13)
+SPACE(4)+REPLICATE('*',4)+SPACE(7)+REPLICATE('*',3)+SPACE(4)+REPLICATE('*',5)+SPACE(4)+REPLICATE('*',3)+SPACE(7)+REPLICATE('*',5)+CHAR(13)
+SPACE(7)+REPLICATE('*',2)+SPACE(7)+REPLICATE('*',1)+SPACE(6)+REPLICATE('*',3)+SPACE(6)+REPLICATE('*',1)+SPACE(7)+REPLICATE('*',2)

Który jest wykonywany jako dynamiczny SQL, dając następujące dane wyjściowe:

           *                         *
       ****          *     *          ****
     ****            *******            ****
   ******            *******            ******
  *********         *********         *********
 ***********************************************
*************************************************
*************************************************
*************************************************
 ***********************************************
  *****       *********************       *****
    ****       ***    *****    ***       *****
       **       *      ***      *       **

5

PHP , 137 bajtów

<?=gzinflate(base64_decode(U1CAAy0FXECLC8YAAnQNyAJAwIVFIYSPRYgLLkWEYrByLS10WTwiXAgmcYCLRPV00kGyN6BhgB4eyABZjgstyqAsuDpU5YjEgJIOEKoQigE));

Wypróbuj online!

PHP , 177 bajtów

foreach(["9zojk",a2878,aa4nb,b7u9z,chbf3,eze2n,jz6rj,jz6rj,jz6rj,eze2n,cepdr,ako8z,a1pc1]as$v)echo$t=strtr(substr(base_convert($v,36,2),1),10,"* "),"* "[$k++<2],strrev($t),"\n";

Wypróbuj online!

PHP , 179 bajtów

for(;$o=ord(kAlgDjAbeDlCcFlCbIiDaWXXXaWbEgJdDgCdBgBgAfA[$i++]);($x+=$s)%24?:print$r.("* "[$k++<2]).strrev($r)."\n".$r="")$r.=strtr(str_repeat($b=+($o>96),$s=$o-64-$b*32),10," *");

Wypróbuj online!


Twój pierwszy przykład wymaga cytatów
Steven Penny

2
@StevenPenny Nie, nie ma. Sprawdziłeś link wypróbuj online ?
ovs

1
@StevenPenny W tym przypadku PHP używa rzutowania nieistniejących stałych na łańcuchy. Zgłaszam tylko błąd powiadomienia, który jest dozwolony w Codegolf. A brakujące „=” na końcu łańcucha zakodowanego w base64 zostanie dodane automatycznie
Jörg Hülsermann

4

Java, 296 214 bajtów

Gra w golfa:

()->{String r="";boolean b=1<0;for(int a:";1I1074:151:4054<7<4036<7<6029999901_10a10a10a01_0257E570447345437407271636172".toCharArray()){for(int i=0;i<a-48;++i)r+=(b?'*':' ');if(a<49)r+='\n';else b=!b;}return r;}

Nie golfowany:

public class InHonorOfAdamWest {

  public static void main(String[] args) {
    System.out.println(f(() -> {
      String r = "";
      boolean b = 1 < 0;
      for (int a : ";1I1074:151:4054<7<4036<7<6029999901_10a10a10a01_0257E570447345437407271636172".toCharArray()) {
        for (int i = 0; i < a - 48; ++i) {
          r += (b ? '*' : ' ');
        }
        if (a < 49) {
          r += '\n';
        }
        else {
          b = !b;
        }
      }
      return r;
    }));
  }

  private static String f(java.util.function.Supplier<String> f) {
    return f.get();
  }
}

Można użyć ";1I1074:151:4054<7<4036<7<6029999901_10a10a10a01_0257E570447345437407271636172"do danych, i po for(char a:x){a=(int)a-48; [...]prostu dodaje 48 do każdej liczby i konwertuje je na ich ekwiwalent ascii char. Wierzę, że pozwoli ci to zaoszczędzić 70-80 bajtów. Również wierzę, że kodowanie danych do Lamba również zmniejszy bajty.
Magic Octopus Urn

Również boolean b=false;może być boolean b=1<0, albo nawet lepiej można używać int, a także łączyć się z deklaracji dla itej samej linii).
Magic Octopus Urn

1
@ carusocomputing dzięki, nie myślałem o pakowaniu go w ciąg. Twoja zawierała złą wartość Unicode, musiałem ją zregenerować, a dane wyjściowe są teraz wyświetlane poprawnie.

Ponieważ nie używasz ipętli for, myślę, że możesz użyć jej for(int i=0;i++<a-48;)jako for-head.
Roman Gräf

3

Bubblegum , 75

zrzut xxd:

00000000: cd92 b501 8050 1043 fb4c 91fa efbf 1f0e  .....P.C.L......
00000010: 2f87 d371 5814 37d3 7c35 4d2b 1826 64f6  /..qX.7.|5M+.&d.
00000020: d8aa 419c 2a11 3e75 ce25 6d1e ee9d 22e0  ..A.*.>u.%m...".
00000030: bb11 f04f 0d7f 2e38 dfc8 6926 3dad 0871  ...O...8..i&=..q
00000040: f316 1071 6db8 fc07 a408 f7              ...qm......

Wypróbuj online .


3

Coffeescript (282 bajtów)

t=['6bk','59mw','l2j3','2ghsf','4zg2n','9zldr','jz6rj','4u7zz','165qf','47wj']
[0,1,2,3,4,5,6,6,6,5,7,8,9].map((d)->parseInt(t[d], 36).toString(2).padStart 25, '0').forEach (d)->console.log (d+d.split('').reverse().join('').substring(1)).replace(/0/g, ' ').replace(/1/g,'*')

Wyjaśnienie (przy użyciu zwykłego ES6)

  • Jak wspomniano w innych, obraz jest symetryczny, więc możemy go wyrzucić z kodowania
  • Kilka linii jest również powtarzanych, więc możemy podrzucić każdą linię w tabeli odnośników, aby zaoszczędzić kilka bajtów
  • Konwertujemy każdą półwiersz na binarną (używając 0 jako spacji i 1 jako *) i kodujemy ją z tą najwyższą podstawką w Javascript (36), co daje tablicę kodowania.
  • Pierwsza mapa pobiera każdą linię i konwertuje ją z powrotem do końcowej linii wyjściowej, wypełniając ją zerami
  • Druga mapa łączy każdą linię z odwróconą połową (podrzucając środkową kolumnę za drugim razem) i zastępuje 0 i 1 spacjami oraz * s

var t = [
    '6bk',
    '59mw',
    'l2j3',
    '2ghsf',
    '4zg2n',
    '9zldr',
    'jz6rj',
    '4u7zz',
    '165qf',
    '47wj'
];
[0,1,2,3,4,5,6,6,6,5,7,8,9].map((d) => {
    return parseInt(t[d], 36).toString(2).padStart(25, '0');
})
.forEach((d) => {
    console.log((d + d.split('').reverse().join('').substring(1))
        .replace(/0/g, ' ')
        .replace(/1/g, '*'));
});


Fajna odpowiedź! Witamy na stronie! :)
DJMcMayhem

2

V , 102 bajtów

i±³ *±± 
³ *± ´*· 
´*±² ´*µ 
´*±² ¶*³ 
µ*¹ ¹*  
²´* Ä3o²µ*jo±±*· µ*  
³*´ ³*· ´*´ 
**¶ *· **· Îæ$vp

Wypróbuj online!

Hexdump:

00000000: 69b1 b320 2ab1 b120 0ab3 202a b120 b42a  i.. *.. .. *. .*
00000010: b720 0ab4 2ab1 b220 b42a b520 0ab4 2ab1  . ..*.. .*. ..*.
00000020: b220 b62a b320 0ab5 2ab9 20b9 2a20 200a  . .*. ..*. .*  .
00000030: b2b4 2a20 1bc4 336f b2b5 2a1b 6a6f b1b1  ..* ..3o..*.jo..
00000040: 2ab7 20b5 2a20 200a b32a b420 b32a b720  *. .*  ..*. .*. 
00000050: b42a b420 0a2a 2ab6 202a b720 2a2a b720  .*. .**. *. **. 
00000060: 1bce e624 7670                           ...$vp

Wykorzystuje to kodowanie długości przebiegu do wygenerowania następującej połowy batmana:

             *           
   *          ****       
****            ****     
****            ******   
*****         *********  
************************ 
*************************
*************************
*************************
************************ 
***********       *****  
***    ***       ****    
**      *       **      

A następnie odwraca i duplikuje każdą linię.


2

Python 2 , 134 bajty

for w in'1D 4A13 4C4 6C4 995 O P P P O 57B 47343 27162'.split():r=''.join(c*int(k,36)for c,k in zip(3*'* ',w));print'%25s'%r+r[-2::-1]

Wypróbuj online!

Długość przebiegu koduje każdą linię od lewej połowy w podstawie 36. Odzwierciedla ją, aby utworzyć pełną linię, która jest drukowana. Wiodące spacje nie są kodowane; zamiast tego lewa połowa jest wyściełana do długości 25.


Chciałbym móc skorzystać z tej sztuczki padding w mojej wersji ...
PM 2 w piątek

2

Mathematica 151 bajtów

Uncompress@"1:eJxTTMoPCm5iYmBQQAAtBVxAK8bA0AjGBgJ0PcgCQABXjaoWwsciBFWPXRKrEESHlha6AjwiYC1apAGQHhK10FsTOV6Chgp6CCEDZDlYdKKKw6WR+OjxD+KiJBSEQoR6AC49ZiI="

Tani i mało kreatywny. Łańcuch pochodzi z wbudowanej Compresskomendy użytej na wymaganym wyjściu.

Aktualizacja:

Myślę, że mogę zrobić lepiej z wbudowanymi funkcjami ImportString\, ExportStringale nie widzę, aby ExportStringpoprawnie skopiować i wkleić wynikowe ciągi . Na przykład

b = "           *                         *\n       ****          *     *          ****\n     ****            *******            ****\n   ******            *******            ******\n  *********         *********         *********\n ***********************************************\n*************************************************\n*************************************************\n*************************************************\n ***********************************************\n  *****       *********************       *****\n    ****       ***    *****    ***       ****\n       **       *      ***      *       **"
ExportString[b,"GZIP"]
ImportString[%,"GZIP"]

Nie mogę skopiować tekstu z drugiego wiersza, aby zastąpić go %w trzecim wierszu.


2

Bash ,407 322 bajty

w=`yes 1|head -30|tr -d '\n'`
for i in B1C000 74A120 54C003 36C003 299004 1C0506 0D0506 0D0506 0D0506 1C0506 257505 447342 727161
{ read a b c d e f <<<$(echo $i| fold -1| xargs)
x=`printf "%.$[0x${a}]d%.$[0x${b}]s%.$[0x${c}]d%.$[0x${d}]s%.$[0x${e}]d%.$[0x${f}]s" 0 $w 0 $w 0 $w`
echo -n $x$[f<1?0:1]
rev<<<$x
}|tr 01 \ \*

Wypróbuj online!

naprawdę okropne, potrzebujesz więcej czasu lub pomóż w golfa. generuje wynik z 0 na 1 i transliteruje na końcu. Zakodowane w cyfrach szesnastkowych ilość 0 i 1, uważając, aby ostatnia cyfra 0 dla pierwszych dwóch wierszy była flagą wyjściową środkowej kolumny. Używa nacisku printf na cyfrę lub ciąg znaków, aby wyprowadzić 0 i 1. myśl, że %.$[0x${X}]Cwzorzec może być użyty do golfa.

w=`yes 1|head -30|tr -d '\n'`  # w=111111111111111111111111111111   
for i in B1C000 74A120 54C003 36C003 299004 1C0506 0D0506 0D0506 0D0506 1C0506 257505 447342 727161
{ read a b c d e f <<<$(echo $i| fold -1| xargs)
printf "%.$[0x${a}]d
%.$[0x${b}]s
%.$[0x${c}]d
%.$[0x${d}]s
%.$[0x${e}]d
%.$[0x${f}]s" 0 $w 0 $w 0 $w
echo -n $[f<1?0:1]
printf "%.$[0x${f}]s
%.$[0x${e}]d
%.$[0x${d}]s
%.$[0x${c}]d
%.$[0x${b}]s
%.$[0x${a}]d\n" $w 0 $w 0 $w 0 
}|tr 01 \ \*

2

Python 3, 232 197 183 164 bajtów

Jeszcze inna odpowiedź w języku Python. Brak nudnego kodu kompresji. Ekscytujący kod kompresji.

for s in map(lambda x:x+x[-2::-1],b".$; *',$' ('.* &).* %,+, $R #T #T #T $R %()8 '')&&( *%)$(&".split()):print(*((u-35)*" "+(v-35)*"*"for u,v in zip(*[iter(s)]*2)))

Używam magicznej liczby 35, ponieważ w ten sposób nie występują żadne znaki kontrolne, spacje lub rzeczy, które należałoby uciec. Smutne, że muszę osobno przetwarzać przestrzenie i gwiazdy, co trochę mnie kosztuje.

Nie golfowany:

for s in map(lambda x:x+x[-2::-1],   # map a list to the list and itself reversed,
                                     # minus the last (center) element
# magic string:
".$; *',$' ('.* &).* %,+, $R #T #T #T $R %()8 '')&&( *%)$(&"
.split()):                           # split on whitespace to divide into lines
 print(*(                            # unpack generator expression
(ord(s[i])-35)*" "                   # convert character to int, -25, times space
+(ord(s[i+1])-35)*"*"                # same thing with "*"
for i in range(0,len(s)-1,2)))       # for every pair in the list

Ta metoda kodowania jest lepsza niż baza 36. Mam nadzieję, że nie masz nic przeciwko temu, że dostosowałem ją do mojego najnowszego rozwiązania. ;) Istnieje kilka rzeczy, które możesz zrobić, aby zmniejszyć liczbę bajtów. 1 Możesz zapisać bajt, ustawiając printpołączenie na tej samej linii, co for. 2 Jeśli używasz ciągu bytesznaków, możesz pozbyć się tych ordpołączeń. 3 Możesz zastąpić rangeplik zip za pomocą pary iteratorów. Oto generator, który łączy oba te pomysły: ((u-35)*" "+(v-35)*"*"for u,v in zip(*[iter(s)]*2)). Zmiany te spowodują zmniejszenie liczby do 164.
PM 2 w dniu

@ PM2Ring Nie mam nic przeciwko. Jedziesz na kilka tygodni na wakacje, więc możesz edytować swoje zmiany.
L3viathan

No dobrze Ale pozwolę ci zrobić nową wersję bez gry w golfa.
PM 2,

@ PM2 Już w autobusie, więc mam nadzieję, że ktoś inny to zatwierdzi
L3viathan

2

PowerShell, 305 bajtów, 307 bajtów , 316 bajtów

[IO.StreamReader]::new(([IO.Compression.GZipStream]::new([IO.MemoryStream]::new(([Convert]::FromBase64String('H4sIAAAAAAAEAL1SOQ4AIAjbTfwDc///QFE8gKAJi53sNQASbYBuQC3rxfANLTBm1iaFB9JIx1Yo9Tzg7YfCBeRQS7Lwr5IfZW7Cb0VDe3I8q25TcXvrTsyXOLGTbuHBUsBqAgAA')),0,102),[IO.Compression.CompressionMode]::Decompress))).ReadToEnd()

Może ktoś inny może mi pomóc w dalszym skróceniu tego, choć nie potrafię tego zrozumieć, chyba że istnieje bardziej zwięzły sposób zdefiniowania niestandardowego typu akceleratora.

Edycja: Skrócona wersja (dzięki @root). Zakodowany ciąg (kodowanie przed base64) może zostać przycięty o osiem pozycji macierzy, dzięki czemu zasięg może zostać zmniejszony. Nie jestem pewien, dlaczego StreamWriter wprowadza ten wzdęcie do MemoryStream. Doceniony zostanie wgląd w podstawowe zachowanie.

[IO.StreamReader]::new(([IO.Compression.GZipStream]::new([IO.MemoryStream]::new(([Convert]::FromBase64String('H4sIAAAAAAAEAL1SOQ4AIAjbTfwDc///QFE8gKAJi53sNQASbYBuQC3rxfANLTBm1iaFB9JIx1Yo9Tzg7YfCBeRQS7Lwr5IfZW7Cb0VDe3I8q25TcXvrTsyXOLGTbg')),0,94),[IO.Compression.CompressionMode]::Decompress))).ReadToEnd()

Nie golfowany:

#Read decoded stream 
[IO.StreamReader]::new(
    (
        #Reverse GZip encoding
        [IO.Compression.GZipStream]::new(
            #Load GZip encoded string into a memory stream
            [IO.MemoryStream]::new(
                (
                    # Convert Base64 back to GZip encoded string
                    [Convert]::FromBase64String('H4sIAAAAAAAEAL1SOQ4AIAjbTfwDc///QFE8gKAJi53sNQASbYBuQC3rxfANLTBm1iaFB9JIx1Yo9Tzg7YfCBeRQS7Lwr5IfZW7Cb0VDe3I8q25TcXvrTsyXOLGTbuHBUsBqAgAA')
                ),
                #Start of range
                0,
                #End of range. Stick the Memory Stream into a variable and use .Length here for non golf code
                102
            ),
            #Specify that we are decompressing
            [IO.Compression.CompressionMode]::Decompress
        )
    )
).ReadToEnd()

Kod kompresji:

$s = '           *                         *
       ****          *     *          ****
     ****            *******            ****
   ******            *******            ******
  *********         *********         *********
 ***********************************************
*************************************************
*************************************************
*************************************************
 ***********************************************
  *****       *********************       *****
    ****       ***    *****    ***       ****
       **       *      ***      *       **'

#Create Memory Stream
$ms = [IO.MemoryStream]::new()
#Initialize a stream
$sw = [IO.StreamWriter]::new(
    #Create GZip Compression stream
    [IO.Compression.GZipStream]::new(
        #Reference Memory Stream
        $ms,
        #Set mode to compress
        [IO.Compression.CompressionMode]::Compress
    )
)
#Write input into stream
$sw.Write($s)
#Close the stream
$sw.Close()

#Convert Array to Base64 string
[Convert]::ToBase64String(
    #Retrieve Memory Stream as an array
    ($ms.ToArray() | select -SkipLast 8)
)

1
Dlaczego 102? 99 działa tak samo,[IO.StreamReader]::new(([IO.Compression.GZipStream]::new([IO.MemoryStream]::new(([Convert]::FromBase64String('H4sIAAAAAAAEAL1SOQ4AIAjbTfwDc///QFE8gKAJi53sNQASbYBuQC3rxfANLTBm1iaFB9JIx1Yo9Tzg7YfCBeRQS7Lwr5IfZW7Cb0VDe3I8q25TcXvrTsyXOLGTbuHBUsBqAgAA')),0,102),[IO.Compression.CompressionMode]::Decompress))).ReadToEnd()
root

@root to robi, ale nie jestem pewien, dlaczego to działa. Możesz go zmniejszyć o osiem do 94 i upuścić osiem ostatnich znaków zakodowanego ciągu wejściowego. Trudno mi zrozumieć, dlaczego to działa, i nie chcę dodawać tego do mojej odpowiedzi, dopóki tego nie zrobię. Czy moja funkcja kompresji błędnie dodaje jakieś obce wypełnienie?
Chirishman

1
Z twojego kodu kompresji, dwie ostatnie wartości z $ms.ToArray()są równe 0. Czy są konieczne?
root

Nie. I wypróbowanie różnych ciągów wejściowych wydaje się spójne, że są to dokładnie dwie niepotrzebne pozycje tablicy na końcu. Dodam klauzulę, aby pominąć dwa ostatnie w moim skrypcie kompresującym. Nadal chciałbym wiedzieć, dlaczego pisarz strumienia dodaje wartości zerowe na końcu
Chirishman,

1
Masz rację, to więcej niż tylko 2 znaki z ogona, to 8. Ostatnie 8 pozycji w tablicy ('225','193','82','192','106','2','0','0')można usunąć, aby utworzyć H4sIAAAAAAAEAL1SOQ4AIAjbTfwDc///QFE8gKAJi53sNQASbYBuQC3rxfANLTBm1iaFB9JIx1Yo9Tzg7YfCBeRQS7Lwr5IfZW7Cb0VDe3I8q25TcXvrTsyXOLGTbg==. Nie rozumiem, skąd pochodzą.
root

2

Perl 5, 168 bajtów

$_="11 *25 
7 4*10 *5 *10 4
5 4*12 7*12 4
3 6*12 7*12 6
2 9*9 9*9 9
 47
49
49
49
 47
  5*7 21*7 5
4 4*7 3*4 5*4 3*7 4
7 **7 *6 3*6 *7 *";s/$/*/gm;say s/\d+(.)/$1x$&/ger

Zwróć uwagę na spację na końcu tylko pierwszego wiersza. Wymaga -M5.01, co jest bezpłatne.

Prawdopodobnie można grać w golfa nieco więcej.


2

LaTeX, 314 bajtów

\documentclass{book}\begin{document}\def\r#1#2{\ifnum#2>64#1\r#1{\numexpr#2-1}\fi}\catcode`.13\catcode`!13\catcode`-13\def!#1{\r*{`#1}}\def-#1{\r~{`#1}}\let.\par\tt-K!A-Y!A.-G!D-J!A-E!A-J!D.-E!D-L!G-L!D.-C!F-L!G-L!F.-B!I-I!I-I!I.-A!o.!q.!q.!q.-A!o.-B!E-G!U-G!E.-D!D-G!C-D!E-D!C-G!D.-G!B-G!A-F!C-F!A-G!B\enddocument

Wersja bez golfa z objaśnieniami:

\documentclass{book}
\begin{document}
% Macro for repeating #1 (#2-64) times
\def\r#1#2{\ifnum#2>64#1\r#1{\numexpr#2-1}\fi}
% Prepare '.', '!' and '-' for usage as macro names
\catcode`.13\catcode`!13\catcode`-13
% The ASCII code of #1 (a character) is used as the number of how often '*' will be printed with \r
\def!#1{\r*{`#1}}
% Same as ! but for spaces
\def-#1{\r~{`#1}}
% . becomes a line break
\let.\par
% Set monospace font
\tt
% And finally print the whole thing
-K!A-Y!A.-G!D-J!A-E!A-J!D.-E!D-L!G-L!D.-C!F-L!G-L!F.-B!I-I!I-I!I.-A!o.
!q.!q.!q.-A!o.-B!E-G!U-G!E.-D!D-G!C-D!E-D!C-G!D.-G!B-G!A-F!C-F!A-G!B
\enddocument

2

C # (.NET Core) , 342 333 328 185 175 bajtów

_=>{var r="";for(int i=0,j,k=0;i<63;i++)for(j=0;j++<"-#;#4&,#'#,&.&.).&*(.).('+++++%Q#µ#Q%')7)'(&)%&'&%)&-$)#(%(#)$)"[i]-34;){r+=i%2<1?' ':'*';if(++k%49<1)r+='\n';}return r;}

Wypróbuj online!

Dużo bajtów zapisanych po zmianie podejścia. Biorąc rysunek za tablicę 2D, obliczyłem kodowanie RLE według plików:

{ 11, 1, 25, 1, 18, 4, 10, 1, 5, 1, 10, 4, 12, 4, 12, 7, 12, 4, 8, 6, 12, 7, 12, 6, 5, 9, 9, 9, 9, 9, 3, 47, 1, 147, 1, 47, 3, 5, 7, 21, 7, 5, 6, 4, 7, 3, 4, 5, 4, 3, 7, 4, 11, 2, 7, 1, 6, 3, 6, 1, 7, 2, 7 }

Wskaźniki nieparzyste oznaczają s, a nawet wskaźniki oznaczają *s. Następnie zastąpiłem każdą liczbę drukowaną reprezentacją ASCII (przyjmując znak „#” jako 1) i otrzymałem:

-#;#4&,#'#,&.&.).&*(.).('+++++%Q#µ#Q%')7)'(&)%&'&%)&-$)#(%(#)$)

Algorytm po prostu oblicza rysunek, dekompresując ten ciąg i dodając nowe wiersze w odpowiednich miejscach.


1
Nie trzeba ustawiać lzmiennej, wystarczy użyć jej bezpośrednio w pętli. .ToString(i, 2)-> .ToString(i,2)tj. usuń białe znaki.
TheLethalCoder

Czy można zapisać bajty z reprezentacjami dziesiętnymi lub naukowymi ( 1e10) dla tych liczb? To wyzwanie jest tutaj pomocne.
TheLethalCoder

@TheLethalCoder nie. Właśnie sprawdziłem (nawiasem mówiąc, imponujące wyzwanie) i już używam najmniejszej reprezentacji, więc nie ma tam szczęścia. Próbowałem nawet znaleźć największy wspólny dzielnik między nimi, aby zobaczyć, czy mogę podzielić liczby przez stałą, ale oczywiście jest to 1.
Charlie

2

PowerShell , 129 128 bajtów

-join('5+C+<.4+/+4.6.616.206160/33333-Y+s*t+Y-/1?1/0.1-./.-1.5,1+0-0+1,'|% t*y|%{(' ','*')[$i++%2]*($_-42)})-split'(.{49})'-ne''

Wypróbuj online!

Nie golfowany:

-join(
    '5+C+<.4+/+4.6.616.206160/33333-Y+s*t+Y-/1?1/0.1-./.-1.5,1+0-0+1,'|% toCharArray|%{
        (' ','*')[$i++%2]*($_-42)
    }
)-split'(.{49})'-ne''

Wynik:

           *                         *           
       ****          *     *          ****       
     ****            *******            ****     
   ******            *******            ******   
  *********         *********         *********  
 *********************************************** 
*************************************************
*************************************************
*************************************************
 *********************************************** 
  *****       *********************       *****  
    ****       ***    *****    ***       ****    
       **       *      ***      *       **

Główna idea jest bardzo prosta

Kodowanie godła:

  1. Połącz wszystkie linie godła w jeden ciąg
  2. Policz spacje i gwiazdki
  3. Zakoduj długość każdego segmentu + 42 jako znak

Dekodowanie (ten skrypt):

  1. Pobierz kod znaku minus 42 dla każdego znaku z łańcucha cripto. To jest długość segmentu
  2. Dołącz segment składający się ze spacji lub gwiazdki powtórzonych Lengthrazy
  3. Wstaw nową linię co 49 symboli, aby podzielić linie

Niektóre mądre rzeczy

  1. Algorytm kodowania sugeruje symbol z kodem 189, aby wyświetlić 3 środkowe linie gwiazdki. Ten symbol nie jest ASCII. Działa normalnie w nowoczesnych środowiskach, ale istnieją niejednoznaczności co do długości skryptu. Zamieniam więc symbol niebędący symbolem ascii ½na s*t(73 gwiazdki, 0 spacji, 74 gwiazdki).
  2. Odciąłem właściwe spacje w ostatnim wierszu, aby zaoszczędzić 1 bajt. Przepraszam, Batman.
  3. Dlaczego przesunięcie wynosi 42? Po prostu chciałem :) A stringi do crypto wyglądają ładnie.

Dodatkowo: Scipt do kodowania godła

(@"
           *                         *           
       ****          *     *          ****       
     ****            *******            ****     
   ******            *******            ******   
  *********         *********         *********  
 *********************************************** 
*************************************************
*************************************************
*************************************************
 *********************************************** 
  *****       *********************       *****  
    ****       ***    *****    ***       ****    
       **       *      ***      *       **       
"@ -replace"`n"-split'( +|\*+)'-ne''|%{[char]($_.Length+42)})-join''

1

Mathematica, 271 bajtów

T=Table;f[x_]:=""<>T["*",x];m={f@49};n={f@47};g[y_]:=""<>T[" ",y];k[a_,b_,c_,d_,e_]:={(s=f@a<>g@b<>f@c<>g@d<>f@e)<>StringDrop[StringReverse@s,1]};Grid@{k[1,13,0,0,0],k[4,10,1,3,0],k[4,12,0,0,4],k[6,12,0,0,4],k[9,9,0,0,5],n,m,m,m,n,k[5,7,0,0,11],k[4,7,3,4,3],k[2,7,1,6,2]}

1

Braingolf , 590 580 579 577 428 423 312 bajtów

-111 bajtów, ponieważ LeakyNun jest bogiem golfa

14#
46*6394943[92+.6,5][8]#.[# ]#*[# ]#*#
[# ][#*][# ]#*[# ]#*[# ]#*...#
[# ][#*][# ][#*][# ]#*...#
# ..[#*][# ][#*][# ][#*]#
# .[#*][# ][#*][# ][#*]#
# [#*]#
&@#0[#*]#
!&@!&@# &@#.[#*]"
  "&@4645*643646366556[#*][# ][#*][# ][#*]"
    "[#*][# ]#*..# ...[#*]# ...#*..[# ][#*]#
[# ]#*.[# ]#*[# ]#*..[# ]#*[# ]#*.&@

Wypróbuj online!

Braingolf nie jest dobry w sztuce ASCII, ale do cholery próbowałem.

Nie ma mowy, do diabła, wyjaśniam ten klaster **


1

/// , 171 166 bajtów

5 bajtów zapisanych, ponieważ używałem \r\nw źródle, lol.

/-/  //,/!!//'/**//&/*"//%/--//#/,,,,,!*//"/%-//!/''/"% &""" *
" !"%*% &%!
% !""!'&"!
- !*&"!'&"!'
-,&- ,&- ,*
 #'
!#
!#
!#
 #'
-!& ,,!& !*
%!" '*%!*%'& !
" *& &'&& '

Wypróbuj online!

Kompresowany przy użyciu kolejnych iteracji zastępowania „najbardziej ekonomicznych” podciągów pojedynczym znakiem. Jest to prawie optymalne, choć może się zdarzyć jedna z dwóch rzeczy:

  1. Mógłbym uciec z użyciem niektórych zamienników meta (np. Dynamicznie wstawiaj wyrażenia regularne)
  2. W pewnym sensie bardziej korzystne jest zastąpienie mniej ekonomicznych podciągów (mało prawdopodobne).
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.