64 비트 ASCII 직조


18

입력

두 정수 :

  • 직조를 지정하는 0에서 2 ^ 64-1 사이의 음이 아닌 정수 W.
  • 측면 길이를 지정하는 1-255 범위 의 양의 정수 S 입니다.

이것들은 당신에게 맞는 순서로 가져갈 수 있습니다.

산출

S 에 의해 S를 요청 직조 ASCII 표현 ( S의 개행는 문자열 분리 S를 선택적으로 후행 개행 문자). 직조는 직조 번호 W에 의해 다음과 같이 정의된다 :

W 를 이진수로 변환 하고 8 바이트로 나눕니다. 첫 번째 (가장 중요한) 바이트는 왼쪽 (가장 중요한 비트)에서 오른쪽으로 맨 위 행을 정의합니다. 다음 바이트는 다음 행을 정의하며 8 행에 대해서도 계속됩니다. 직조 번호는 8 x 8 정사각형을 정의하며 왼쪽 위에서 시작하여 필요한 영역에 타일을 붙여야합니다. 즉, 왼쪽 위 모서리는 덮을 영역의 왼쪽 위 모서리와 일치해야합니다.

모든 0것은 a로 표시 |되고 모든 1것은 a로 표시되어야합니다.-

입력: 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.;)을 이해하는 사람들에게만 해당됩니다.
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
Geez는 응답 하기 전에 태그를 편집하는 데 어려움을 겪었습니다 ! 누군가 골프에 너무 많은 시간을 보낸다; P
Saber

이 출력입니다 : link
Octavia Togami

@Kenzie는 입력 번호가보다 큽니다 2^64-1.
마틴 엔더

5

자바 110 109 107 바이트

내 코드는 소요 익명 람다 함수의 형태 long와는 int다음을 반환합니다 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
나는 자바에 구타 당하지 않는다고 말해야한다. : P 잘 했어.
Alex A.

감사합니다 @AlexA.! 람다는 실제로 자바를 골프에 더 유용하게 만듭니다. (w,s)->대신 String w(long w,int s)박쥐를 크게 절약 할 수 있습니다.
ankh-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더 많은 문자를 절약 할 수 있습니다 ;-)
Hoki

@ 호키! 감사! 나는 그것에 대해 생각했다. 그러나 그것은 다른 순서의 결과를 준다
Luis Mendo

네, 당신은 역 할 a='|-'a='-|'. 그리고 사용x=de2bi(typecast(W,'uint8'))+1;
Hoki

@Hoki 나는 맞게 관리 de2bi단지 이동 9-(반전에 사용) 용어. 다시 감사합니다!
Luis Mendo

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

파이썬, 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

파이썬 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 bytes"와 같은 형식으로 지정할 수 있습니까? 그렇게하면 리더 보드에 더 잘 나타납니다.
Anubian Noob

네, 죄송합니다
콜 카메론

1
내 환경에서 코드를 올바르게 실행하는 데 문제가 있습니다. 특정 옵션으로 컴파일하고 있습니까?
ankh-morpork

@ dohaqatar7 일부 Linux 환경 stdlib.h을 명시 적으로 포함 해야하는 것 같습니다 . CentOS에서 테스트 할 때 더 일찍 포함하도록 강요받지 않았습니다 (나는 그것이 내가하고있는 것이라고 생각합니다). 우분투에서는 컴파일하지 않고 실행할 수 없습니다.gcc -include stdlib.h w.c
Cole Cameron

차종은 내가 우분투에서 테스트 감지
앙크 - morpork

1

Pyth, 31 30 바이트

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

입력은 W , S의 두 줄에 있어야합니다 .

여기 사용해보십시오

설명

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.