Fai volare una mazza ASCII attorno a una luna ASCII


34

sfondo

Ecco una sfida legata ad Halloween.

Come avrai visto dalla mia ultima sfida, mi piace molto quello che definisco animazioni di arte ASCII, che non è solo disegnare uno schema ma disegnare uno schema che progredisce. Questa idea mi è venuta dopo che un paio di anni fa mi è stato chiesto di ravvivare una presentazione (piuttosto noiosa) facendo volare pipistrelli ascii casuali sullo schermo ad Halloween. Inutile dire che ero debitamente obbligato (ero pagato per questo), ma mi ha fatto pensare che nella vita ci sia qualcosa di più dei pipistrelli casuali. Ispirato da questo, vorrei proporre questa sfida.

Sfida

Fai volare una mazza intorno alla luna.

Ecco una mazza:

^o^

Ecco la luna:

     mmm         
   mmmmmmm       
  mmmmmmmmm      
   mmmmmmm       
     mmm     

Devi mostrare tutte le fasi del volo dei pipistrelli (vedi l'output).

Ingresso

Nessuna

Produzione

      ^o^         
      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm^o^      
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm^o^    
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm^o^   
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm^o^    
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm^o^      


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         
      ^o^         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
   ^o^mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
 ^o^mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
^o^mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
 ^o^mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


   ^o^mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      ^o^         
      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm   

Regole

  • Nessuna lettura da file o siti Web esterni
  • È possibile inviare un programma completo o una funzione
  • Spazi extra e / o newline vanno bene per me
  • Scappatoie standard vietate come al solito
  • La mazza deve finire di nuovo in cima alla luna
  • Sentiti libero di cancellare lo schermo tra i frame se lo desideri, tuttavia questo non è un requisito. L'output come mostrato sopra va bene
  • Dato che si tratta di code golf, il vincitore sarà la risposta con il numero di byte più basso, sebbene ogni risposta sia benvenuta

Campione

Implementazione di riferimento in Python 2 totalmente non golfato (620 byte, ma solo per dimostrare che può essere fatto. Può giocare a golf in un secondo momento).

b='^o^'
m=['                     ',
'         mmm         ',
'       mmmmmmm       ',
'      mmmmmmmmm      ',
'       mmmmmmm       ',
'         mmm         ',
'                     ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
    x=map(str,m[z])
    c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
    print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
    x=map(str,m[z])
    c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
    print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])

Risultato

Anche se @Jonathan ovviamente vince sul conteggio dei byte con Jelly, segnerò la risposta Brainfuck di @Oyarsa come risposta accettata puramente perché penso che chiunque possa effettivamente fare qualcosa del genere in un linguaggio così folle merita +15 rep non importa quanti byte ci vogliono. Questo non è perché ho qualche problema con le lingue del golf. Vedi la mia risposta a una domanda a riguardo su meta se hai dei dubbi. Mille grazie e rispetto a tutti coloro che hanno contribuito in qualunque lingua.


Grazie @Oliver. Ho dimenticato di rimuoverlo dopo il Sandbox.
ElPedro,

@daHugLenny Grazie per aver aggiunto il tag. Non ci avevo pensato.
ElPedro,

6
Se ritieni che l'implementazione di riferimento non sia assolutamente rispettata, non voglio mai lavorare con te su alcun progetto di programmazione.
Fondi Monica's Lawsuit,

3
Bene, forse un po 'golfista allora :-)
ElPedro

Risposte:


9

Brainfuck, 690 byte

Questa è la prima volta che gioco a golf, quindi sono sicuro che c'è ancora molto spazio per migliorare

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]

Provalo online

Ungolfed alcuni per leggibilità:

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+
Sets counters for creation of the m's and spaces
[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]
Adds the first counter plus two of the character at the second counter to the end of the
current set of cells removes the first two counters on the list then repeats until
it encounters a 254
>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]
Removes some excess cells then adds a 7 after the end of the set of cells
+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]
Adds a newline every 16 characters until 7 newlines are added
<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++
Removes some excess cells then sets indices for the locations of bats
>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]
Loops through the indices replacing the spaces at each index with a bat then printing 
the set of cells then changing the bat back to spaces

Volevo usare il fatto che aggiungendo una nuova riga all'inizio, ogni fase può essere letta in entrambe le direzioni per ottenere due fasi diverse, ma non sono riuscito a trovare un buon modo per farlo senza generare le sei fasi e mezza complete subito.


2
Molto bella! Non credo che avrei avuto la pazienza di rispondere a una sfida così grande in brainfuck, haha.
DJMcMayhem

1
Aggiunto un link TIO, spero che non ti dispiaccia. Inoltre, mi sembra di contare 693 byte.
Emigna,

Ungolfed per leggibilità avrebbe comunque vinto il primo premio per illeggibilità :) Rispetto totale per averlo effettivamente fatto in un linguaggio così folle. Molto gentile e grazie per la risposta. +1. Vale la pena 690 byte di chiunque tempo.
ElPedro,

@Enigma Da parte mia, grazie per il link TIO.
ElPedro,

@DJMcMayhem, devo aver incasinato la copia / incolla, c'era un duplicato [<] nella forma non golfata che avrebbe dovuto essere lì solo una volta. Ora dovrebbe essere risolto.
Oyarsa,

23

05AB1E , 69 62 60 byte

Salvato 2 byte grazie ad Adnan .

3ð×…^o^)U13FNV0379730vð5y>;ï-y_+×N(Y-12%_Xè'my×NY-12%_y&XèJ,

Provalo online!

Spiegazione

3ð×…^o^)Umemorizza l'elenco [" ","^o^"]in X per un uso successivo.

13FNVloop negli stadi 13 [0 .. 12] e memorizza l'indice iterazione corrente in Y .

0379730vscorre sopra le righe di ogni fase,
dove N è l'indice di riga e y è il numero corrente di m .

Iniziamo aggiungendo floor(5/(y+1))-(y==0)spazi per ogni riga con ð5y>;ï-y_+×.

Determiniamo quindi se ci dovrebbero essere una mazza o 3 spazi prima delle m .
Se (-N-Y)%12 == 0è vero aggiungiamo una mazza, altrimenti 3 spazi.
Questa espressione ( N(Y-12%_Xè) posizionerà i pipistrelli in più fasi 0,6-12.

Quindi posizioniamo y m's with 'my×.

Ora determiniamo se ci dovrebbero essere una mazza o 3 spazi dopo la m .
Il codice NY-12%_y&Xèinserirà una mazza se ((N-Y)%12 == 0) and y!=0è vero, altrimenti 3 spazi.
Questo metterà i pipistrelli sul palco 1-5.

Infine ci uniamo tutta la fila in una stringa e stampa con un ritorno a capo: J,.


5
Fa esattamente quello che dice sulla latta +1
ElPedro,

1
3ð×…^o^)invece di " ^o^"2ädovrebbe salvare due byte.
Adnan,

@Adnan: grazie! Per qualche ragione ho appena pensato che sarebbe stato più lungo e non ci ho mai provato 3ð×.
Emigna,

20

JavaScript (ES6), 109 144 140 138 byte

f=(k=13,b=y=>(y-k)%12?'   ':'^o^')=>k--?[0,3,7,9,7,3,0].map((n,y)=>' '.repeat(5-n/2+!n)+b(y)+'m'.repeat(n)+b(n?-y:.1)).join`
`+`
`+f(k):''

console.log(f());

Versione animata


bella risposta e tu sei il primo della mia ultima sfida :)
ElPedro,

1
Bella risposta. Non riesco ad avvolgere la testa pensando in questo modo.
zfrisch,

15

HTML + JS, 153 149 byte

n=setInterval(_=>o.innerText=`zzd
zc3e
 b7f
a9g
 l7h
zk3i
zzj`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`,n++),1e3)
<pre id=o>

Modifica: salvato un sacco di byte grazie a @RickHitchcock. La versione noiosa che restituisce solo le 13 stringhe multilinea in un array è 132 131 byte:

_=>[...Array(13)].map((_,n)=>`zza
zl3b
 k7c
j9d
 i7e
zh3f
zzg`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`))

Se fossi davvero severo, vorrei sottolineare che la mazza non inizia in alto :) Ma poi fa il cerchio completo e, a seconda dell'opinione, finisce in alto, che era tutto ciò che ho specificato nelle regole. +1 per la prima animazione completa. Bel lavoro e grazie.
ElPedro,

@ElPedro Penso che il posto in cui inizia la mazza dipenda dal risultato setInterval, che è sempre lo stesso sul mio browser, ma può variare per altri browser.
Neil,

OK, ma come ho detto, la posizione iniziale non è stata chiaramente specificata, quindi sono d'accordo a lasciare che setInterval decida;) Sto visualizzando con Chome su Ubuntu se questo è di qualche interesse. Inizia sempre una posizione prima della cima, ma non importa. Ottima soluzione e grazie ancora per la risposta ..
ElPedro,

1
È possibile salvare un paio di byte utilizzando innerHTMLinvece di textContent. E un altro byte cambiando repeat(+c)in repeat(c).
Rick Hitchcock,

2
(E 1000può diventare 1e3.)
Rick Hitchcock,

14

Gelatina , 76 69 58 byte

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y
_4¢ḣ;“^o^”;¢ṫ⁸¤
“½œ0CSbp\I7'ð½‘Ç€Y

TryItOnline

Come?

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y - Link 1, make a moon (niladic)
⁾ m                     - literal " m"
   ṁ                    - reshape like
    11                  - 11 (interpreted as range(11)) -> " m m m m m "
                 ¤      - nilad followed by links as a nilad
       “椿¬®µ‘         - code page indexes [22,3,11,7,8,9]
               ŒḄ       - bounce -> [22,3,11,7,8,9,8,7,11,3,22]
      ż                 - zip -> [[22,' '],[3,'m'],[11,' '],...]
                  Œṙ    - run length decode -> "                      mmm           mmmmmmm        mmmmmmmmm        mmmmmmm           mmm                      "
                    s   - split into chunks of length
                     ⁴  - l6
                      Y - join with line feeds

_4¢ḣ;“^o^”;¢ṫ⁸¤ - Link 2, a moon with a bat placed: endIndex
_4              - subtract 4 (startIndex)
  ¢              - call last link (1) as a nilad
   ḣ            - ḣead to startIndex
    ;           - concatenate
     “^o^”      - literal "^o^"
          ;     - concatenate
              ¤ - nilad followed by links as a nilad
           ¢    - call last link (1) as a nilad
            ṫ⁸  - tail from endIndex

“½œ0CSbp\I7'ð½‘Ç€Y - Main link (niladic)
“½œ0CSbp\I7'𽑠   - code page indexes [10,30,48,67,83,98,112,92,73,55,39,24,10]
                   -    indices to the right of each bat in a constructed moon
               ǀ  - call last link (2) as a monad for each
                 Y - join on line feeds

Molto bella. Penso che dovrò esaminare Jelly un po 'più da vicino.
ElPedro,

Ottima spiegazione Grazie.
ElPedro,

Sarebbe bello vedere come ti approcci anche in Python se sei interessato e hai tempo. Sono sempre felice di imparare.
ElPedro,

12

Python 2, 146 144 138 byte

-2 byte grazie a @Willem (usa la variabile cinvece di ripetere il ciclo a map)

m='\n'.join(int(a)*' '+int(b)*'m'+3*' 'for a,b in zip('6643466','0379730'))
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])

repl.it

'6643466' è il numero di spazi prima della luna (con 6 sulla prima e sull'ultima riga vuote, poiché la mazza andrà lì).

'0379730'è il numero di 'm's nella luna su ciascuna linea.

Il zipdisimballa questi personaggi in ae be rende la luna nel cielo m, con 3 spazi finali su ogni linea.

L'ultima linea attraversa quindi le posizioni del pipistrello all'interno della luna ed è effettivamente:

for c in(9,22,36,53,68,81,91,75,58,41,27,16,9):print(m[:c-3]+'^o^'+m[c:])

ma la tupla di posizioni è codificata come ordinali di caratteri stampabili, con un 23 aggiunto (poiché 9 non è stampabile). Questo viene fuori come " -;L[hrbQ@2' "ed c=ord(b)-23è usato per estrarre i valori.


Rispetto +1 e grazie per aver
accettato

A volte vorrei poter dare 2 voti.
ElPedro,

1
Puoi salvare due caratteri sull'ultima riga scrivendolo in questo modo:for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Willem,

7

Autovim , 85 81 byte

Nessuna animazione, probabilmente ancora giocabile a golf ... Comunque, non male per il nuovo bambino sul blocco! (Autovim)

ñ9am␛ÿP2xÿP4xyjGpđp2o
%ce 15
®q=8j$p
®z=6␍"_d3hP
ñğyG12PğÿPC^o^␛v^y6@q==o␛6@z==O

Per eseguirlo:

autovim run ascii-bat.autovim -ni

Spiegazione

In breve, disegniamo la luna, la copiamo e incolliamo 12 volte e usiamo due macro: una per aggiungere la mazza sulle prime 7 lune, l'altra per anteporre le ultime 6.

" Draw the moon
ñ                                 " Normal mode
 9am␛                            " Write 9 `m`
      ÿP                          " Duplicate the line
        2x                        " Delete two characters
          ÿP                      " Duplicate the line
            4x                    " Delete 4 characters
              yj                  " Yank two lines
                Gp                " Paste at the end of the file
                  đp              " inverts the current line with the previous
                    2o            " Add two line breaks

%ce 15                            " Center our moon

" Macros
®q=8j$p                           " Macro `q` jumps 8 lines, and pastes
                                  "   at the end
®z=6␍"_d3hP                      " Macro `z` jumps 6 lines and replaces
                                  "   the previous 3 characters by the default

" Draw all 12 moons and add the bats
                                  "   register's content
ñ                                 " Run in normal mode
 ğyG                              " Copy the moon we just drew
    12P                           " Duplicate the moon 12 times
       ğÿP                        " Duplicate the top line (gets 3 centered `m`)
          C^o^␛                  " Change the mmm by a bat
                v^y               " Copy the bat we just drew
                   6@q            " Add the first 6 bats
                      ==          " Center the bat
                        o␛       " Add a line under the bat
                           6@z    " Add the 6 last bats
                              ==  " Align the last bat in the center
                                O " Add a line over the last moon

1
Ho seguito le istruzioni per il download, ho installato VIM e ho finito con: VIM - Vi IMproved 7.4 (10 agosto 2013, compilato il 9 dicembre 2014 17:36:41) Argomento opzione sconosciuta: "--not-a-term" Ulteriori informazioni con: "vim -h" Non ho tempo di guardarlo ora, ma ci sarà uno spettacolo stasera. Sembra un progetto interessante.
ElPedro,

1
Se hai del tempo libero, apri un problema con GitHub: funziona sul mio telefono (Termux, una distribuzione Linux) e su Windows in Git Bash. Mi piacerebbe farlo funzionare ovunque! La mia ipotesi migliore è che VIM compilato nel 2013 potrebbe davvero non essere l'ultima versione :) (ultima versione è la 8.0)
Christian Rondeau

OK. Ho appena installato dal gestore dei pacchetti, quindi forse proverò l'opzione di aggiornamento. Ti farò sapere cosa succede.
ElPedro,

1
Problema sollevato su GitHub come richiesto. Sentiti libero di ignorare / rifiutare se non lo consideri un problema poiché l'aggiornamento lo ha risolto.
ElPedro,

1
Questo significa che funziona ora! Grande!
Christian Rondeau,

7

PHP, 167 byte

Ho realizzato un piccolo programma in PHP:

<?php foreach([0,3,7,9,7,3,0]as$l)$b.=str_pad(str_repeat('=',$l),15," ",2)."\n";foreach([6,25,43,60,75,89,102,83,65,48,33,19,6]as$x)echo substr_replace($b,'^o^',$x,3);

Ecco una versione più dettagliata:

// width of the moon
$moonsizes = [0,3,7,9,7,3,0];
// position where to place the bat
$positions = [6,25,43,60,75,89,102,83,65,48,33,19,6];
// prepare base moon painting
foreach($moonsizes as $size){
    $basepainting .= str_pad(str_repeat('=',$size),15," ",STR_PAD_BOTH)."\n";
}
// loop frames and place bat
foreach($positions as $position) {
    echo substr_replace($basepainting,'^o^',$position,3);
}

Questo è il mio primo codegolf, se hai qualche suggerimento sono felice di sentirti :)


Benvenuti in PPCG! Bella prima risposta. Grazie.
ElPedro,

7

Python 2, 112 byte

b=['   ','^o^']
for k in range(91):r=k%7;print(b[k/7+r==12]*(r%6>0)+(r*(6-r)*8/5-5)*'m'+b[k/7%12==r]).center(15)

Stampa l'immagine. Ogni riga ha tre parti

  • Un potenziale pipistrello a sinistra
  • Qualche numero di mper la luna
  • Un potenziale pipistrello a destra

Queste parti sono concatenate e centrate in una scatola di dimensioni 15 per la spaziatura. Per evitare che i pipistrelli spostino il centro, un pipistrello mancante ha tre spazi, della stessa lunghezza. Per i pipistrelli sopra o sotto la luna, lo slot della barra sinistra viene omesso e lo slot destro è occupato.

Ci sono 91 linee: un'immagine a 7 linee per ciascuna delle 13 immagini. Questi vengono contati tramite divmod: come kconta da 0a 91, (k/7, k%7)va

(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(0, 5)
(0, 6)
(1, 0)
(1, 1)
 ....
(12, 5)
(12, 6)

Prendendo il primo valore k/7come immagine e il secondo valore r=k%7come numero di riga all'interno dell'immagine, questo viene conteggiato prima per immagine, quindi per numero di riga all'interno di ciascuna immagine, entrambi con indice 0.

Il numero di m"s" nella luna cambia con il numero di riga r=k%7come [0,3,7,9,7,3,0]. Invece di indicizzarlo, una formula era più breve. Un comodo grado di libertà è che 0può essere qualsiasi valore negativo, dato che questo dà ancora la stringa vuota quando moltiplicato per m. Giocare con una parabola e dividere il pavimento ha dato una formula r*(6-r)*8/5-5.

Ora, guardiamo a scegliere se disegnare una mazza o uno spazio vuoto su entrambi i lati. L'array b=[' ','^o^']contiene le opzioni.

La mazza nella riga 0 nella figura 0 (in alto), nella riga 1 nella figura 1 (a destra), nella riga 6 nella figura 6 (in alto). Quindi, è facile verificare se esso appare come il numero di riga e immagine come parità di condizioni, k/7==r. Ma abbiamo anche bisogno che l'immagine 12 assomigli all'immagine 0, quindi prendiamo prima il numero di immagine modulo 12.

A sinistra è simile. Il pipistrello appare a sinistra in file r=5,4,3,2,1nelle immagini 7,8,9,10,11. Quindi, controlliamo se il numero di riga e di immagine sommano a 12. Ci assicuriamo anche di non tracciare nient'altro che tre spazi sulle file 0e 6- la fessura della mazza giusta disegnerà la mazza, e non dobbiamo incasinare il suo centraggio.


1
Qualche possibilità di una rapida spiegazione @xnor? L'ho eseguito e sicuramente funziona, quindi non è necessaria alcuna spiegazione, ma se hai tempo e l'inclinazione sarebbe interessante per scopi educativi :)
ElPedro,

+1 per "Giocherellare con una parabola e dividere il pavimento ..." - se dovessi indovinare, è la prima volta che quella frase è stata usata in PPCG ... :-)
zmerch

Grazie @xnor. Spiegazione eccezionale. Dovrò passare un po 'di tempo a studiare questo :)
ElPedro,

6

C #, 615 582 337 byte

Questo è il mio primo tentativo (ancora troppo leggibile) in uno di questi, quindi sarò lieto di ricevere qualsiasi suggerimento per radere qualche centinaio di byte! In cima alla mia lista in questo momento c'è un modo più breve per creare l'array lunare.

void M(){string[]m={"","      mmm","    mmmmmmm","   mmmmmmmmm","    mmmmmmm","      mmm",""};var b="^o^";for(int x=0;x<13;x++){var a=(string[])m.Clone();int n=x>6?12-x:x;int[] j={0,1,3,6};a[n]=!a[n].Contains("m")?"      "+b:x<=n?a[n]+b:new string(' ',j[Math.Abs(9-x)])+b+a[n].Replace(" ","");foreach(var c in a){Console.WriteLine(c);}}}

Ungolfed (include loop!)

class Program {
    public static string[] moon = new string[] { "               ", "      mmm      ", "    mmmmmmm    ", "   mmmmmmmmm   ", "    mmmmmmm    ", "      mmm      ", "               " };

    public static string bat = "^o^";

    static void Main(string[] args) {
        while (true) {
            Fly();
        }
    }

    static void Fly() {
        int times = (moon.Length * 2) - 1;
        for (int x = 0; x < times; x++) {
            string[] temp = (string[])moon.Clone(); //create a new array to maintain the original

            int index = x >= moon.Length ? times - x - 1 : x;

            if (!temp[index].Contains("m")) {
                temp[index] = new string(' ', 6) + bat + new string(' ', 6);
            } else if (x <= index) {
                int lastM = temp[index].LastIndexOf('m') + 1;
                temp[index] = temp[index].Insert(lastM, bat);
            } else {
                int firstM = temp[index].IndexOf('m');
                char[] src = temp[index].ToCharArray();
                int i = firstM - bat.Length;
                src[i] = bat[0];
                src[i + 1] = bat[1];
                src[i + 2] = bat[2];

                temp[index] = new string(src);
            }

            for (int y = 0; y < temp.Length; y++) {
                Console.WriteLine(temp[y]);
            }
            Thread.Sleep(100);
            Console.Clear();
        }            
    }
}

Modificare:

Sono stati eliminati 21 byte rimuovendo gli spazi finali nella dichiarazione dell'array. Invece di una griglia di 15 caratteri di larghezza, ogni riga è larga solo per adattarsi alla mazza. Rimossi altri 12 per la stringa inutile [] args nella Main()dichiarazione.

Modifica 2:

Riscritta gran parte della logica, eliminando 245 byte! Include le modifiche suggerite dai commenti. Grazie!

Dai commenti, è stata trasformata in una funzione M()anziché nel Main()metodo precedente , quindi ora è necessario chiamarla esternamente.


Benvenuti in PPCG! :)
Martin Ender,

Benvenuto e simpatico primo sforzo! Grazie per la tua risposta. Non sono un esperto #, quindi probabilmente non posso aiutarti molto, ma sono sicuro che troverai molti membri della community che saranno felici di aiutarti.
ElPedro,

2
È possibile salvare alcuni byte rimuovendo il new string[]da me semplicemente mettendo string[]m={...}.
Pokechu22,

2
Può proteggere qualche byte in più usando var's in luoghi come string[]w=(string[])m.Clone();- var w=(strin[])m.Clone();
MX D

1
@ElPedro Certo, lo prenderò! Funziona certamente come una funzione richiamabile che produce il risultato desiderato. Aneddoticamente, ho provato a riscriverlo di nuovo e ho trovato una soluzione piuttosto "intelligente". Con mio grande dispiacere, sono finito +1 dal conteggio dei byte corrente, quindi penso che lo lascerò qui - grazie per una sfida davvero divertente! Questo certamente mi ha insegnato alcune cose nuove.
levelonehuman,

6

Python 2, 299 300 290 270 byte

Giocato a golf fino a 270 dopo aver acquisito un po 'più esperienza di golf.

L'implementazione di riferimento è diminuita di 321 320 330 byte. Non carino o elegante. Usa solo la stringa della forza bruta e la suddivisione in liste. È stato divertente ottenere il conto alla rovescia dei byte, ma penso che l'approccio fosse completamente sbagliato all'inizio per un concorrente serio.

Non mi aspetto che questa risposta sia presa sul serio, quindi per favore, nessun voto negativo. Nella domanda ho detto che avrei provato a golfare l'implementazione di riferimento e questo è esattamente questo. Appena pubblicato per divertimento.

c,e,n=' ','m','\n';f,g=c*9+e*3+c*9,c*7+e*7+c*7;h=9,12;i=12,15;j=6,9;k=13,17;l=4,7;m=c*21,f,g,c*6+e*9+c*6,g,f,c*21;p=h,i,k,(15,18),k,i,h,j,l,(3,6),l,j,h;w=0
for z in map(int,'0123456543210'):print n.join(m[:z])+n+m[z][:p[w][0]]+'^o^'+m[z][p[w][1]:]+n+n.join(m[z+1:]);w+=1

Provalo online!


3

Rubino, 164 156 byte

puts Zlib.inflate Base64.decode64 "eNqlkrUVAAEMQvtMcZP9DfLYvzo3qhNSxQ2GVRC1ad29ar1JXaoHbul16Yig+p6BCKqtFBFU+1IE1famoHrX/jZBvN8e8f5tiE94Ib4SBREwNKH5BNJy2QM="

Programma molto semplice. Si può lavorare di più. Si prega di lasciare suggerimenti nei commenti.


Bella risposta. Al momento sto giocando con Ruby perché sembra molto meno prolisso di Python quando si tratta di giocare a golf.
ElPedro,

3
@ElPedro Questo è solo il testo privo di spazi vuoti finali, zlib compresso e codificato base64. Nessuna azione di Ruby magica da nessuna parte.
dkudriavtsev,

Continuo a pensare che questo approccio sarebbe molto più pesante con Python a meno che qualcuno non voglia dimostrarmi che mi sbaglio (@Jonathan forse? :))
ElPedro,

Welp, ho dimenticato di includere alcune librerie e SE non me lo lascerà fare. Qualcuno può includere le librerie base64e zlibnel modo più breve possibile e aggiungerle al conteggio dei byte?
dkudriavtsev,

C'è qualche differenza tra putse say? Non ho familiarità con Ruby.
Roman Gräf,

2

/// , 205 byte

/*/\/\///B/^o^*9/         
*M/mmm*N/MM*O/   *0/OO*n/

*1/O Nm0
*2/NM0
*3/0M9*4/1O2*7/13n*5/34/0B9570MB0
473O NmBO 
O2731ONMBO
75O NmBO 
3n510MB0n
5130B9n51OBM9n5 BNm0 
3n31B273 BNm0 
O27OBM9470B90M0O
410MO

Provalo online!

Solo se non avessi bisogno di tonnellate di spazi finali ...


2

Parotite, 223 byte

Questo utilizza InterSystems Cache Mumps - consente parentesi graffe attorno ai loop che lo rendono utile per i loop nidificati in una sola riga.

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

Probabilmente potrei giocare a golf di più, e potrei giocarci quando avrò più tempo. Aggiungi altri 9 byte e verrà animato [[a causa dell'aggiunta di 'H 1 W #' -> che si ferma per un secondo e cancella lo schermo:

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 H 1 W # F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

Ecco una versione non spiegata / spiegata (della versione animata), con le istruzioni 'do' e i loop di punti corretti:

 S X="09121415141209060403040609"
 S R="097679",L="037973",S=-14              ; Initialize Variablex
 F Y=1:1:13 D                               ; Set up our main loop of 13 cels
 . S S=S+2                                  ; set up secondary counter, for start char.
 . H 1                                      ; halt for 1 second
 . W #                                      ; clear screen
 . F C=1:1:7 D                              ; set up our per-line loop
 . . S F=$E(X,Y*2-1,Y*2)                    ; set F to 2-digit "start of bat"
 . . S (M,T)=""                             ; set our "builder" lines to empty strings
 . . S $P(T," ",21)=""                      ; then reset our main 'line string' to 21 spaces.
 . . F A=1:1:$E(L,C){S M=M_"m"}             ; make our 'moon' text.
 . . S $E(T,$E(R,C))=M                      ; and insert our 'moon' into the empty line
 . . S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^"  ; find the start character for our 'bat' and insert.
 . . W T,!                                  ; and write the line and a CR/LF.

Ho provato a fare il jazz "comprimere quindi Base-64 codificato" solo per vedere cosa sarebbe successo, ma la stringa codificata è finita un po 'più a lungo del programma stesso! Questo e le richieste di sistema della cache per la compressione e la codifica base64 sono piuttosto lunghe ... ad esempio, ecco la chiamata di sistema per decodificare base64: $ System.Encryption.Base64Decode (STRING)

Quel metodo avrebbe 'gonfiato' il programma a oltre 300 caratteri, penso ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.