64ビットASCIIウィービング


18

入力

2つの整数:

  • 織り方を指定する0から2 ^ 64-1の範囲の負でない整数W。
  • 1〜255の範囲の正の整数S。辺の長さを指定します。

これらは、自分に合った順序で使用できます。

出力

SによるSの要求された織りのASCII表現(Sの改行は、ストリング分離Sのオプションの末尾の改行と文字)。織りは、次のように織り番号Wによって定義されます。

Wをバイナリに変換し、8バイトに分割します。最初の(最上位)バイトは、左(最上位ビット)から右への最上行を定義します。次のバイトは次の行を定義し、8行についても同様です。織り番号は、8 x 8の正方形を定義します。正方形は、左上から必要な領域にタイル張りする必要があります。つまり、その左上隅は、カバーする領域の左上隅に対応する必要があります。

すべて0がとして表示され、|すべて1がとして表示される必要があります-

入力: 0 8

出力:

||||||||
||||||||
||||||||
||||||||
||||||||
||||||||
||||||||
||||||||

入力: 3703872701923249305 8

出力:

||--||--
|--||--|
--||--||
-||--||-
||--||--
|--||--|
--||--||
-||--||-

入力: 3732582711467756595 10

出力:

||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--

入力: 16141147355100479488 3

出力:

---
|||
---

リーダーボードスニペット

マーティンのテンプレートを使用)

回答:


10

K、20

{y#y#'"|-"8 8#0b\:x}

             0b\:x    // convert to binary
         8 8#         // reshape into an 8x8 boolean matrix
     "|-"             // index into this char vector using the booleans as indices  
  y#'                 // extend horizontally
y#                    // extend vertically

k){y#y#'"|-"8 8#0b\:x}[3703872701923249305j;10]
"||--||--||"
"|--||--||-"
"--||--||--"
"-||--||--|"
"||--||--||"
"|--||--||-"
"--||--||--"
"-||--||--|"
"||--||--||"
"|--||--||-"

k){y#y#'"|-"8 8#0b\:x}[3703872701923249305j;8]
"||--||--"
"|--||--|"
"--||--||"
"-||--||-"
"||--||--"
"|--||--|"
"--||--||"
"-||--||-"

これは本当にこれよりも簡単でも簡単でもありません!
JohnE

1
@JohnE Kを理解している人にのみ当てはまります;)
アレックスA.

14

CJam、33 31バイト

q~:X;2b64Te["|-"f=8/{X*X<z}2*N*

ここでテストしてください。

説明

q~      e# Read and eval input.
:X;     e# Store the side length in X and discard it.
2b      e# Convert to base 2.
64Te[   e# Left-pad to length 64 with zeroes.
"|-"f=  e# Select '|' for 0 and '=' for 1.
8/      e# Split into chunks of 8 bits.
{       e# Do the following twice:
  X*    e#   Repeat lines X times (to ensure we have enough of them).
  X<    e#   Truncate them to exactly X lines.
  z     e#   Transpose the grid.
        e#   The transpose ensures that the second pass tiles the columns, and that the
        e#   grid is oriented correctly again after both passes are done.
}2*
N*      e# Join lines by newline characters.

2
私はあなたに拍手を送ります:)。これはおそらくPPCGの歴史の中で最も早い答えです
ベータ崩壊

7
@BetaDecayゴルフ言語の利点は、入力する回数が少なくなるため、コーディングを高速化できることです。:P
マーティンエンダー

1
Geez、答える前にタグを編集する手間さえかかりました!誰かがゴルフに時間をかけすぎています
セイバー

これは意図した出力ですか?リンク
オクタヴィアトガミ

@Kenzie入力番号がより大きいこと2^64-1
マーティンエンダー

5

Java、110 109 107バイト

私のコードは、を受け取り、longint返す匿名ラムダ関数の形式ですString

(w,s)->{String b="";for(int j,i=s--;i-->0;b+='\n')for(j=s;j>=0;)b+=(w>>8*(i%8)+j--%8)%2<1?'|':45;return b;}

完全なテスト可能なクラス

import java.util.function.BiFunction;
public class AsciiWeave {   
    public static void main(String[] args){
        BiFunction<Long,Integer,String> weave = 
            (w,s)->{String b="";for(int j,i=s--;i-->0;b+='\n')for(j=s;j>=0;)b+=(w>>8*(i%8)+j--%8)%2<1?'|':45;return b;}}
        ;
        System.out.println(weave.apply(Long.valueOf(args[0]),Integer.valueOf(args[1])));
    }
}

3
私は言わなければならない、私はJavaにbeatられていることに慣れていない。:Pいいですね。
アレックスA.

ありがとう@AlexA。!ラムダは本当にjavaをゴルフで使いやすくします。(w,s)->代わりに、String w(long w,int s)すぐに大きな節約になります。
アンク-morpork

間違いなく動作するはずの@Ypnypn
ankh-morpork

うわー、これは印象的です。よくやった。
TheNumberOne

4

Matlab、86 80バイト

function f(W,S)
a='|-';x=de2bi(typecast(W,'uint8'))+1;s=8-mod(0:S-1,8);a(x(s,s))

Hokiの提案に感謝し、6バイト節約できました。

例:

>> W = uint64(3732582711467756595)
W =
  3732582711467756595
>> S = uint8(10)
S =
   10
>> f(W,S)
ans =
||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--

de2biあなたにいくつかのより多くの文字;-)保存されます
ホキ

@ほき!ありがとう!私はそれについて考えました...しかし、それは結果の異なる順序を与える
ルイスメンドー

うん、あなたはに逆にa='|-'する必要がありますa='-|'。そして、使用x=de2bi(typecast(W,'uint8'))+1;
ホキ

@Hoki私de2bi9-用語を移動するだけでうまくいくことができました(反転に使用)。再度、感謝します!
ルイスメンドー

3

ジュリア、145バイト

f(w,s)=(A=map(i->i=="1"?"-":"|",reshape(split(lpad(bin(w),64,0),""),8,8))';for i=1:s A=hcat(A,A)end;for i=1:s println(join(A[i>8?i%8:i,1:s]))end)

これにより、2つの整数を受け入れて標準出力に出力する関数が作成されます。

Ungolfed +説明:

function f(w,s)
    # Convert w to binary, left-padded with zeros to length 64
    b = lpad(bin(w), 64, 0)

    # Create an 8x8 array of | and -
    A = transpose(map(i -> i == "1" ? "-" : "|", reshape(split(b, ""), 8, 8)))

    # Horizontally concatenate A to itself s times
    for i = 1:s
        A = hcat(A, A)
    end

    # Print the rows of A, recycling as necessary
    for i = 1:s
        println(join(A[i > 8 ? i % 8 : i, 1:s]))
    end
end

これはかなり長く、もっと短くすることができると確信しています。それに取り組んでいます。


3

J、28バイト

'|-'{~]$"1]$8 8$_64{.#.inv@[

使用法:

   3732582711467756595 ('|-'{~]$"1]$8 8$_64{.#.inv@[) 10
||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--
--||--||--
||--||--||
||--||--||
--||--||--

説明(右から左):

#.inv@[   binary representation vector of S
_64{.     padded with 0-s from the right to length 64
8 8$      reshaped in an 8 by 8 matrix
]$"1]$    tiled to a W by W size
'|-'{~    select | or - based on matrix element values

こちらからオンラインでお試しください。



2

Python、77

lambda w,s:''.join('|-'[w>>~n/s%8*8+~n%s%8&1]+'\n'[~n%s:]for n in range(s*s))

の各s*s値についてn

  • divmodを介して座標を計算する (i,j)=(n/s,n%s)
  • タイリングの位置を次のように計算します (i%8,j%8)
  • 適切なビット位置を次のように計算します 8*(i%8)+(j%8)
  • 多くのスペースを右にwシフトしwてそのビットを抽出し、最後のビットをで取得し&1ます。
  • その位置で「|-」のいずれかに参加する
  • いつでもすべての行の最後に改行を追加します n%s==0

実際にwは、最後から読み込みを行うため、すべてが最後にタイリングされます。の~n代わりにを使用してこれを修正しますn。代わりに再帰的なアプローチを試みましたが、少し長くなりました。

この式w>>~n/s%8*8+~n%s%8&1は、演算子の優先順位の奇跡です。


1

Python 2、132バイト

確かに最もエレガントなソリューションではなく、Cよりもやや短いですが、開始点です。入力はコンマ区切りで行われます。

k,n=input()
k=[`['|-'[int(x)]for x in'{0:064b}'.format(k)]`[2::5][i*8:i*8+8]*n for i in range(8)]*n
for j in range(n):print k[j][:n]

1

C、160 135バイト

i;main(s,v)char**v;{s=atoi(v[2]);for(;i++<s*s+s;)putchar(i%(s+1)?strtoull(v[1],0,10)&1ull<<63-(i/(s+1)*8+(i%(s+1)-1)%8)%64?45:'|':10);}

ここでさらにゴルフをすることができ、説明が必要ですが、現時点では時間がありません:)

ゴルフをしていない:

i;

main(s,v)
char**v;
{
    s=atoi(v[2]);
    for(;i++<s*s+s;)
        putchar(i%(s+1) ? /* print dash or pipe, unless at end of row, then print newline */
            /* Calculating which bit to check based on the position is the tough part */
            strtoull(v[1],0,10) & 1ull << 63-(i/(s+1)*8+(i%(s+1)-1)%8)%64 ? /* If bit at correct index is set, print dash, otherwise pipe */
                45 /* dash */
                : '|' /* pipe */
            : 10); /* newline */
}

タイトルを「C、100バイト」のようにフォーマットできますか?そうすれば、リーダーボードに表示されるようになります。
アヌビアヌーブ

はい、ごめんなさい。
コールキャメロン

1
私の環境であなたのコードを正しく実行するのに問題があります。特定のオプションでコンパイルしていますか?
アンク-morpork

@ dohaqatar7一部のLinux環境をstdlib.h明示的に含める必要があるようです。CentOSでテストしたときに、以前にそれを含めることを強制されませんでした(私はそれが私がいたものだと思います)。今のUbuntu上で、私はそれはそうのようなコンパイルせずに実行することができません:gcc -include stdlib.h w.c
コールキャメロン

なり、私はUbuntuの上でテストを感知
アンク-morpork

1

Pyth、31 30バイト

L<*QbQjbyyMcs@L"|-".[Z64jvz2 8

入力は、WSの 2行である必要があります。

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

説明

L                              # define y(b):
  *Qb                          #   b, repeated Q (the second input) times
 <   Q                         #   cut to length Q

                        jvz2   # convert the first input to binary
                   .[Z64       # pad with 0's to length 64
             @L"|-"            # map the digits to the appropriate character
            s                  # convert the list of characters to a string
           c                 8 # chop into 8 strings
         yM                    # extend each string to the correct size
        y                      # extend the list of strings to the correct size
      jb                       # join with newlines
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.