64位ASCII编织


18

输入值

两个整数:

  • 一个介于0到2 ^ 64-1之间的非负整数W,用于指定组织。
  • 在1到255之间的正整数S,指定边长。

这些可以按照适合您的顺序进行。

输出量

请求的编织的S by S ASCII表示形式(S换行符分隔S字符的字符串,带有可选的尾随换行符)。编织由编织编号W定义,如下所示:

W转换为二进制并拆分为8个字节。第一个(最高有效)字节定义了从左(最高有效位)到右的第一行。下一个字节定义了下一行,依次类推8行。编织编号定义了一个8 x 8的正方形,该正方形应从左上方开始平铺在所需区域上。也就是说,其左上角应对应于要覆盖区域的左上角。

每个0都应显示为a |,每个1都应显示为a-

例子

输入: 0 8

输出:

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

输入: 3703872701923249305 8

输出:

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

输入: 3732582711467756595 10

输出:

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

输入: 16141147355100479488 3

输出:

---
|||
---

排行榜摘要

(使用Martin的模板

Answers:


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的人。)
Alex 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历史上最快的答案
Beta Decay

7
@BetaDecay高尔夫语言的好处是键入的次数更少,因此您可以更快地进行编码。:P
马丁·恩德

1
哎呀,甚至回答之前就麻烦编辑标签了!某人花太多时间打高尔夫球; P
Sabre

这是否是预期的输出:链接
Octavia Togami,2015年

@Kenzie输入的数字大于2^64-1
Martin Ender

5

Java中,110个 109个 107字节

我的代码采用匿名lambda函数的形式,该函数接受a longint然后返回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;}

完整的可测课程

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击败。:P很好。
Alex A.

谢谢@AlexA。!Lambda确实使Java更适用于打高尔夫球:(w,s)->而不是立即String w(long w,int s)省下一大笔钱。
ankh-morpork 2015年

@ypnypn绝对可以正常工作
ankh-morpork 2015年

哇,这真令人印象深刻。做得好。
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将为您节省更多的字符;-)
Hoki

@Hoki!谢谢!我考虑过了...但是结果却是不同的顺序
Luis Mendo

是的,您必须反a='|-'转到a='-|'。和使用x=de2bi(typecast(W,'uint8'))+1;
Hoki 2015年

@Hoki我设法适应了de2bi仅移动9-术语(用于反转)的问题。再次感谢!
路易斯·门多

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)

这将创建一个接受两个整数并打印到stdout的函数。

取消+说明:

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*sn

  • 通过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字节”吗?这样,它将更好地显示在排行榜中。
Anubian Noob 2015年

是的,对此感到抱歉。
科尔·卡梅隆

1
我无法让您的代码在我的环境中正确运行。您在编译任何特定的选项吗?
ankh-morpork

@ dohaqatar7似乎需要stdlib.h明确包含某些Linux环境。当我在CentOS上进行测试时,我并没有被迫包括在内(我相信这就是我所做的)。现在在Ubuntu上,如果不这样编译,就无法运行它:gcc -include stdlib.h w.c
Cole Cameron

我在Ubuntu上进行了测试,这很有道理
ankh-morpork,2015年

1

Pyth,31个 30字节

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

输入应为两行,w ^然后š

在这里尝试

说明

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.