64-бітове плетіння ASCII


18

Вхідні дані

Два цілих числа:

  • Невід’ємне ціле число W в діапазоні від 0 до 2 ^ 64-1 із зазначенням переплетення.
  • Позитивне ціле число S в діапазоні від 1 до 255, вказуючи бічну довжину.

Їх можна приймати в тому порядку, який вам підходить.

Вихід

Зображення S by S ASCII запитуваного переплетення ( S рядків, розділених S у новому рядку, з S символів з необов'язковим останнім рядком). Переплетення визначається числом переплетення W таким чином:

Перетворіть W у двійковий і розділіть на 8 байт. Перший (найзначніший) байт визначає верхній ряд, зліва (найзначніший біт) вправо. Наступний байт визначає наступний ряд і так далі для 8 рядків. Число переплетень визначає квадрат 8 на 8, який слід обкласти плиткою над необхідною площею, починаючи з верхнього лівого кута. Тобто його лівий верхній кут повинен відповідати лівому верхньому куту зони, яку потрібно охопити.

Кожна 0повинна відображатися як a, |а кожна 1повинна відображатися як a-

Приклади

Вхід: 0 8

Вихід:

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

Вхід: 3703872701923249305 8

Вихід:

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

Вхід: 3732582711467756595 10

Вихід:

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

Вхід: 16141147355100479488 3

Вихід:

---
|||
---

Знімок дошки

(використовуючи шаблон Мартіна )

Відповіді:


10

К, 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 Це справедливо лише для людей, які розуміють К.;)
Олексій А.

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
Гез, навіть перед тим, як відповісти , пішов на проблему редагування тегів ! Хтось витрачає занадто багато часу на гольф; P
Saber

Це призначений вихід: посилання
Octavia Togami,

@Kenzie, що число вводу більше, ніж 2^64-1.
Мартін Ендер

5

Ява, 110 109 107 байт

Мій код у формі анонімної лямбда-функції, яка приймає a, longа intпотім повертає 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
Треба сказати, я не звик бити Явою. : P Приємна робота.
Олексій А.

Дякую @AlexA.! Лямбдас справді робить Java більш придатною для гри в гольф: (w,s)->замість цього String w(long w,int s)є велика економія прямо від кажана.
ankh-morpork

@Ypnypn, що обов'язково має спрацювати
ankh-morpork

Ого, це вражає. Хороша робота.
TheNumberOne

4

Матлаб, 86 80 байт

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

Дякую Хокі за його пропозицію, яка змусила мене врятувати 6 байт.

Приклад:

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

de2biврятує вас ще кілька персонажів ;-)
Хокі

@Hoki! Спасибі! Я подумав про це ... але це дає інший порядок результату
Луїс Мендо

так, ви повинні повернутися a='|-'до a='-|'. І використовуйтеx=de2bi(typecast(W,'uint8'))+1;
Хокі

@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

Пітона, 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

Пітон 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

Так, вибачте з цього приводу.
Коул Камерон

1
У мене виникають проблеми з правильним запуском вашого коду в моєму середовищі. Ви компілюєте якісь конкретні варіанти?
ankh-morpork

@ dohaqatar7 Схоже, деякі середовища Linux потребують stdlib.hявного включення. Я не був змушений включати його раніше, коли тестував на CentOS (я вважаю, що це було так). Тепер на Ubuntu, я не можу його запустити без компіляції так:gcc -include stdlib.h w.c
Коул Камерон,

Маю сенс, що я перевірив 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.