ピンホールカメラを介した日食


28

このチャレンジは、2017年8月21日に発生した日食に触発されたシンプルなASCIIアートチャレンジです0 <= n <= 4

n=0:
   *****
 **     **
*         *
*         *
**       **
  *******

n=1:
   *****
 **  *****
*   *******
*   *******
**   ******
  *******

n=2:
   *****
 *********
***********
***********
***********
  *******

n=3:
   *****
 *****  **
*******   *
*******   *
******   **
  *******

n=4:
   *****
 **     **
*         *
*         *
**       **
  *******

ルール

  • インデックスは0または1で、選択内容を指定できます。
  • 使用される文字はスペースであり**(スペース以外の)印刷可能な文字を使用できます。
  • 末尾のスペースはオプションです(使用する場合と使用しない場合があります)。
  • これは、最小のバイト数が勝者です。

3
@ Mr.Xcoder私はkolmogorov-complexityとして入力を取得するタグ付けの課題に反対していますが、それはOPの裁量次第です。
エリックアウトゴルファー

15
上下対称ではないのが残念です。
-AdmBorkBork

また、日食はすでに始まっている...
Outgolferエリック

@AdmBorkBorkそう私は...いくつかのバイトを保存していたかもしれない
エリックOutgolfer

7
*スペースを含む」に任意の文字を使用できますか?;)
ハーゲンフォンアイゼン

回答:


13

パイソン2161の 149 142 135バイト

lambda n,u=u' *':u'''   *****
 ****
**
**
****
  *******'''.translate({1:u[0<n<3],2:u[0<n<4],3:u[1<n<4]})

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

-7 Mr. Xcoderに感謝します。


9
印刷できないものの素晴らしい虐待。
ザカリー

Emacsにコピーアンドペーストするまで、この答えを十分に評価しませんでした。ブリリアント!
シルヴィオマヨロ

@SilvioMayolo Umm、Emacsで何をしましたか?
エリックアウトゴルファー

このページで答えを見ているだけで、それがどのように機能するのか理解できませんでした。Emacsのショー^ A、^ B、^ C、などなど、すべての隠された文字を
シルビオMayolo

@SilvioMayoloああ、それは印刷不可能なものがUnicode文字にやや似た表現を持っているからです。
エリックアウトゴルファー

9

82 81 55 43バイト

ニールのおかげで-38バイト!

Nν”{“⟲FEd⧴_³⟲”‖O¿﹪ν⁴«F﹪ν²G↗³↑²↖²↙³*↑¤*¿⁼ν¹‖

オンラインでお試しください!リンクは詳細バージョンです。

私はそれのためにやった。:P 私はおそらく40バイト不足しています。 26 38バイト...十分近い?


1
基本的なアルゴリズムをいくつか簡略化しました。オンラインで試してみてください!
ニール

2
炭を使うことができないのではなく、ロジックでゴルフをしていました。> _>ありがとう!
完全に人間の

1
外側の「円」を印刷すると最短になります。また、奇妙な入力のためにポリゴンを使って創造的でした。オンラインで試してみてください!
ニール

1)くそー、私は私が賢いと思っていたPolygonHollow。:P 2)ああ、いいね。ありがとう!
完全に人間

5

シナモンガム、70バイト

Hexdump:

0000000: 6c33 5053 5050 d002 012e 20a5 0002 4026  l3PSPP.... ...@&
0000010: 9001 0568 6c20 07a6 0648 4080 b521 8a19  ...hl ...H@..!..
0000020: 30a6 1644 1093 0de3 a098 6184 6206 422d  0..D......a.b.B-
0000030: 6136 c20c 6374 3380 3cb8 5aa0 1436 36ba  a6..ct3.<.Z..66.
0000040: 5f4c 280f 0f00                           _L(...

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

私は待っていたので、長い間、この言語を使用する方法を見つけるために。:P

したがって、シナモンガムはバブルガムですが、バブルガムよりも「本物の」言語です。

最初のバイト(l)は、モードを辞書モードに設定します。残りのバイトは、圧縮された次の文字列です。

0&   *****
 **     **
*         *
*         *
**       **
  *******;1&   *****
 **  *****
*   *******
*   *******
**   ******
  *******;2&   *****
 *********
***********
***********
***********
  *******;3&   *****
 *****  **
*******   *
*******   *
******   **
  *******;4&   *****
 **     **
*         *
*         *
**       **
  *******

これは基本的に、各テキストが番号に割り当てられたルックアップテーブルを作成します。その後、プログラムは入力を受け取り、それぞれのテキストを出力します。


ことができますargument%4またはargument&3バイトを保存しますか?
タイタス

5

JavaScript(ES6)、103 102バイト

f=
n=>`   *****
 **66733**${s=`
*666777333*`}${s}
**6667333**
  *******`.replace(/\d/g,c=>" *"[c*2>>n&1])
<input type=number min=0 max=4 oninput=o.textContent=f(this.value)><pre id=o>

編集:@darrylyeoのおかげで1バイトを保存しました。


1
*666777333*\n変数に格納することにより-2バイト。
darrylyeo

私は1バイトのみを保存するように見えることができますので、私は...何か間違っているしなければならない@darrylyeo
ニール・

私の悪い点は、確かにたった1バイトしか節約しません。
darrylyeo

4

SOGL V0.1240の 39 バイト

"⁽Ρūa╔Ƨ ‘╥▓.4%?52"¹ο1¹‘╬¡╬5.H?:±}.2=?╬8

ここで試してみてください!


それが役立つ場合は、末尾のスペースはオプションです(必要な場合とない場合があります)。- SOGLを知らないが、バイト救うかもしれない
氏Xcoder

@ Mr.Xcoderこれは逆のことをします。SOGLはASCIIアートをどこでも扱うときに末尾のスペースを追加するからです:p
dzaima

4

VI、108バイト

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>

<CR>あるEnterストローク、<C-?>対応にはControl + ?、と<Esc>Escape明らかに。これらはそれぞれ1バイトとしてカウントされます(metaを参照)。ソリューションの改行は読みやすさのためです。<CR>実際のEnterストロークのみを表します。

入力

入力ファイルには、を表す1文字のみを含める必要がありますn

打ち上げ

VIは次のように起動する必要があります。

vi -u NONE input

説明

ソリューションには3つの部分があります。説明が最も簡単なので、最初に2番目の部分(2行目)について説明します。

太陽を描く

太陽を描画するコマンドは次のとおりです。

3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp

太陽がで描画されなければならない*01そして3、このように:

   *****
 **11033**
*111000333*
*111000333*
**1110333**
  *******

対称性は、この部分のバイトサイズを減らすのに役立ちますが、それほど重要ではありません。完全な行については説明しませんが、パターン*****は最後の行を簡単に生成するために使用され、パターンは、および**1110333**を含む他の3行を生成するための参照として使用されています。013

使用することが重要で01かつ3充填することができる太陽の部品のために(次の説明を参照してください)。この太陽を描くには55バイトかかり、おそらくいくつかのトリックでゴルフをすることができます

に従って太陽を満たす n

太陽を正しく満たすための手順は次のとおりです。

  • if n = 0、then 01および3(すべての数字)は、
  • の場合n = 11で置き換える必要があり、他の数字で*
  • if n = 2、then 01および3(すべての数字)は、*
  • の場合n = 33で置き換える必要があり、他の数字で*
  • if n = 4、then 01および3(すべての数字)を(などn = 0)に置き換える必要がある場合

それから、必要な置換は次のように推測できます。

  • いくつかの数字を最初の置換)で置き換えます
  • 他のすべての数字を*2番目の置換)に置き換えます

「一部の数字」は「数字なし」(n = 2たとえば)を意味する場合があることに注意してください。また、「他のすべての数字」は、すべての数字がすでに最初の置換(n = 0たとえば)で置き換えられている場合、「数字なし」を表すこともできます。

第2の置換は容易に書くことができる11バイト

:%s/\d/*/g<CR>

最初の置換が依存するnので、最初に我々は数字を交換しようとしているものを計算する必要があり、。置き換えられた文字がregister aに格納されている場合、置換コマンドも11バイトで書き込まれます

:%s/<C-r>a/ /g<CR>

<C-r>aaコマンドを入力すると、registerの内容に置き換えられます。

の値を計算するためにa、前の指示に従って、アルゴリズムは(擬似コードで)です:

n := read()
if (n % 2 != 0)
then
    a := n
else
    if(n % 4 != 0)
    then
        a := "X"
    else
        a := "\d"

"X"が使用されるのはn = 2、数字がスペースに置き換えられないためです。最初の置換が何もしない限り、太陽ではない任意の文字列をここで使用できます。

これは31バイトで書くことができます

D                                   # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
 :let@a=                            # define register "a content
        @"%2                        # if (n % 2 != 0)
            ?                       # then
             @"                     #   n
               :                    # else
                @"%4                #   if (n % 4 != 0)
                    ?               #   then
                     "X"            #       "X"
                        :           #   else
                         "\\d"      #       "\\d"
                              <CR>  # calculate "a

溶液

これらの部品をすべて正しい順序で配置すると、解決策が得られます。

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>                                              # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp     # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR>                                                              # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR>                                                                  # replace the remaining digits with stars

3

PHP、114 + 1バイト

+1バイト-R。ヒントを教えてくれた@Neilに感謝します。

for(;$c="   *****
 **66733**
*666777333*
*666777333*
**6667333**
  *******"[$i++];)echo+$c?" *"[$c*2>>$argn&1]:$c;

にアンダースコアを使用し*、0インデックスを付けます。でパイプとして実行する-nR、オンラインで試してください

PHP 5.5以降が必要:
古いPHPはリテラル文字列のインデックス付けを理解しません(解析エラー)。
PHP 7.1では、数値以外の値について不平を言っています(修正するために置き換え+$cてください$c>0)。


1
" _"[$c*2>>$argn&1]必要な場合、負のシフトパラメーターを避けると思います。
ニール




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.