Виведіть бінарний шлях з числа


22

Для цілого числа, nяке задовольняє n > 0, запишіть його значення як шлях, що спадає справа, на основі його бінарного подання.

Правила

  • Перший (найзначніший) набір бітів завжди знаходиться у верхньому лівому куті.
  • Коли наступний біт встановлений (a 1), намалюйте символ ("заповнений") у наступному рядку в тому ж стовпці, що і попередній намальований символ. Спробуйте використати пробіли ("порожні") для заповнення, але будь-який символ зробить, поки це завжди те саме.
  • Коли наступний біт не встановлено (a 0), намалюйте символ ("заповнений") на тому ж рядку праворуч праворуч від попереднього намальованого символу.
  • Ваш код повинен підтримувати номери з принаймні 20 значущими бітами.
  • Напишіть повну програму, функцію, лямбда тощо, але не фрагмент.
  • Не допускаються провідні пробіли (або "порожні" знаки) / рядки
  • Дозволена будь-яка кількість пробілів (або "порожніх" знаків) / рядків
  • Будь-який вид 1D введення приймається: число, рядок, масив булевих і т.д. Будь-ласка, не змінюйте порядок бітів.
  • Приймається будь-який вид візуального 2D виводу: на stdout, рядок (з будь-якими двома різними значеннями, що представляють "заповнене" та "порожнє"), ви навіть можете вивести матрицю, якщо хочете. Список номерів, здається, важко узгодити з правилом "без заголовків пробілів", але я відкритий для нього, якщо ви знайдете спосіб його використання. Примітка: якщо ви вирішили надрукувати або повернути рядок, використовувані символи повинні бути символами ASCII в діапазоні кодових точок [32-126].
  • Стандартні лазівки заборонені.
  • Це codegolf, тому найкоротший код виграє.

Приклади

Вхід: 1

*

Вхід: 2

**

Вхід: 3

*
*

Вхід: 4

***

Вхід: 5

**
 *

Вхід: 6

*
**

Вхід: 7

*
*
*

Вхід: 25

*
***
  *

Вхід: 699050

**
 **
  **
   **
    **
     **
      **
       **
        **
         **

Вхід: 1047552

*
*
*
*
*
*
*
*
*
***********

Вхід: 525311

**********
         *
         *
         *
         *
         *
         *
         *
         *
         *
         *


Чи означає "дозволений вхідний масив булевих", що дозволено приймати вхід у вигляді двійкового подання числа як масив?
Ніт

3
@Nit Будь-який 1D вхід. Отже, якщо число дорівнює 5, у вас може бути масив введення, подібний до [1,0,1]так.
Олів'є Грегоар

То наскільки вільний цей формат насправді? Я хотів би прийняти число, оскільки двійкові цифри з першим перенесеним до кінця, тому оскільки я хотів би , щоб 9це 1001було моїм вкладом 0011. Це нормально?
Євангеліє Тон

Перший біт, який є 1першим, є частиною виклику, і (повторне) переміщення цього біта буде тривілізувати виклик, тому я боюся, що вам доведеться сказати вам ні, @TonHospel. Однак ви можете видалити його зі свого входу в програмі.
Олів'є Грегоар

Відповіді:


7

Желе , 8 байт

¬œṗ+\Ṭz0

Монадична посилання, що приймає число як список одиниць і нулів (наприклад, 13є [1,1,0,1]), що повертає список списків одиниць і нулів, де перший список є першим рядком.

Спробуйте в Інтернеті! або переглянути відформатований набір тестів

Як?

¬œṗ+\Ṭz0 - Link: list L           e.g. [1,1,0,0,1,1,0,1] (i.e. 205)
¬        - logical NOT L               [0,0,1,1,0,0,1,0]
    \    - cumulative reduce L by:
   +     -   addition                  [1,2,2,2,3,4,4,5]
 œṗ      - partition @ truthy indices  [[1,2],[2],[2,3,4],[4,5]]
     Ṭ   - un-truth (vectorises)       [[1,1],[0,1],[0,1,1,1],[0,0,0,1,1]]
      z0 - transpose with filler 0     [[1,0,0,0],[1,1,1,0],[0,0,1,0],[0,0,1,1],[0,0,0,1]]
         -                        i.e.  1000
                                        1110
                                        0010
                                        0011
                                        0001

11

MATL , 14 байт

J_iB^YsJ+'o-'&XG

Виробляє графічний вихід як шлях, починаючи з координат (0,0). Спробуйте в MATL Online! Або подивіться кілька прикладів офлайн нижче:

  • Вхід 7:

    введіть тут опис зображення

    Вихід:

    введіть тут опис зображення

  • Вхід 699050:

    введіть тут опис зображення

    Вихід:

    введіть тут опис зображення

Якщо ви віддаєте перевагу, ви можете бачити шлях як складні координати на 9 байт :

J_iB^YsJ+

Спробуйте в Інтернеті!

Пояснення

J_      % Push -1j (minus imaginary unit)
i       % Push input number
B       % Convert to binary. Gives an array of 0 and 1 digits
^       % Power, element-wise. A 0 digit gives 1, a 1 digit gives -1j
Ys      % Cumulative sum. Produces the path in the complex plane
J+      % Add 1j, element-wise. This makes the complex path start at 0
'o-'    % Push this string, which defines plot makers
&XG     % Plot

7

MATL , 10 байт

YsG~YsQ1Z?

Вводить масив двійкових цифр. Виводить матрицю.

Спробуйте в Інтернеті!

Пояснення

Ys    % Implicit input: array of binary digits. Cumulative sum. This gives the
      % row coordinates
G     % Push input again
~     % Negate: change 0 to 1 and 1 to 0
Ys    % Cumulative sum
Q     % Add 1. This gives the column coordinates
1Z?   % Matrix containing 1 at those row and column coordinates and 0 otherwise.
      % Implicit display


6

Вугілля , 22 20 19 11 10 байт

F⮌S¿Iι↑*←*

Лише моя друга відповідь Вугілля досі.

Приймає вхід як бінарний-String (тобто 699050як 10101010101010101010).

-9 байтів завдяки @Neil пропонує циклічно повернути назад.

Спробуйте в Інтернеті.

Пояснення:

Прочитайте STDIN як рядок у зворотному порядку:

Reverse(InputString())
⮌S

Переведіть цикл на його двійкові цифри як рядки ι:

For(Reverse(InputString()))
F⮌S

Якщо ιповернуто на номер 1, надрукуйте *вгору, а потім роздрукуйте *ліворуч.

If(Cast(i)) Print(:Up,"*"); Else Print(:Left,"*");
¿Iι↑*←*

1
Це було б вдвічі довше, якби ви надрукували рядок зворотним ходом, починаючи з кінця, обробляючи та ліворуч.
Ніл

@Neil Добре, тепер це слід виправити. Спасибі! -8 байт
Кевін Кройсейсен

1
Збережіть інший байт, видаливши {}s.
Ніл

1
Baseтільки коштує 1 байт , як вам не потрібно Castвзагалі: F⮌↨N²¿ι↑*←*.
Ніл

1
@KevinCruijssen Вибачте за пізню відповідь, але щоб відповісти на ваші запитання: немає зворотнього зв’язку -v, оскільки вугілля було розроблено як гольф-мова, і я додав багатослівний режим лише для того, щоб легше було вводити та розуміти. (Я можу додати його, якщо хочете). -aскорочено --ast, я додав його (формат, взятий з PyTek btw), щоб допомогти мені зрозуміти короткий код з якомога меншими зусиллями: P (і це дійсно допомагає, коли ви випадково зіпсували порядок аргументів). Крім того , чи не то, що -lце окремий варіант. (Також просто зробити -hдля допомоги в / описі командного рядка арг)
ASCII-тільки

6

C # (.NET Core) , 155 123 120 113 101 байт

Збережено 32 байти завдяки тому, що вхід може бути отриманий як масив бітів.
Збережено 7 байт завдяки @auhmaan.
Збережено 10 байт завдяки @KevinCruijssen.

n=>{var m="";for(int i=0,c=1;i<n.Length;)m+=n[i++]<1?c++%1+"":(i>1?"\n":"")+"0".PadLeft(c);return m;}

Спробуйте в Інтернеті!


Хіба ви не можете змінити +new string(' ',c)+"*"на +"*".PadLeft(c)(економія 7 байт)?
auhmaan

@auhmaan Ви маєте рацію, дякую!
Ян Х.

-4 байти, надрукувавши 0замість *: if(n[i++]<1){m+="*";c++;}до if(n[i++]<1)m+=c++%1;і "*".PadLeft(c);до"0".PadLeft(c);
Кевін Круїйсен

Виправлення, це насправді -12 байт, тому що m+=тепер може бути потрійним, якщо:m+=n[i++]<1?c++%1+"":(i>1?"\n":"")+"0".PadLeft(c);
Кевін Круїйсен

1
@KevinCruijssen Спасибі, використання 0's та використання термінального оператора дуже розумно! Я також зафіксував справу 699060, просто встановивши cодин початок, я якось пропустив це під час перевірки тестових випадків.
Ян Х.

5

05AB1E , 18 17 14 байт

γ€gć¸s>«1IÔ·ÌΛ

Спробуйте в Інтернеті!

Пояснення

γ€g             # Push the input as the array as chuncks of consecutive elements, map with length
   ć¸s>«        # Increment each value except the first one
        1I      # Push 1 and the input       
          Ô     # Push connected uniquified input (first elements of each chunck of consecutive elements in the input)
           ·Ì   # Map each with 2 * a + 2
             Λ  # Draw canvas :-)
  • 3 байти завдяки @Emigna

Пояснення 05AB1E полотна


1
γ€gć¸s>«1IÔ·ÌΛмає зберегти 4 байти.
Емінья

@Emigna Блискуче, дякую! Повністю забув, що там було вбудовано + 2:
Калдо


3

Haskell , 65 байт

f(a:b)|a="*":f b|(x:y)<-f b=('*':x):map(' ':)y
f[]=["*"]
f.tail

Спробуйте в Інтернеті!

Вводиться як список булів.

Каррі PAKCS, 70 байт

u(a:b)=('*':a):map(' ':)b
f(a:b)|a="*":f b|1>0=u$f b
f[]=["*"]
f .tail

Порт відповіді Хаскелла, але оскільки <-він не працює в Кері, нам потрібно зробити функцію помічника u. Нам також необхідно додати пробіл між fі .так , що Каррі розбирає його як компози , а не крапка.

Це також працює в MCC Curry, але не працює в Sloth Curry (який єдиний підтримується TIO).


3

Haskell , 74 70 67 62 байт

tail.("\n"%)
s%(x:r)=([1..x]>>s)++'*':(s++[' '|x<1])%r
s%[]=""

Спробуйте в Інтернеті! Приймає список нулів та одиниць як вхідні дані та повертає розділений рядок нового рядка.

Натхненний відповіддю xnor .



1
@ user56656 Твоя черга знову :)
Лайконі

3

Emojicode , 251 байт

🐖🎅🏿🍇🍦b🔡🐕2🍦c🔤*🔤🍮e🔤🔤🍮y🔤🔤🍦k🍡b🔂i k🍇🍊😛🔡i🔤1🔤🍇🍊😛y e🍇🍉🍓🍇😀y🍉🍮y🔤🔤🍮y🍪e c🍪🍉🍓🍇🍮y🍪y c🍪🍮e🍪🔤 🔤 e🍪🍉🍉😀y🍉

Спробуйте в Інтернеті!

Це, безумовно, не рішення для гольфу, але немає живої людини, яка вважала б код Emoji гольф-мовою. Однак, піддаючи себе жахам, які є синтаксисом емоджи-коду в ефорі, щоб навчити себе цій чудовиськості мови, я був приємно здивований тим, наскільки потужним та ефективним він може бути 😀

Пояснення:

🐋 🚂 🍇    👴 Define Class
🐖🎅🏿🍇    👴 Define Method
🍦b🔡🐕2    👴Convert Input integer to binary string
🍦c🔤*🔤    👴 asterisk string
🍮e🔤🔤    👴 Spacing string
🍮y🔤🔤    👴 output string
🍦k🍡b    👴 translate to iteratable
🔂i k🍇    👴 for-in loop to iterate over each digit 
🍊😛🔡i🔤1🔤🍇    👴 if digit is 1:
🍊😛y e🍇🍉    👴 don't print initial newline
🍓🍇😀y🍉    👴 print spaces + asterisks
🍮y🔤🔤    👴 reset output string
🍮y🍪e c🍪🍉    👴 add correct number of spaces and one asterisk
🍓🍇    👴 if digit is 0:
🍮y🍪y c🍪    👴 add an asterisk to the output string
🍮e🍪🔤 🔤 e🍪    👴 add another space to the space string
🍉🍉
😀y    👴 print one last output string
🍉🍉
🏁🍇    👴 Start Program
 🎅🏿 699050    👴 Call Method
🍉

2

JavaScript (ES6), 48 байт

Той самий формат вводу / виводу та така ж логіка, що і рекурсивна версія нижче.

a=>a.map((n,i)=>n?i&&p+0:+(p+=' '),p=`
`).join``

Спробуйте в Інтернеті!

Або 42 байти, якщо цей формат прийнятний.


Рекурсивна версія, 56 байт

Приймає введення як масив цілих чисел (0 або 1). Використовується 0для заповненого та місця для порожнього.

f=([n,...a],p=`
`,x=0)=>1/n?(n?x+0:+(p+=' '))+f(a,p,p):a

Спробуйте в Інтернеті!

Прокоментував

f = (               // f = recursive function taking:
  [n, ...a],        //   n = current bit; a[] = remaining bits
  p = `\n`,         //   p = padding string, initialized to a linefeed
  x = 0             //   x = 0 on the 1st iteration / equal to p after that
) =>                //
  1 / n ?           // if n is defined:
    ( n ?           //   if n = 1:
        x + 0       //     append x + 0 --> either the integer 0 on the first iteration
                    //                      or the padding string followed by a '0'
      :             //   else:
        +(          //     append the integer 0 (whitespace coerced to a number)
          p += ' '  //     and append a space to the padding string
        )           //
    ) + f(a, p, p)  //   append the result of a recursive call with x = p
  :                 // else:
    a               //   append the empty array a[], forcing coercion to a string

2

Утиліти Bash + GNU, 38

dc -e?2op|sed 's/\B1/^K^H*/g;s/[10]/*/g'

Тут ^Kі ^Hзнаходяться буквальні символи управління вертикальною вкладкою та зворотним простором. Вони не відображаються добре в браузерах, тому цей сценарій можна відтворити так:

base64 -d <<< ZGMgLWU/Mm9wfHNlZCAncy9cQjEvCwgqL2c7cy9bMTBdLyovZyc= > binpath.sh

Запустити в термінал. Введення здійснюється через STDIN.

Ця відповідь може розтягнути технічні характеристики занадто далеко - насправді немає провідних символів у кожному рядку виводу - все позиціонування здійснюється за допомогою контрольних символів. Якщо це занадто велика розтяжність, то вихід може бути пов'язаний |col -x|tacз додатковими 11 байтами.


2

Пакетна, 113 байт

@set s=
:l
@shift
@if %1.==0. set s=%s%+&goto l
@echo %s%+
@if not %s%.==. set s=%s:+= %
@if %1.==1. goto l

Приймає список бітів як аргументів командного рядка. Використання +замість того, *що *має особливе значення всередині %s:...=...%розширень.


2

Java 10, 100 106 байт

b->{var s="";int i=0,j;for(var c:b){if(c)for(s+="\n",j=i;j-->0;)s+=0;else++i;s+=1;}return s.substring(1);}

Бере масив булевих і повертає рядок ( 0s порожні, 1s заповнені). Спробуйте його онлайн тут .

Завдяки Олів'є Грегоаре за те, що він трохи більше допоміг мені в гольфі та попередив мене про те, що мій вихідний формат не відповідав специфікації.

Негольована версія:

b -> { // lambda taking an array of booleans as argument
    var s = ""; // the output String
    int i = 0,  // the number of "empty" characters to output
    j;          // iterator variable for outputting the "empty" characters
    for(var c : b) { // iterate over the boolean array (the binary digits)
        if(c) // if it's a '1'
            for(s += "\n", // output a newline
            j = i; j-- > 0;) s += 0; // output the "empty" characters
        else // if it's a '0'
            ++i; // move one to the right on the next line
        s += 1; // output the "filled" character
    }
    return s.substring(1); // output the constructed String, minus the leading newline
}

Я пограв у 5 байт:{if(c){s+="\n";for(j=i;j-->0;)s+=0;}else++i;s+=1;}
Олів'є Грегоар

Ще далі:{if(c)for(s+="\n",j=i;j-->0;)s+=0;else++i;s+=1;}
Олів'є Грегоар

Хоча ви друкуєте не на першому рядку, а на другому. З виклику: "Жодні провідні пробіли (або" порожні "символи) / рядки не дозволені"
Олів'є Грегоар

@ OlivierGrégoire Дякую Я відредагував.
OOBalance


1

Haskell , 126 байт

(#)n=maximum.map(!!n)
f l|s<-scanl1(zipWith(+))$(\a->[1-a,a])<$>l=unlines[[last$' ':['#'|elem[x,y]s]|x<-[0..0#s]]|y<-[1..1#s]]

Введіть як список нулів та одиниць. Перетворює число на компенсацію на x↦[1-x,x]та обчислює часткові суми. Підсумковий результат робиться за допомогою двох вкладених розумінь списку.

Спробуйте в Інтернеті!


1

R , 59 байт

function(n,x=sum(n|1))matrix(1:x^2%in%cumsum((n-1)%%x+1),x)

Спробуйте в Інтернеті!

Приймає введення як масив бітів.

Повертає булеву матрицю TRUEта FALSEпредставляє a *і a відповідно.

У нижньому колонтитулі також є кілька матеріалів для друку матриці, що відповідає вищевказаним характеристикам, для зручності тестування.


1

APL + WIN, 65 або 46 байт

Підказки для введення цілого числа

n←+/i←((1+⌊2⍟n)⍴2)⊤n←⎕⋄m←(n,n)⍴' '⋄m[⊂[2](+\i),[1.1]1++\~i]←'*'⋄m

або для числового вектора двійкового подання цілого числа

m←(2⍴+/n←⎕)⍴' '⋄m[⊂[2](+\i),[1.1]1++\~i]←'*'⋄m

припускаючи, що я прочитав коментарі до певних відповідей правильно, і остання інформація дозволена.


1

Pyth, 23 байти

p\*VtQINp+b*Zd.?=hZ)p\*

Спробуйте тут

Пояснення

p\*VtQINp+b*Zd.?=hZ)p\*
p\*                       Print the leading *.
   VtQ                    For each bit (excluding the leading 1)...
      IN      .?   )      ... If the bit is set...
        p+b*Zd            ... Print a newline and a bunch of spaces...
                =hZ       ... Otherwise, increase the count of spaces...
                    p\*   ... Then print the next *.


1

SmileBASIC, 64 59 57 байт

INPUT N@L
GPSET X,Y
B=N<0X=X+B
Y=Y+(X>B)N=N<<1ON!N GOTO@L

Перевіряється найвищий біт (біт знака), і якщо він дорівнює 1, позиція X збільшується. Якщо бітовий знак менше, ніж позиція X (тобто біт знака дорівнює 0, а X - не 0), положення Y збільшується.

Перший рух завжди буде горизонтально, тому рух Y блокується до першого руху X. Це гарантує, що положення Y не збільшується під час провідних 0 біт.

Потім N зміщується вліво, і це повторюється, поки N не досягне 0.



1

Japt , 19 17 байт

Ë?R+Tî +QT©Qìx
Ë?                 // Map over the input and if the current value is 1:
  R+               // Return a new line and
    Tî +           // a space repeated T (with initial value 0) times and
        Q          // a \".
         :         // If the current value is 0:
          °T       // Increment T
            ©Q     // and return \".
              Ã    // When all of that is done,
               ¬   // turn the array into a string
                x  // and trim it, removing the excess new line at the start.

Приймає введення як масив бітів, наприклад [1,0,1], виводить "замість *.
Поголив два байти завдяки Оліверу .

Спробуйте в Інтернеті!


Хороший. Ви можете замінити SpTна - îподібний p, за винятком, за замовчуванням " ". Також є ярлик для q :¬
Олівер

@Oliver Спасибі, я не знав про це î, звичайно, дуже зручно. Я часто перевіряю шанси скористатися ярликами, але все одно завжди пропускаю деякі з них, дякую за вашу допомогу.
Ніт

1

Пітон 2, 113 байт

def f(a):
 o='*';r=[o]
 for i in bin(a)[3:]:
  if'0'<i:r+=[' '*len(r[-1][1:])]
  r[-1]+=o
 print'\n'.join(r)

Не впевнений, чи враховується цей (він виводить масив кожного з рядків), але якщо так, то я зміню кількість байтів на 103:

def f(a):
 o='*';r=[o]
 for i in bin(a)[3:]:
  if'0'<i:r+=[' '*len(r[-1][1:])]
  r[-1]+=o
 print r

1

TI-Basic (TI-84 Plus CE), 85 байт

Prompt L
1→X
1→Y
DelVar [A]
sum(LL
{Ans,1-Ans+dim(LL→dim([A]
1→[A](Y,X
For(I,2,dim(LL
Y+LL(I→Y
X+not(LL(I→X
1→[A](Y,X
End
[A]

Запрошує на список булів, повертає матрицю 0 і 1.

Проходить список, збільшуючи X, якщо наступний "біт" дорівнює 0, змінюючи Y в іншому випадку, потім додаючи 1 до матриці в цьому місці, і повертає матрицю в кінці.

TI-Basic - це токенізований простір .

  • 1 байт: Prompt , L* 6, (переклад рядка) * 12, 1* 5, * 7, X* 5, Y* 5, sum(, L* 5, {, Ans* 2, ,* 5, -, +* 3, dim(* 3, (* 4, For(, I* 3, 2, not(, End= 73 байт
  • 2 байта: Delvar , [A]* 5 = 12 байт
  • Всього: 85 байт

TI-Basic (TI-84 Plus CE), 56 байт

Prompt L
1→X
1→Y
Output(Y,X,"*
For(I,2,dim(LL
Y+LL(I→Y
X+not(LL(I→X
Output(Y,X,"*
End

Такі самі процеси, як і вище, але використовуючи графічний вихід (обмежений розміром екрана: 10 рядків, 26 стовпців, тобто максимум 10 1s та 25 0s), як це відбувається, замість додавання до матриці.



1

x86 .COM, 32 байти

00h: 66 D1 E6 66 0F BD CE BF 24 AD 8E DF 41 66 0F A3 
10h: CE 19 DB 81 E3 9E 00 8D 79 02 C6 05 2A E2 EE C3 

fun:
shl esi, 1
bsr ecx, esi
mov di, $ad24
mov ds, di
inc cx
lab2:
bt esi, ecx
sbb bx,bx
and bx,158
lea di,[di+2+bx]
mov [di],byte '*'
lab1:loop lab2
ret  

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