La casa di Babbo Natale


16

La casa di Babbo Natale

Nota: questa è la prima sfida che ho tentato di impostare. È stato attraverso il Sandbox tuttavia se trovi qualcosa di sbagliato in esso, ti preghiamo di non solo fare un voto negativo ma lasciare un commento in modo che io possa migliorarlo.

sfondo

C'è un vecchio puzzle per bambini in cui la sfida è disegnare una scatola con un tetto e una croce nel mezzo senza sollevare la penna dal foglio o passare due volte su una linea.

In Germania è noto come "das Haus des Nikolaus" o "La casa di Babbo Natale". Onestamente non ricordo come lo chiamavamo. Per chiunque non abbia familiarità con il puzzle, i dettagli completi sono disponibili qui .

Ecco una rappresentazione in arte ASCII della casa.

 /\
/__\
|\/|
|/\|
----

Sfida

Scrivi un programma o una funzione per disegnare la Casa di Babbo Natale in qualsiasi lingua tu scelga.

Sembra troppo facile? Bene, ecco il trucco. Deve anche generare ogni fase del disegno e rispettare le regole del puzzle. Il tuo programma non è tenuto a prendere alcun input. La casa finita deve apparire esattamente come mostrato sopra.

Secondo il sito sopra ci sono 44 possibili soluzioni. Puoi usarne uno qualsiasi. Questa è una sfida di arte ASCII, quindi non è necessario calcolare la soluzione ma solo disegnarla.

Produzione

Di seguito è riportato un esempio dell'output richiesto da una delle 44 soluzioni:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

 /\
/__\
|\
| \
----

 /\
/__\
|\/
|/\
----

 /\
/__\
|\/|
|/\|
----

Regole

  • Ho aggiunto 1 newline extra tra ogni output previsto per cercare di rendere più chiari i requisiti. Questo è facoltativo È consentito qualsiasi numero di righe vuote tra ogni output.
  • L'output deve essere composto solo dai caratteri /, \, -, _ e spazio come mostrato sopra. Sono consentiti spazi finali.
  • Ogni linea nel disegno deve continuare dalla fine della linea precedente e non è possibile ripetere alcuna linea.
  • Scappatoie standard vietate.
  • Non è necessario generare la rima menzionata nel link sopra.
  • Questo è il golf del codice, quindi la risposta più breve in byte sarà il vincitore.

Risultato

Alcune grandi risposte e grazie e rispetto per tutti coloro che hanno pubblicato. Ho detto il conteggio di byte più basso, ma ho contrassegnato come risposta principale non solo per questo, ma anche per la grande spiegazione del codice. Bello @Dennis.


Ciò avrebbe potuto trascorrere del tempo nella sandbox . Prova ad aggiungere un parametro per la dimensione della casa o per il numero di case concatenate (o entrambe). Lo trovo troppo facile così com'è. Potresti anche voler aggiungere la rima al tuo esempio di output - o non parlarne affatto. Trovo carino questo gif o questo .
Tito,


4
@Titus Grazie per il feedback. La mia intenzione non era quella di creare una sfida particolarmente difficile, ma di crearne una che fosse abbastanza facilmente realizzabile e quindi incoraggiare quante più persone possibile a proporre soluzioni. Prenderò in considerazione i tuoi suggerimenti per il mio prossimo tentativo.
ElPedro,

1
Colpa mia; Mi aspettavo cose troppo complesse per l'arte ASCII. :) Ma mi piacciono ancora le gif.
Tito,

Le gif sono fantastiche e mi piace anche l'idea di includere la rima anche in una lingua scelta :)
ElPedro,

Risposte:


10

Gelatina , 40 39 36 byte

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘ˤy@\FỌ»⁶s4Y

Provalo online!

Come funziona

“ḥ%DtƊVḍI’

è una base biiettiva-250 letterale; ogni personaggio corrisponde al suo punto di codice nella codepage di Jelly . Il risultato è il numero intero 13192938935880491074 .

          ḃ9

converte il numero intero generato in base biiettiva 9, producendo la matrice di numeri interi
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Gli interi corrispondono all'ordine del tratto, ad eccezione di 9 , che indica uno spazio.

            W

avvolge l'array generato in un array singleton, che sarà richiesto per anteporre l'array che genereremo ora.

              “|_/-\/\|‘ˤ

funziona come segue. ¤combina i due collegamenti a sinistra in una catena niladica. Il primo, “|_/-\/\|‘fornisce i punti di codice dei caratteri specificati, ottenendo [124, 95, 47, 45, 92, 47, 92, 124] . Quindi, Ėenumera i punti di codice, ottenendo
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . La coppia [n, c] significa che il n ° ictus sarà il carattere ASCII con punto di codice c .

             ;

concatena le matrici generate. Il risultato è l'array
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8.124]] .

                          y@\

esegue una riduzione cumulativa (cioè mostrando tutti i passaggi intermedi), usando transliteration ( y) con argomenti scambiati ( @). Nel primo passaggio, ad esempio, sostituiamo ogni 1 nell'array originale con 124 , che è il punto di codice del carattere | .

                             FỌ

appiattisce il risultato e sostituisce tutti i punti di codice con i caratteri ASCII corrispondenti. In tutti i passaggi, ciò genererà alcuni caratteri non stampabili con i punti di codice da 1 a 9 .

                               »⁶

prende il massimo dal punto di vista del carattere con il carattere spazio, sostituendo tutti gli caratteri non stampabili con spazi.

                                 s4Y

divide la stringa generata in blocchi di lunghezza quattro e li unisce con un avanzamento di riga come separatore.


2
Wow. Semplicemente wow. +1
ElPedro,

Ma aspetta, quelli sono byte?
Leif Willerts,

1
@LeifWillerts Sì. Per evitare caratteri non stampabili, Jelly utilizza una tabella codici personalizzata che codifica i 256 caratteri che comprende come un singolo byte ciascuno. Il collegamento byte nell'intestazione punta ad esso.
Dennis,

Scusate quindi per non aver capito di fare clic su quel link: D
Leif Willerts,

Vince tanto per la spiegazione quanto altro. Rispetto.
ElPedro,

13

Javascript (ES6), 119 116 96 92 91 byte

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))


Bella risposta. Avevo la sensazione che Javascript sarebbe stato lì o nei dintorni :-)
ElPedro,

Ci scusiamo per le modifiche multiple. Non dovrei postare prima del secondo caffè.
Arnauld,

Le modifiche multiple sono buone. Bello vedere il conteggio dei byte in calo.
ElPedro,

Ha senso avere due copie identiche del codice nella tua risposta?
Neil,

@Neil - Ne terrò solo uno finché non troverò una buona ragione per averne due. ^^
Arnauld,

9

Lotto, 356 344 341 337 byte

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

Stupide |regole di quotazione in batch ... se vuoi una |in una variabile, devi quotarla con tre ^s, quindi è più economico usarla @invece e sostituirla in output, anche se per raggiungere questo obiettivo devo iniziare con il muro sinistro. La linea uno ha uno spazio finale. echo(viene utilizzato perché il r, ce fvariabili potrebbero essere vuoto e noi non vogliamo ECHO is off.stampati.

Modifica: salvato 12 byte utilizzando fallthrough per l'ultima parte. forHo salvato 3 byte usando un ciclo per stampare ogni parte, questo significa che ora uso |s nelle mie variabili, il che rende il codice leggermente più facile da leggere. Salvato 4 byte utilizzando @caratteri espliciti anziché @echo off. Penso che a partire dalla parete sinistra richieda ancora il minor numero di byte.


2
Potrebbe non essere il più breve, ma ottiene un voto da me per essere effettivamente riuscito a farlo in Batch +1
ElPedro,

echo:è più standard ma echo(sembra che tu stia abusando di una funzione della lingua, quindi +1.
wizzwizz4,

@ wizzwizz4 echo:fallisce in alcuni casi oscuri, ma non conosco alcun caso di fallimento echo(.
Neil,

@ wizzwizz4 Se hai un file foo.bat nella directory corrente, echo(\..\foo.batechos \..\foo.batma echo:\..\foo.batviene eseguito foo.bat.
Neil,

@Neil Sai perché? Sembra che echo:.\foo.batavrebbe invece quell'effetto. È a causa di un glitch dello stack di directory, dove "UP" dalla directory principale è la directory corrente?
wizzwizz4,

7

C, 118 byte

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}

Degno di nota! Bella prima risposta e benvenuta nel sito!
DJMcMayhem

1
Per salvare 3 byte: char*p(nessuno spazio) e modificare 'B'e 'J'nei loro codici ASCII.
Level River St,

Grazie per la risposta. Non mi aspettavo che C competesse. Questo è davvero impressionante e vale la pena fare +1
ElPedro,

6

/// , 112 byte

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

Provalo online!


Non capisco un singolo byte del 112 ma l'ho provato online e fa esattamente quello che dice sulla scatola, quindi +1
ElPedro,

1
@ElPedro Prova a fare clic sul collegamento nell'intestazione, potresti capire il concetto, ma, in caso contrario, torna da me. Voglio che sempre più persone siano in grado di capire una lingua e, in caso contrario, è un fatto triste. So che non posso semplicemente far capire a tutti /// (alcune persone vogliono solo cibo e acqua, /// e PPCG sono lontani da questo, anche se non impossibile).
Erik the Outgolfer,

Grazie. Ci sono così tante lingue da imparare! Sicuramente darò un'occhiata. Sto ancora giocando a golf in Python e Lotus Formula, ma mi sto interessando di più. Più lingue è più divertente. Grazie ancora per il tuo contributo :)
ElPedro,

2

PHP, 98 95 byte

ispirato alla soluzione di Arnauld

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

Nota: la prima riga di codice ha uno spazio finale.


Bello @Titus. Sono consentiti spazi finali.
ElPedro,

@ElPedro: conosco solo alcune persone che hanno configurato lì gli editor per tagliarli automaticamente; ecco perché l'ho menzionato.
Tito,

1

PHP con GD, 348 338 byte (non in competizione)

non esattamente quello che veniva chiesto, ma ...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

salva su file, chiama in un browser

abbattersi

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

Per disegnare una casa più grande, modifica $w=9la larghezza desiderata.


E do a questo anche un +1. Anche se non affronta la sfida diretta, copre i miglioramenti suggeriti e sembra molto bello :)
ElPedro,
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.