Noel Baba Evi


16

Noel Baba Evi

Not: Bu, belirlemeye çalıştığım ilk zorluk. Sandbox üzerinden geçti ancak bununla ilgili yanlış bir şey bulursanız, lütfen aşağıya inmeyin, onu geliştirebilmem için bir yorum bırakın.

Arka fon

Eski bir çocuk bulmacası, çatıyı bir kutu ve ortadan bir haç ile kaleminizi kağıttan kaldırmadan veya iki kez herhangi bir çizginin üzerinden geçmeden çizmektir.

Almanya'da "das Haus des Nikolaus" veya "Noel Baba'nın Evi" olarak bilinir. Dürüstçe dediğimiz şeyi hatırlayamıyorum. Bulmacayı bilmeyen herkes için tüm ayrıntıları burada bulabilirsiniz .

İşte evin ASCII sanat temsili.

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

Meydan okuma

Noel Baba Evi'ni istediğiniz herhangi bir dilde çizmek için bir program veya işlev yazın.

Kulağa çok mu kolay geliyor? İşte yakalama. Ayrıca çizimin her aşamasını çıkarmalı ve bulmacanın kurallarına uymalıdır. Programınızın herhangi bir girdi alması gerekmez. Bitmiş ev tam olarak yukarıda gösterildiği gibi görünmelidir.

Yukarıdaki siteye göre 44 olası çözüm var. Bunlardan herhangi birini kullanabilirsiniz. Bu bir ASCII sanat mücadelesidir, bu nedenle çözümü hesaplamanız gerekmez, sadece çizmeniz gerekir.

Çıktı

44 çözümden birinden gerekli çıktıya bir örnek aşağıda gösterilmiştir:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

kurallar

  • Gereksinimleri daha net hale getirmek için beklenen her çıktı arasına 1 ekstra yeni satır ekledim. Bu isteğe bağlıdır. Her çıkış arasında herhangi bir sayıda boş satıra izin verilir.
  • Çıktınız, yukarıda gösterildiği gibi yalnızca /, \, -, _ ve boşluk karakterlerinden oluşmalıdır. Sondaki boşluklara izin verilir.
  • Çiziminizdeki her satır bir önceki satırın sonundan devam etmelidir ve herhangi bir satırı tekrarlayamayabilirsiniz.
  • Standart boşluklar yasaktır.
  • Yukarıdaki linkte belirtilen kafiyeyi çıkarmanız gerekmez.
  • Bu kod golf yani baytlar içinde en kısa cevap kazanan olacak.

Sonuç

Gönderen herkese bazı büyük cevaplar, teşekkürler ve saygılarımla. En düşük bayt sayısı dedim ama sadece bunun için değil, aynı zamanda kodun büyük açıklaması için de en iyi cevap olarak işaretledim. Güzel bir @Dennis.


Bu, sanal alanda biraz zaman harcayabilirdi . Evin büyüklüğü veya birleştirilmiş evlerin sayısı (veya her ikisi için) için bir parametre eklemeyi deneyin. Olduğu kadar kolay buluyorum. Ayrıca kafiyeyi örnek çıktınıza eklemek veya hiç bahsetmemek de isteyebilirsiniz. Bu gif'i güzel buluyorum , ya da bu .
Titus


4
@Titus Geri bildiriminiz için teşekkür ederiz. Niyetim, özellikle zor bir zorluk yaratmak değil, oldukça kolay yapılabilen ve mümkün olduğunca çok insanı çözüm önerileri getirmeye teşvik eden bir zorluk yaratmaktı. Bir sonraki denemem için önerilerinizi gemiye alacağım.
ElPedro

1
Benim hatam; Ascii sanatı için çok karmaşık şeyler bekliyordum. :) Ama yine de gifleri seviyorum.
Titus

Yanıtlar:


10

Jöle , 40 39 36 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

“ḥ%DtƊVḍI’

iki yönlü bir taban-250 değişmezidir; her karakter Jelly'in kod sayfasındaki kod noktasına karşılık gelir . Sonuç, 13192938935880491074 tamsayıdır .

          ḃ9

üretilen tamsayıyı iki yönlü tabana 9 dönüştürür, tam sayı dizisini verir
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Tamsayılar , bir boşluğu gösteren 9 hariç, konturun sırasına karşılık gelir .

            W

oluşturulan diziyi, şimdi oluşturacağımız diziye eklemek için gereken tek bir diziye sarar.

              “|_/-\/\|‘Ė¤

aşağıdaki gibi çalışır. ¤soldaki iki bağlantıyı niladik bir zincir halinde birleştirir. Birincisi “|_/-\/\|‘, belirtilen karakterlerin kod noktalarını verir ve [124, 95, 47, 45, 92, 47, 92, 124] verir . Ardından, Ėkod noktalarını numaralandırarak
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . [N, c] çifti , n. Vuruşun kod noktası c olan ASCII karakteri olacağı anlamına gelir .

             ;

oluşturulan dizileri birleştirir. Sonuç
[[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@\

ytakas argümanları ( @) ile transliteration ( ) kullanarak kümülatif (yani tüm ara adımları göstererek) azaltma gerçekleştirir . İlk adımda, örneğin, her yerini 1 ile orijinal dizideki 124 karakterin kod noktasıdır, | .

                             FỌ

sonucu düzleştirir ve tüm kod noktalarını karşılık gelen ASCII karakterleriyle değiştirir. Tüm adımlarda, 1 ila 9 kod noktalarına sahip yazdırılamayan bazı karakterler oluşturur .

                               »⁶

yazdırılamaz tüm karakterleri boşluklarla değiştirerek karakter olarak maksimum boşluk karakteri alır.

                                 s4Y

oluşturulan dizeyi dört uzunluktaki parçalara ayırır ve ayırıcı olarak bir satır besleme ile birleştirir.


2
Vay. Sadece vay canına. +1
ElPedro

Ama bekleyin, bunlar bayt mı?
Leif Willerts

1
@LeifWillerts Evet. Yazdırılamayan karakterlerden kaçınmak için Jelly, anladığı 256 karakteri tek bir bayt olarak kodlayan özel bir kod sayfası kullanır. Bayt buna başlık noktalarında bağlar.
Dennis

O zaman bu bağlantıyı tıklamaya karar veremediğim için üzgünüm: D
Leif Willerts

Açıklama için herhangi bir şey kadar kazanır. Saygı.
ElPedro

13

Javascript (ES6), 119 116 96 92 91 bayt

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


Güzel cevap. Javascript orada ya da orada olacağını hissettim :-)
ElPedro

Birden çok düzenleme için özür dileriz. Ben 2. kahve önce göndermemelisiniz.
Arnauld

Birden çok düzenleme iyidir. Bayt sayısının düştüğünü görmek güzel.
ElPedro

Cevabınızda kodun iki özdeş kopyasına sahip olmanın bir anlamı var mı?
Neil

@Neil - İkisine sahip olmak için iyi bir neden bulana kadar sadece bir tane tutacağım. ^^
Arnauld

9

Toplu, 356 344 341 337 bayt

@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

Aptal Toplu |alıntı kuralları ... Eğer |bir değişken istiyorsanız, üç ^s ile alıntı yapmanız gerekir , bu yüzden bunun @yerine kullanmak ve çıkışta yerine kullanmak daha ucuzdur , ancak bunu başarmak için sol duvarla başlamak zorundayım. Birinci satırın sonunda bir boşluk vardır. echo(Çünkü kullanılır r, cve fdeğişkenler boş olabilir ve biz istemediğiniz ECHO is off.basılmış.

Düzenleme: Son bölüm için geçiş kullanarak 12 bayt kaydedildi. forHer parçayı yazdırmak için bir döngü kullanarak 3 bayt kaydedildi , bu da artık |değişkenlerimde s'yi kullandığım ve bu da kodun okunmasını biraz daha kolay hale getirdi. @Bunun yerine açık karakterler kullanarak 4 bayt kaydedildi @echo off. Sol duvardan başlamak için hala en az bayt gerekiyor.


2
En kısa olabilir ama aslında Toplu 1 bunu yapmak için yönetmek için benden bir upvote alır olmayabilir
ElPedro

echo:daha standarttır, ancak echo(bir dil özelliğini kötüye kullandığınız anlaşılıyor, bu nedenle +1.
wizzwizz4

@ wizzwizz4 echo:bazı belirsiz durumlarda başarısız olur, ancak herhangi bir başarısızlık vakası bilmiyorum echo(.
Neil

@ wizzwizz4 foo.batGeçerli dizinde bir dosyanız varsa , echo(\..\foo.batechos \..\foo.batama echo:\..\foo.batyürütür foo.bat.
Neil

@Neil Bunun neden olduğunu biliyor musun? Bunun echo:.\foo.batyerine bu etkiye sahip gibi görünüyor . Bir dizin yığını aksaklık nedeniyle mi, nerede kök dizinden "UP" geçerli dizindir?
wizzwizz4

7

C, 118 bayt

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

Etkileyici! Güzel ilk cevap ve siteye hoş geldiniz!
DJMcMayhem

1
3 bayt kaydetmek için: char*p(boşluk) ve değişim 'B've 'J'ASCII kodları.
Level River St

Cevap için teşekkürler. C'nin bile rekabet etmesini beklemiyordum. Bu gerçekten etkileyici ve +1 değerinde
ElPedro

6

/// , 112 bayt

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

Çevrimiçi deneyin!


Ben 112 tek bir bayt anlamıyorum ama çevrimiçi denedim ve tam olarak teneke ne diyor yok + 1
ElPedro

1
@ElPedro Başlıktaki bağlantıyı tıklamayı deneyin, kavramı anlayabilirsiniz, ancak değilse, o zaman bana geri dönün. Giderek daha fazla insanın bir dili anlayabilmesini istiyorum ve eğer bilmiyorsanız, bu üzücü bir gerçektir. Herkesin /// anlamasını sağlayamayacağımı biliyorum (bazı insanlar sadece yiyecek ve su istiyor , /// ve PPCG imkansız olmasa da bundan çok uzak).
Outgolfer Erik

Teşekkürler. Öğrenilecek çok dil var! Kesinlikle bir göz atacağım. Hala Python ve Lotus Formula'da golf oynuyorum ama daha fazlasına giriyorum. Daha fazla dil daha eğlencelidir. Katkılarınız için tekrar teşekkürler :)
ElPedro

2

PHP, 98 95 bayt

Arnauld'un çözümünden ilham aldı

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

Not: İlk kod satırının sonunda bir boşluk vardır.


Güzel bir @ @ Titus. Sondaki boşluklara izin verilir.
ElPedro

@ElPedro: Sadece editörleri otomatik olarak kırpmak üzere yapılandıran bazı insanlar tanıyorum; bu yüzden bahsetmiştim.
Titus

1

GD'li PHP, 348338 bayt (rakip değil)

tam olarak ne isteniyordu, ama ...

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

dosyaya kaydet, bir tarayıcıda ara

Yıkmak

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

Daha büyük bir ev çizmek $w=9için, istediğiniz genişliğe değiştirin .


Ve ben de buna +1 verdim. Doğrudan mücadeleyi ele
almasa da
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.