Keluarkan jalur biner dari angka


22

Untuk bilangan bulat nyang memuaskan n > 0, tulis nilainya sebagai jalur turun kanan berdasarkan representasi binernya.

Aturan

  • Set bit pertama (paling signifikan) selalu di sudut kiri atas.
  • Ketika bit berikutnya diatur (a 1), gambar sebuah karakter ("diisi") pada baris berikutnya di kolom yang sama dengan karakter sebelumnya digambar. Cobalah untuk menggunakan spasi ("kosong") untuk mengisi, tetapi karakter apa pun akan melakukan selama itu selalu sama.
  • Ketika bit berikutnya tidak disetel (a 0), gambarlah sebuah karakter ("terisi") pada baris yang sama segera di sebelah kanan karakter sebelumnya yang digambar.
  • Kode Anda harus mendukung angka dengan setidaknya 20 bit signifikan.
  • Tulis program lengkap, fungsi, lambda, dll. Tetapi tidak ada cuplikan.
  • Tidak ada spasi spasi (atau karakter "kosong") / baris yang diizinkan
  • Sejumlah spasi tambahan (atau karakter "kosong") / baris diizinkan
  • Segala jenis input 1D diterima: angka, string, array booleans, dll. Jaga agar urutan bit tidak tersentuh.
  • Segala jenis output 2D visual diterima: pada stdout, sebuah string (dengan dua nilai berbeda yang mewakili "diisi" dan "kosong"), Anda bahkan dapat menampilkan matriks jika Anda mau. Daftar angka tampaknya sulit untuk didamaikan dengan aturan "no heading heading", tetapi saya terbuka untuknya jika Anda menemukan cara untuk menggunakannya. Catatan: jika Anda memilih untuk mencetak atau mengembalikan string, karakter yang digunakan harus karakter ASCII dalam rentang codepoint [32-126].
  • Celah standar dilarang.
  • Ini adalah codegolf sehingga kode terpendek menang.

Contohnya

Input: 1

*

Input: 2

**

Input: 3

*
*

Input: 4

***

Input: 5

**
 *

Input: 6

*
**

Input: 7

*
*
*

Input: 25

*
***
  *

Input: 699050

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

Input: 1047552

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

Input: 525311

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


Apakah "array input yang diizinkan dari boolean" berarti bahwa mengambil input dalam bentuk representasi biner angka sebagai array diperbolehkan?
Nit

3
@Tidak Setiap input 1D. Jadi, jika angkanya 5, Anda mungkin memiliki array input yang mirip dengan [1,0,1], ya.
Olivier Grégoire

Jadi seberapa bebaskah format itu? Saya ingin mengambil nomor sebagai digit biner dengan yang pertama 1 pindah ke akhir, jadi karena 9ini 1001saya ingin masukan saya untuk menjadi 0011. Apakah itu oke?
Ton Hospel

Memiliki bit pertama menjadi yang 1pertama adalah bagian dari tantangan, dan (kembali) menggerakkan bit itu akan meremehkan tantangan, jadi saya takut saya harus mengatakan Anda tidak, @TonHospel. Anda dapat menghapusnya dari input Anda di program.
Olivier Grégoire

Jawaban:


7

Jelly , 8 byte

¬œṗ+\Ṭz0

Sebuah link monadik menerima nomor sebagai daftar satu dan nol (misalnya 13adalah [1,1,0,1]) kembali daftar daftar dari satu dan nol di mana daftar pertama adalah baris pertama.

Cobalah online! atau lihat test-suite yang diformat

Bagaimana?

¬œṗ+\Ṭ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 byte

J_iB^YsJ+'o-'&XG

Menghasilkan keluaran grafis sebagai jalur mulai dari koordinat (0,0). Cobalah di MATL Online! Atau lihat beberapa contoh offline di bawah ini:

  • Masukan 7:

    masukkan deskripsi gambar di sini

    Keluaran:

    masukkan deskripsi gambar di sini

  • Masukan 699050:

    masukkan deskripsi gambar di sini

    Keluaran:

    masukkan deskripsi gambar di sini

Jika Anda suka, Anda dapat melihat jalur sebagai koordinat kompleks untuk 9 byte :

J_iB^YsJ+

Cobalah online!

Penjelasan

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 byte

YsG~YsQ1Z?

Input array digit biner. Menghasilkan matriks.

Cobalah online!

Penjelasan

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

Arang , 22 20 19 11 10 byte

F⮌S¿Iι↑*←*

Sejauh ini hanya jawaban kedua Arang saya.

Mengambil input sebagai binary-String (yaitu 699050sebagai 10101010101010101010).

-9 byte terima kasih kepada @Neil menyarankan untuk mengulang ke belakang.

Cobalah online.

Penjelasan:

Baca STDIN sebagai string dalam urutan terbalik:

Reverse(InputString())
⮌S

Lingkari angka binernya sebagai string ι:

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

Jika ιdilemparkan kembali ke angka 1, cetak ke *atas, atau cetak ke *arah kiri.

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

1
Ini akan menjadi setengah panjang jika Anda mencetak string secara terbalik, mulai dari akhir dan bekerja naik turun.
Neil

@Neil Ok, sekarang harus diperbaiki. Terima kasih! -8 bytes
Kevin Cruijssen

1
Simpan byte lain dengan menghapus {}s.
Neil

1
Basehanya biaya 1 byte karena Anda tidak perlu Castsama sekali: F⮌↨N²¿ι↑*←*.
Neil

1
@KevinCruijssen Maaf atas jawaban yang terlambat, tetapi untuk menjawab pertanyaan Anda: tidak ada kebalikan dari -v, karena Charcoal dirancang sebagai bahasa golf, dan saya menambahkan mode verbose hanya untuk membuatnya lebih mudah untuk mengetik dan memahami. (Saya dapat menambahkan satu jika Anda mau). -akependekan --ast, saya menambahkannya (format diambil dari PyTek btw) untuk membantu saya memahami kode ringkas dengan sesedikit mungkin upaya: P (dan itu sangat membantu ketika Anda secara tidak sengaja mengacaukan urutan argumen). Juga, tidak -ladalah terpisah pilihan. (juga hanya melakukan -huntuk bantuan pada / deskripsi argumen baris perintah)
ASCII-hanya

6

C # (.NET Core) , 155 123 120 113 101 byte

Disimpan 32 byte karena input dapat diterima sebagai array bit.
Disimpan 7 byte berkat @auhmaan.
Disimpan 10 byte berkat @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;}

Cobalah online!


Tidak bisakah Anda mengubah +new string(' ',c)+"*"ke +"*".PadLeft(c)(menyimpan 7 byte)?
auhmaan

@auhmaan Anda benar, terima kasih!
Ian H.

-4 byte dengan mencetak 0alih-alih *: if(n[i++]<1){m+="*";c++;}ke if(n[i++]<1)m+=c++%1;dan "*".PadLeft(c);ke"0".PadLeft(c);
Kevin Cruijssen

Koreksi, sebenarnya -12 byte karena m+=sekarang dapat menjadi ternary-if:m+=n[i++]<1?c++%1+"":(i>1?"\n":"")+"0".PadLeft(c);
Kevin Cruijssen

1
@KevinCruijssen Terima kasih, penggunaan 0dan penggunaan operator ternary sangat cerdas! Saya juga memperbaiki kasing untuk 699060, dengan hanya mengatur csatu permulaan, saya agak merindukan itu saat memeriksa kasing.
Ian H.

5

05AB1E , 18 17 14 byte

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

Cobalah online!

Penjelasan

γ€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 byte terima kasih kepada @Emigna

Penjelasan kanvas 05AB1E


1
γ€gć¸s>«1IÔ·ÌΛharus menyimpan 4 byte.
Emigna

@Emigna Brilliant, terima kasih! Benar-benar lupa bahwa ada +2 builtin o:
Kaldo


3

Haskell , 65 byte

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

Cobalah online!

Mengambil input sebagai daftar boolean.

Curry PAKCS, 70 byte

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

Port of the Haskell menjawab, tetapi karena <-tidak berfungsi di Curry kita perlu membuat fungsi helper u. Kita juga perlu menambahkan spasi di antara fdan .agar Curry mem-parsingnya sebagai komposisi alih-alih sebuah titik.

Ini juga berfungsi di MCC Curry, tetapi tidak berfungsi di Sloth Curry (yang merupakan satu-satunya yang didukung oleh TIO).



3

Emojicode , 251 byte

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

Cobalah online!

Ini jelas bukan solusi golf, tetapi tidak ada orang hidup yang akan menganggap Emoji-kode bahasa golf. Namun, dalam proses menundukkan diri saya pada kengerian yang merupakan sintaksis kode emoji dalam upaya untuk mengajarkan kepada diri sendiri kebodohan bahasa ini, saya terkejut dengan betapa kuat dan efisiennya hal itu 😀

Penjelasan:

🐋 🚂 🍇    👴 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 byte

Format I / O yang sama dan logika yang sama dengan versi rekursif di bawah ini.

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

Cobalah online!

Atau 42 byte jika format ini dapat diterima.


Versi rekursif, 56 byte

Mengambil input sebagai array bilangan bulat (0 atau 1). Penggunaan 0untuk diisi dan ruang kosong.

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

Cobalah online!

Berkomentar

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

Utilitas Bash + GNU, 38

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

Di sini ^Kdan^H merupakan karakter kontrol tab vertikal dan backspace literal. Ini tidak ditampilkan dengan baik di browser, jadi skrip ini dapat dibuat ulang sebagai berikut:

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

Berlari di terminal. Masukan melalui STDIN.

Jawaban ini dapat memperluas spesifikasi terlalu jauh - sebenarnya tidak ada karakter utama di setiap baris output - semua penentuan posisi dilakukan dengan karakter kontrol. Jika ini terlalu banyak peregangan, maka output dapat disalurkan ke |col -x|tacuntuk 11 byte tambahan.


2

Batch, 113 byte

@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

Mengambil daftar bit sebagai argumen baris perintah. Penggunaan +bukan *karena *memiliki makna khusus di dalam %s:...=...%ekspansi.


2

Java 10, 100 106 byte

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);}

Mengambil array booleans dan mengembalikan sebuah String ( 0s kosong, 1s diisi). Cobalah online di sini .

Terima kasih kepada Olivier Grégoire karena membantu saya golf sedikit lebih banyak dan mengingatkan saya pada kenyataan bahwa format output saya tidak sesuai dengan spesifikasi.

Versi tidak disatukan:

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
}

Saya bermain golf 5 byte:{if(c){s+="\n";for(j=i;j-->0;)s+=0;}else++i;s+=1;}
Olivier Grégoire

Bahkan lebih jauh:{if(c)for(s+="\n",j=i;j-->0;)s+=0;else++i;s+=1;}
Olivier Grégoire

Padahal, Anda tidak mencetak pada baris pertama tetapi pada yang kedua. Dari tantangan: "Tidak ada spasi di depan (atau char" kosong ") / jalur yang diperbolehkan"
Olivier Grégoire

@ OlivierGrégoire Terima kasih. Saya telah mengedit.
OOBalance


1

Haskell , 126 byte

(#)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]]

Masukan sebagai daftar nol dan satu. Mengubah angka menjadi diimbangi olehx↦[1-x,x] dan menghitung jumlah parsial. Hasil akhir dilakukan dengan dua pemahaman daftar bersarang.

Cobalah online!


1

R , 59 byte

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

Cobalah online!

Mengambil input sebagai array bit.

Mengembalikan matriks boolean TRUEdan FALSEmewakili a *dan a , masing-masing.

Juga memiliki beberapa hal di footer untuk mencetak matriks yang sesuai dengan spesifikasi di atas, untuk kemudahan pengujian.


1

APL + WIN, 65 atau 46 byte

Meminta input bilangan bulat

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

atau untuk vektor numerik dari representasi biner dari integer

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

dengan asumsi saya telah membaca komentar untuk jawaban tertentu dengan benar dan input terakhir diperbolehkan.


1

Pyth, 23 byte

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

Coba di sini

Penjelasan

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

Perl 5 -p , 54 36 byte

s/./$&?"
".$"x$i.1:++$i&&1/ge;s/.//s

Cobalah online!

Potong turun setelah saya menyadari bahwa input bisa berupa string sedikit.


1

SmileBASIC, 64 59 57 byte

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

Bit tertinggi (bit tanda) dicentang, dan jika 1, posisi X meningkat. Jika bit tanda kurang dari posisi X (yaitu, bit tanda adalah 0 dan X bukan 0) posisi Y meningkat.

Gerakan pertama akan selalu horizontal, jadi gerakan Y diblokir sampai setelah gerakan X pertama. Ini memastikan bahwa posisi Y tidak meningkat selama 0 bit awal.

Kemudian N digeser ke kiri, dan ini berulang sampai N mencapai 0.



1

Japt , 19 17 byte

Ë?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.

Mengambil input sebagai array bit, misalnya [1,0,1], "bukannya output *.
Bercukur dua byte karena Oliver .

Cobalah online!


Bagus Anda dapat mengganti SpTdengan - îmirip dengan p, kecuali defaultnya adalah " ". Juga, ada jalan pintas untuk q :¬
Oliver

@ Lebih Terima kasih, saya tidak tahu î, tentu sangat berguna. Saya sering memeriksa peluang untuk menggunakan pintasan, tetapi saya masih selalu melewatkan beberapa di antaranya, terima kasih banyak atas bantuan Anda.
Nit

1

Python 2, 113 Bytes

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)

Tidak yakin apakah yang ini diperhitungkan (output array dari masing-masing baris), tetapi jika demikian maka saya akan mengubah jumlah byte saya menjadi 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 byte

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]

Meminta daftar boolean, mengembalikan matriks 0 dan 1.

Pergi melalui daftar, menambah X jika 'bit' berikutnya adalah 0, mengubah Y sebaliknya, lalu menambahkan 1 ke matriks di lokasi itu, dan mengembalikan matriks di akhir.

TI-Basic adalah lanugage tokenized .

  • 1 byte: Prompt , L* 6, (baris) * 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 bytes
  • 2 bytes: Delvar , [A]* 5 = 12 byte
  • Total: 85 byte

TI-Basic (TI-84 Plus CE), 56 byte

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

Proses yang sama seperti di atas, tetapi menggunakan output grafis (dibatasi oleh ukuran layar: 10 baris, 26 kolom, jadi maks 10 1s dan 25 0s) saat berjalan, alih-alih menambahkan ke matriks.


1

Pyth, 30 byte

JZFG.BQIsGIJk)p+*ZdN.?pN=hZ)=J

Cobalah online!

Penggunaan " bukan* .

Terjemahan Python 3:
Q=eval(input())
Z=0
J=Z
for G in "{0:b}".format(Q):
    if int(G):
        if J:
            print()
        print(Z*' '+'"',end='')
    else:
        print('"',end='')
        Z+=1
    J=Q

1

x86 .COM, 32 byte

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  

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.