サンタクロースの家


16

サンタクロースの家

注:これは、私が設定しようとした最初の課題です。サンドボックスを経由しましたが、何か問題が見つかった場合は、ただ投票するだけでなく、コメントを残してください。

バックグラウンド

ペンを紙から持ち上げたり、ラインを2回越えたりせずに、屋根と真ん中に十字架のある箱を描くことが課題である古い子供向けパズルがあります。

ドイツでは「das Haus des Nikolaus」または「The House of Santa Claus」として知られています。正直なところ、私たちがそれを何と呼んでいたのか思い出せません。パズルに慣れていない方は、詳細をこちらでご覧ください

これは家のASCIIアート表現です。

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

チャレンジ

あなたの好きな言語でサンタクロースの家を描くためのプログラムや機能を書いてください。

簡単すぎるように聞こえますか?さて、ここにキャッチがあります。また、図面の各段階を出力し、パズルのルールに準拠する必要があります。プログラムは、入力を行う必要はありません。完成した家は上記のように正確に見える必要があります。

上記のサイトによると、44の可能な解決策があります。いずれかを使用できます。これはASCIIアートの課題であるため、解を計算する必要はなく、それを描くだけです。

出力

44のソリューションの1つからの必要な出力の例を以下に示します。

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

ルール

  • 要件を明確にするために、予想される各出力の間に1つの余分な改行を追加しました。これはオプションです。各出力間に任意の数の空白行が許可されます。
  • 出力は、上記のように文字/、\、-、_、およびスペースのみで構成されている必要があります。末尾のスペースは許可されます。
  • 図面内の各行は前の行の最後から継続する必要があり、行を繰り返すことはできません。
  • 標準的な抜け穴は禁止されています。
  • 上記のリンクに記載されている韻を出力する必要はありません。
  • これはコードゴルフなので、バイト単位の最短回答が勝者になります。

結果

投稿したすべての人に対するいくつかの素晴らしい回答と感謝と敬意。最小バイトカウントは言いましたが、それだけでなくコードの素晴らしい説明でもトップアンサーとしてマークしました。ナイスワン@デニス。


これはサンドボックスでしばらく時間を費やしたかもしれません。家のサイズまたは連結された家の数(または両方)のパラメーターを追加してみてください。簡単すぎると思います。韻をサンプル出力に追加することも、まったく言及しないこともできます。私は見つけるこのGIFの素敵な、またはこのいずれかを
タイタス


4
@Titusフィードバックをありがとう。私の意図は、特に難しい課題を作成することではなく、かなり簡単に実行できるものを作成し、可能な限り多くの人々に解決策を提案することを奨励することでした。私の次の試みのために、あなたの提案を機内に持ち込みます。
エルペドロ

1
私のせい; アスキーアートには複雑すぎることを期待していました。:)しかし、私はまだgifが好きです。
タイタス

gifはクールで、言語の選択にも韻を含めるというアイデアも気に入っています:)
ElPedro

回答:


10

ゼリー40 39 36 バイト

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

オンラインでお試しください!

使い方

“ḥ%DtƊVḍI’

全単射のbase-250リテラルです。各文字は、Jellyのコードページのコードポイントに対応しています。結果は整数13192938935880491074です。

          ḃ9

生成された整数を全単射9に変換し、整数配列
[ 9、6、7、9、6、2、2、7、1、5、3、8、1、3、5、8、4、4 、 4、4]。整数は、スペースを示す9を除いて、ストロークの順序に対応しています。

            W

生成された配列をシングルトン配列にラップします。これは、これから生成する配列の先頭に追加する必要があります。

              “|_/-\/\|‘ˤ

次のように機能します。¤左の2つのリンクを組み合わせてニラディックチェーンにします。1つ“|_/-\/\|‘目は、指定された文字のコードポイントを生成し、[124、95、47、45、92、47、92、124]を生成します。次に、Ėコードポイントを列挙して、
[[1、124]、[2、95]、[3、47]、[4、45]、[5、92]、[6、47]、[7、92]を生成します。 、[8、124]]。ペア[n、c]は、n 番目のストロークがコードポイントcの ASCII文字になることを意味します

             ;

生成された配列を連結します。結果は配列
[[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@\

変換されたy引数(@)で音訳()を使用して、累積(つまり、すべての中間ステップを表示)を実行します。最初のステップでは、たとえば、元の配列の各1124に置き換えます。これは、文字|のコードポイントです

                             FỌ

結果を平坦化し、すべてのコードポイントを対応するASCII文字に置き換えます。すべてのステップでは、これは、コード・ポイントといくつかの印刷不可能な文字生成する19

                               »⁶

文字ごとの最大値をスペース文字で取得し、印刷できないすべての文字をスペースに置き換えます。

                                 s4Y

生成された文字列を長さ4のチャンクに分割し、それらをセパレータとしてラインフィードで結合します。


2
ワオ。ただただすごい。+1
エルペドロ

しかし、待ってください、それらはバイトですか?
レイフウィラーツ

1
@LeifWillertsはい。印刷できない文字を避けるために、Jellyは、1バイトとして認識される256文字をエンコードするカスタムコードページを使用します。ヘッダーのバイトリンクはそれを指します。
デニス

D:申し訳ありませんが、そのリンクをクリックして考え出すないために
レイフ・Willerts

説明のために何でも勝ちます。尊敬。
エルペドロ

13

ジャバスクリプト(ES6)、119の 116 96 92 91バイト

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


いい答え。私はJavascriptがそこか
そこらに

複数の編集を行ってすみません。2番目のコーヒーの前に投稿しないでください。
アーナルド

複数の編集が適しています。バイトカウントが減少するのを見るのは嬉しいです。
エルペドロ

回答にコードの同一のコピーを2つ含めることに意味はありますか?
ニール

@Neil-2つ持つ正当な理由が見つかるまで、1つだけ保持します。^^
アーナウルド

9

バッチ、 356 344 341 337バイト

@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

愚かなバッチの|引用ルール...|変数にし、3で引用する必要がありますので、代わり^に使用@して出力で置き換える方が安価ですが、これを達成するには左壁から始め。行1には末尾スペースがあります。 echo(ために使用されrcおよびf変数が空である可能性があり、私たちは望んでいないECHO is off.印刷。

編集:最後の部分にフォールスルーを使用して12バイトを保存しました。を使用して3バイトを保存しましたforループを各部分を印刷つまり|、変数でsを使用することで、コードが少し読みやすくなりました。の@代わりに明示的な文字を使用して4バイトを保存しました@echo off。左の壁から始めるのに必要なバイト数はまだ少ないと思います。


2
最短ではないかもしれませんが、実際にバッチ+1
ElPedro

echo:より標準的echo(ですが、言語機能を悪用しているようですので、+ 1。
wizzwizz4

@ wizzwizz4 echo:は、いくつかのあいまいなエッジの場合に失敗しますが、の失敗事例はわかりませんecho(
ニール

@ wizzwizz4 foo.bat現在のディレクトリにファイルがある場合、echo(\..\foo.batエコーします\..\foo.batecho:\..\foo.bat実行されfoo.batます。
ニール

@Neilなぜだか知っていますか?ように思えるecho:.\foo.bat代わりにその効果を持っているでしょう。これは、ルートスタックからの「UP」が現在のディレクトリであるディレクトリスタックグリッチが原因ですか?
wizzwizz4

7

C、118バイト

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

印象的!素敵な最初の答え、そしてサイトへようこそ!
DJMcMayhem

1
3バイトを節約するには:(char*pスペースなし)およびASCIIコードに変更'B''J'ます。
レベルリバーセント

答えてくれてありがとう。Cが競争することさえ期待していませんでした。これは本当に印象的で、+ 1の価値があります
-ElPedro

6

///、112バイト

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

オンラインでお試しください!


112の1バイトを理解していませんが、オンラインで試してみましたが、ブリキに記載されているとおりに動作します。+ 1
ElPedro

1
@ElPedroヘッダーのリンクをクリックしてみてください。概念を理解しているかもしれませんが、そうでない場合は、私に戻ってください。ますます多くの人に言語を理解してもらいたいのですが、もしそうでなければ、それは悲しい事実です。私はちょうど誰もが(何人かの人々はちょうど///理解させることはできません知ってほしい、食料や水を///し、不可能ではないもののPPCGは、遠く離れているからです)。
エリックアウトゴルファー

ありがとう。学ぶべき言語はたくさんあります!私は間違いなく見てみましょう。私はまだPythonとLotus Formulaでゴルフをしていますが、それ以上のことを始めています。言語が増えればもっと楽しくなります。あなたの貢献に再び感謝します:)
ElPedro

2

PHP、98 95バイト

Arnauldのソリューションに触発された

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

注:最初のコード行には末尾スペースがあります。


ナイスワン@タイタス。末尾のスペースは許可されます。
エルペドロ

@ElPedro:エディタを自動的にトリミングするように設定した人を知っています。それが私がそれを言及した理由です。
タイタス

1

GDを備えたPHP、348 338バイト(競合しない)

正確には何が求められていたのかはわかりませんが...

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

ファイルに保存し、ブラウザで呼び出します

壊す

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

大きな家を描くには$w=9、希望の幅に変更します。


そして、これにも+1を付けます。直接の課題に対処していませんが、提案された改善をカバーし、非常にクールに見えます:)
ElPedro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.