Tenun ASCII 64 bit


18

Memasukkan

Dua bilangan bulat:

  • Bilangan bulat non-negatif W dalam kisaran 0 hingga 2 ^ 64-1, menentukan tenunan.
  • Bilangan bulat positif S dalam kisaran 1 hingga 255, menentukan panjang sisi.

Ini dapat diambil sesuai pesanan Anda.

Keluaran

Sebuah S oleh S ASCII representasi yang diminta menenun ( S baris dipisahkan string S karakter dengan baris baru opsional). Tenunan didefinisikan oleh angka tenunan W sebagai berikut:

Ubah W ke biner dan bagi menjadi 8 byte. Byte pertama (paling signifikan) mendefinisikan baris atas, dari kiri (bit paling signifikan) ke kanan. Byte berikutnya mendefinisikan baris berikutnya, dan seterusnya untuk 8 baris. Angka menenun mendefinisikan 8 oleh 8 persegi yang harus ubin di area yang diperlukan mulai dari kiri atas. Artinya, sudut kiri atas harus sesuai dengan sudut kiri atas area yang akan dicakup.

Setiap 0harus ditampilkan sebagai a |dan setiap 1harus ditampilkan sebagai a-

Contohnya

Memasukkan: 0 8

Ouput:

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

Memasukkan: 3703872701923249305 8

Keluaran:

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

Memasukkan: 3732582711467756595 10

Keluaran:

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

Memasukkan: 16141147355100479488 3

Keluaran:

---
|||
---

Cuplikan Papan

(menggunakan template Martin )

Jawaban:


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]
"||--||--"
"|--||--|"
"--||--||"
"-||--||-"
"||--||--"
"|--||--|"
"--||--||"
"-||--||-"

Ini benar-benar tidak menjadi lebih sederhana atau lebih langsung dari ini!
JohnE

1
@ JohnE Itu hanya berlaku untuk orang-orang yang mengerti K.;)
Alex A.

14

CJam, 33 31 byte

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

Uji di sini.

Penjelasan

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
Saya memuji Anda :). Ini mungkin jawaban tercepat dalam sejarah PPCG
Beta Decay

7
@ BetaDecay. Manfaat dari bahasa golf adalah Anda memiliki lebih sedikit untuk mengetik, sehingga Anda dapat membuat kode lebih cepat. : P
Martin Ender

1
Ya ampun, bahkan kesulitan mengedit tag sebelum menjawab! Seseorang menghabiskan terlalu banyak waktu untuk bermain golf; P
Sabre

Apakah ini keluaran yang dimaksudkan: tautan
Octavia Togami

@ Koenzie bahwa nomor input lebih besar dari 2^64-1.
Martin Ender

5

Java, 110 109 107 Bytes

Kode saya adalah dalam bentuk fungsi lambda anonim yang mengambil longdan intkemudian mengembalikan a 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;}

Kelas lengkap yang dapat diuji

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
Saya harus mengatakan, saya tidak terbiasa dipukuli oleh Jawa. : P Kerja bagus.
Alex A.

Terima kasih @AlexA.! Lambdas benar-benar membuat java lebih bermanfaat untuk bermain golf: (w,s)->bukannya String w(long w,int s)menghemat besar langsung.
ankh-morpork

@Ypnypn yang pasti bekerja
ankh-morpork

Wow, ini mengesankan. Kerja bagus.
TheNumberOne

4

Matlab, 86 80 byte

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

Terima kasih kepada Hoki atas sarannya, yang membuat saya menyelamatkan saya 6 byte.

Contoh:

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

de2biakan menyelamatkan Anda beberapa karakter lagi ;-)
Hoki

@Hoki! Terima kasih! Saya memikirkannya ... tetapi hasilnya berbeda
Luis Mendo

ya, Anda harus kembali a='|-'ke a='-|'. Dan gunakanx=de2bi(typecast(W,'uint8'))+1;
Hoki

@ Hoki Saya berhasil menyesuaikan de2bihanya dengan memindahkan 9-istilah (digunakan untuk pembalikan). Terima kasih lagi!
Luis Mendo

3

Julia, 145 byte

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)

Ini menciptakan fungsi yang menerima dua bilangan bulat dan mencetak ke stdout.

Penjelasan + tidak dikumpulkan:

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

Ini cukup panjang dan saya yakin itu bisa dibuat lebih pendek. Sedang mengerjakannya.


3

J, 28 byte

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

Pemakaian:

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

Penjelasan (kanan ke kiri):

#.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

Cobalah online di sini.



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

Untuk masing-masing s*snilai dari n:

  • Hitung koordinat melalui divmod (i,j)=(n/s,n%s)
  • Hitung lokasi di ubin sebagai (i%8,j%8)
  • Hitung posisi bit yang sesuai sebagai 8*(i%8)+(j%8)
  • Ekstrak sedikit itu wdengan menggeser wbanyak ruang dengan kanan dan ambil bit terakhir dengan &1.
  • Bergabunglah dengan salah satu '| -' di posisi itu
  • Tambahkan baris baru di akhir setiap baris kapan saja n%s==0

Sebenarnya, semua itu akhirnya mendapatkan ubin mundur, karena membaca wdari ujung. Kami memperbaikinya dengan menggunakan ~nmenggantikan n. Saya mencoba pendekatan rekursif sebagai gantinya, tetapi ternyata sedikit lebih lama.

Ekspresi w>>~n/s%8*8+~n%s%8&1adalah keajaiban operator yang diutamakan.


1

Python 2, 132 Bytes

Tentu bukan solusi yang paling elegan, dan ini hampir tidak lebih pendek dari C, tetapi ini adalah permulaan .. Input diambil dengan dipisahkan koma.

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 byte

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

Beberapa golf lagi dapat dilakukan di sini dan perlu penjelasan, tetapi saya tidak punya waktu saat ini :)

Tidak Disatukan:

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 */
}

Bisakah Anda memformat judul seperti "C, 100 byte"? Dengan cara itu akan muncul di leaderboard yang lebih baik.
Anubian Noob

Ya, maaf soal itu.
Cole Cameron

1
Saya mengalami masalah dalam menjalankan kode Anda dengan benar di lingkungan saya. Apakah Anda mengkompilasi dengan opsi tertentu?
ankh-morpork

@ dohaqatar7 Sepertinya beberapa lingkungan Linux stdlib.hharus dimasukkan secara eksplisit. Saya tidak dipaksa untuk memasukkannya lebih awal ketika saya menguji pada CentOS (saya percaya itulah yang saya alami). Sekarang di Ubuntu, saya tidak bisa menjalankannya tanpa kompilasi seperti:gcc -include stdlib.h w.c
Cole Cameron

Masuk akal saya diuji di Ubuntu
ankh-morpork

1

Pyth, 31 30 byte

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

Input harus pada dua baris, W kemudian S .

Coba di sini

Penjelasan

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.