ทอ ASCII 64 บิต


18

อินพุต

จำนวนเต็มสองจำนวน:

  • จำนวนเต็มที่ไม่ใช่ลบWในช่วง 0 ถึง 2 ^ 64-1 ระบุการสาน
  • จำนวนเต็มบวกSในช่วง 1 ถึง 255 โดยระบุความยาวด้าน

สิ่งเหล่านี้สามารถดำเนินการตามลำดับที่เหมาะสมกับคุณ

เอาท์พุต

การแสดงS by S ASCII ของการร้องขอที่ได้รับการร้องขอ ( S newline คั่นสตริงของอักขระSด้วยการขึ้นบรรทัดใหม่ที่เป็นตัวเลือก) การทอถูกกำหนดโดยหมายเลขการสานWดังนี้:

แปลงWเป็นไบนารีและแบ่งออกเป็น 8 ไบต์ ไบต์แรก (ที่สำคัญที่สุด) จะกำหนดแถวบนสุดจากซ้าย (บิตที่สำคัญที่สุด) ไปทางขวา ไบต์ถัดไปกำหนดแถวถัดไปและอื่น ๆ สำหรับ 8 แถว หมายเลขสานกำหนด 8 8 ตารางซึ่งควรจะปูกระเบื้องเหนือพื้นที่ที่ต้องการเริ่มต้นจากด้านบนซ้าย นั่นคือมุมบนซ้ายควรตรงกับมุมซ้ายบนของพื้นที่ที่จะครอบคลุม

ทุกคน0ควรแสดงเป็น|และทุกคน1ควรแสดงเป็น-

ตัวอย่าง

การป้อนข้อมูล: 0 8

ouput:

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

การป้อนข้อมูล: 3703872701923249305 8

เอาท์พุท:

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

การป้อนข้อมูล: 3732582711467756595 10

เอาท์พุท:

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

การป้อนข้อมูล: 16141147355100479488 3

เอาท์พุท:

---
|||
---

ตัวอย่างกระดานแต้มนำ

(ใช้เทมเพลตของ Martin )

คำตอบ:


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
Martin Ender

1
Geez แม้แต่ไปที่ปัญหาของการแก้ไขแท็กก่อนตอบ! บางคนใช้เวลาเล่นกอล์ฟมากเกินไป P
กระบี่

นี่คือผลลัพธ์ที่ต้องการหรือไม่: ลิงก์
Octavia Togami

@Kenzie 2^64-1ว่าจำนวนการป้อนข้อมูลมีขนาดใหญ่กว่า
Martin Ender

5

Java, 110 109 107 Bytes

รหัสของฉันอยู่ในรูปแบบของฟังก์ชั่นแลมบ์ดาที่ไม่ระบุชื่อที่ใช้เวลาที่longและจากนั้นส่งกลับintString

(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.! Lambdas ทำให้ java ใช้งานได้ดีขึ้นสำหรับการเล่นกอล์ฟ: (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

@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

คำอธิบาย 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);}

การเล่นกอล์ฟสามารถทำได้มากขึ้นที่นี่และต้องการคำอธิบาย แต่ฉันไม่มีเวลา :)

Ungolfed:

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

ใช่ขอโทษด้วย
Cole Cameron

1
ฉันมีปัญหาในการรับรหัสของคุณให้ทำงานอย่างถูกต้องในสภาพแวดล้อมของฉัน คุณรวบรวมตัวเลือกเฉพาะหรือไม่?
ankh-morpork

@ dohaqatar7 ดูเหมือนว่าบางสภาพแวดล้อม Linux จำเป็นต้องstdlib.hรวมไว้อย่างชัดเจน ฉันไม่ได้ถูกบังคับให้รวมไว้ก่อนหน้านี้เมื่อฉันทดสอบกับ CentOS (ฉันเชื่อว่านั่นคือสิ่งที่ฉันทำ) ตอนนี้บน Ubuntu ฉันไม่สามารถทำให้มันทำงานได้โดยไม่ต้องคอมไพล์:gcc -include stdlib.h w.c
Cole Cameron

ทำให้รู้สึกว่าฉันทดสอบบน Ubuntu
ankh-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.