Tulis lembar contekan kode Morse yang diformat

24

Tantangan:

Tulis program yang menghasilkan output berikut:

. E   .. I   ... S   .... H
                     ...- V
             ..- U   ..-. F
                     ..--  
      .- A   .-. R   .-.. L
                     .-.-  
             .-- W   .--. P
                     .--- J
- T   -. N   -.. D   -... B
                     -..- X
             -.- K   -.-. C
                     -.-- Y
      -- M   --. G   --.. Z
                     --.- Q
             --- O   ---.  
                     ----  

Ini adalah tabel yang diformat dari kode Morse dari huruf-huruf dari A hingga Z. Setiap kolom dipisahkan oleh tiga spasi.

Ada empat slot yang hilang, yang digunakan oleh set karakter internasional. Program Anda harus menulis spasi di sana.

Output harus terdiri dari ruang ASCII, titik, tanda hubung, huruf besar dan baris baru (baik LF atau CRLF) saja.

Program Anda tidak menerima input.

Berikut ini adalah contoh program Python yang menghasilkan output yang diinginkan:

b = "."
out = []
last = 0
ch = "EISHVUF ARL WPJTNDBXKCYMGZQO  "
cx = 0
while b:
    if last >= len(b):
        print("   ".join(out))
        out = ["   ", "    ", "     ", "      "][0:len(b) - 1]
    out.append(b + " " + ch[cx])
    cx += 1
    last = len(b)
    if len(b) < 4:
        b += "."
    elif b[-1] == ".":
        b = b[0:-1] + "-"
    else:
        i = len(b) - 1
        while b[i] == "-":
            i -= 1
            if i < 0:
                break
        if i < 0:
            break
        b = b[0:i] + "-"
print("   ".join(out))

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Locoluis
sumber
1
dapatkah masing-masing baris 3 spasi sebelumnya?
dzaima
1
Celah standar melarang solusi pengkodean keras. Berapa banyak tabel yang kita perbolehkan untuk kode keras?
Brunner
@ Brunner mempertimbangkan tabel sekitar 450 byte, saya ragu hard coding adalah solusi optimal
Cyoce
@Cyoce Jelas bukan versi terpendek di sini, tetapi Joerg Huelsermann mendapatkannya hingga 208 byte dalam jawaban php yang brilian.
Brunner
1
Apakah kami diizinkan memiliki ruang tambahan?
Adám

Jawaban:

5

Jelly , 85 byte

ØQj⁶“_ȦeƤbṅỌU@⁼Cq’œ?;⁶$⁺ṁ®L€€¤
4R2ṗ©ị⁾.-;€€⁶ż"¢;€€⁶$⁺W€€j"731Dẋ@⁶¤ZµKFṚ;⁶ẋ³¤ḣ29ṫ3Ṛµ€Y

Program lengkap mencetak lembar cheat.

Cobalah online!

Bagaimana?

Catatan: Saya pikir mungkin ada cara untuk memangkas ini dengan membentuk daftar yang memformat dengan benar dengan menggunakan atom grid G,, tapi saya tidak bisa mengetahui caranya.

ØQj⁶“_ȦeƤbṅỌU@⁼Cq’œ?;⁶$⁺ṁ®L€€¤ - Link 1: get "letters" lists: no arguments
ØQ                             - Qwerty yield = ["QWERTYUIOP","ASDFGHJKL","ZXCVBNM"]
  j⁶                           - join with spaces = "QWERTYUIOP ASDFGHJKL ZXCVBNM"
    “_ȦeƤbṅỌU@⁼Cq’             - base 250 number = 23070726812742121430711954614
                  œ?           - lexicographical permutation at index = "ETIANMSURWDKGOHVF L PJBXCYZQ"
                       ⁺       - do this twice:
                      $        -   last two links as a monad
                    ;⁶         -     concatenate a space              = "ETIANMSURWDKGOHVF L PJBXCYZQ  "
                             ¤ - nilad followed by link(s) as a nilad:
                         ®     -   recall from registry (4R2ṗ from the Main link)
                          L€€  -   length for €ach for €ach = [[1,1],[2,2,2,2],[3,3,3,3,3,3,3,3],[4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]]
                        ṁ      - mould like = ["ET","IANM","SURWDKGO","HVF L PJBXCYZQ  "]

4R2ṗ©ị⁾.-;€€⁶ż"¢;€€⁶$⁺W€€j"731Dẋ@⁶¤ZµKFṚ;⁶ẋ³¤ḣ29ṫ3Ṛµ€Y - Main link: no arguments
4R                                                     - range(4) = [1,2,3,4]
  2ṗ                                                   - Cartesian power with 2 = [[[1],[2]],[[1,1],[1,2],[2,1],[2,2]],...,[...,[2,2,2,2]]]
    ©                                                  - copy to register and yield
      ⁾.-                                              - literal ['.','-']
     ị                                                 - index into (makes all the codes, in four lists by length like reading the output top-bottom, left-right)
         ;€€⁶                                          - concatenate a space to each code
               ¢                                       - call last link (1) as a nilad (get the letters reordered as required)
             ż"                                        - zip left and right with zip dyad
                     ⁺                                 - do this twice:
                    $                                  -   last two links as a monad:
                ;€€⁶                                   -     concatenate a space to each code, letter pair
                      W€€                              - wrap each code, letter pair in a list
                                  ¤                    - nilad follwed by link(s) as a nilad:
                           731                         -   literal 731
                              D                        -   to decimal list = [7,3,1]
                               ẋ@⁶                     -   repeat a space = ["       ","   "," "]
                         j"                            - zip with dyad join
                                   Z                   - transpose
                                    µ              µ€  - for each:
                                     K                 -   join with spaces
                                      F                -   flatten
                                       Ṛ               -   reverse
                                            ¤          -   nilad followed by link(s) as a nilad:
                                         ⁶ẋ³           -     space repeated 100 times
                                        ;              -   concatenate
                                             ḣ29       -   head to 29 (make all "lines" the same length)
                                                ṫ3     -   tail from 3 (trim off two spaces from each line)
                                                  Ṛ    -   reverse
                                                     Y - join with newlines
                                                       - implicit print
Jonathan Allan
sumber
7

Python 3.6, 201 197 193 187 byte

for i in range(16):print('   '.join(i%k and' '*(2+j)or f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')+' '+'ETIANMSURWDKGOHVF L PJBXCYZQ  '[2**j-2+i//k]for j,k in zip((1,2,3,4),(8,4,2,1))))

Menggunakan beberapa pemformatan, pembongkaran dan sihir A000918 .

Uriel
sumber
Ngomong-ngomong, f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')panjangnya sama dengan''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Uriel
5

Retina , 125 byte

^
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__
+m`^((.*?)([-.]+) )(\w)((\w)+?)(((?<-6>)\w)+)$
$2$3 $4   $3. $5¶$.1$*     $3- $7
T`\_`p

Cobalah online! Seharusnya 121 byte tetapi saya terlalu malas untuk berurusan dengan spasi pada awal dan akhir. Penjelasan:

[blank line]
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__

Huruf-huruf yang kodenya dimulai .dan -masing-masing dimuat. (Secara teori dimungkinkan untuk menghindari preloading .-tetapi menghemat byte dengan cara ini.) _Digunakan alih-alih spasi karena dianggap sebagai huruf yang membuatnya lebih mudah untuk dicocokkan di bawah ini.

+m`^((.*?)([-.]+) )(\w)((\w)+?)(((?<-6>)\w)+)$
$2$3 $4   $3. $5¶$.1$*     $3- $7

Di sini kami membagi setiap baris menjadi lima bagian:

  • Huruf untuk awalan, jika ada
  • Kode Morse saat ini
  • Surat yang sekarang
  • Paruh pertama dari huruf yang tersisa (karakter berikutnya adalah .)
  • Paruh kedua dari huruf yang tersisa (karakter berikutnya adalah -)

Potongan-potongan itu kemudian disusun kembali menjadi dua garis:

  • Huruf untuk awalan, kode Morse saat ini, huruf saat ini, kode Morse dengan .akhiran, bagian pertama dari huruf yang tersisa
  • Spasi menggantikan tiga bagian pertama, kode Morse dengan -akhiran, bagian kedua dari huruf yang tersisa

Baris baru mengikuti format yang sama dengan baris yang ada, hanya dengan awalan Morse tambahan dan setengah surat yang tersisa untuk diproses. Ini kemudian diulang sampai setiap baris hanya memiliki satu huruf.

_
  [single space]

The _s kemudian diubah kembali ke dalam ruang.

Neil
sumber
3

JavaScript (ES6), 154 147 145 byte

f=(n=r='',d=i=k=0)=>(r+=n&&' '.repeat([d++&&3,21,13,6][i-(i=d-k)])+n+' '+'EISHVUF ARL WPJTNDBXKCYMGZQO  '[k++],d<4)?f(n+'.',d)&&f(n+'-',d):r+=`
`

o.innerHTML = f()
<pre id=o>

Arnauld
sumber
Oh sial! Saya melewatkan yang satu ini ... tidak akan repot kalau tidak! Bagus :-)
Bumpy
2

PHP, 208 Bytes

<?=gzinflate(base64_decode("dZDJEQMhDAT/RNEJaHLwfd+38w/EWrRlu6gVnwZpGhWIGSCxqhCXoFgWhpa3jHtpasYtKOaZZwZ9z/OjCnEOim3imX7et2Y8guKYeR5aF+PqB4/tK8Q0KMbDnnWPeZamZmyCYpJ5Pu/V93y7qxCLoHgnXnf5qZnn/iGo9u1/Gf+XDw=="));

Cobalah online!

PHP, 229 Bytes

<?=strtr("3E0.3I053S0.53H12 2.54V1254U05-3F12 25-4 1.4A0.-3R0.-.3L12 2.-.4 12.-4W0.63P12 2.64J
4T0-3N0-.3D0-53B12 2-54X12-.4K0-.-3C12 2-.-4Y1-4M063G06.3Z12 26.4Q1264O0-63 12 2-64 ",[$a="   ","
$a$a","$a $a",". ","- ","..","--"]);

Cobalah online!

Jörg Hülsermann
sumber
2

Perl 5, 158 156 byte

map{$a=sprintf'%04b',$_;map{$a=~/.{$_}/;print(-$'?' 'x$_:$&=~y/01/.-/r,' ',(' EISHVUF ARL WPJTNDBXKCYMGZQO  '=~/./g)[!-$'&&++$i],$_-4?'   ':"\n")}1..4}0..15
faubi
sumber
2

PHP, 184 183 181 byte

for(;$y<16;$y++,print str_pad(ltrim("$r
"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf("   %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO  "[$i++];

Jalankan dengan -nratau coba online .

kerusakan

for(;$y<16;$y++,                                    # loop through rows
    print str_pad(ltrim("$r\n"),28," ",0)               # 4. pad to 28 chars and print
    )
    for($r="",                                          # 1. result=empty
        $c="03231323"[$y&7];                            # 2. $c=bits in 1st code -1
        $c++<4;)                                        # 3. loop through columns
        $r.=strtr(sprintf("   %0${c}b ",$y>>4-$c),10,"-.")  # append morse code
            ."EISHVUF ARL WPJTNDBXKCYMGZQO  "[$i++];            # append letter

-7 byte dengan spasi terdepan : Ganti ltrim("$r\n")dengan "$r\n"dan 28dengan 31.

171 (= -10) byte dengan spasi tambahan :

for(;$y<16;$y++)for(print str_pad("
",[0,7,14,22][$c="03231323"[$y&7]]);$c++<4;)echo strtr(sprintf("%0${c}b %s   ",$y>>4-$c,"EISHVUF ARL WPJTNDBXKCYMGZQO"[$i++]),10,"-.");

gangguan coba online

for(;$y<16;$y++)                                    # loop through rows
    for(
        print str_pad("\n",[0,7,14,22][             # 2. print left padding
            $c="03231323"[$y&7]                     # 1. $c=bits in 1st code -1
        ]); 
        $c++<4;)                                        # 3. loop through columns
        echo                                                # print ...
            strtr(sprintf("%0${c}b %s   ",                  # 3. delimiting spaces
            $y>>4-$c,                                       # 1. morse code
            "EISHVUF ARL WPJTNDBXKCYMGZQO"[$i++]            # 2. letter
        ),10,"-.");
Titus
sumber
1
Tidak ada jeda baris yang benar saat ini?
Christoph
1
for(;$y<16;$y++,print str_pad(ltrim("$r\n"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf(" %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO "[$i++];harus menghemat 2 byte.
Christoph
1
Tampaknya Anda menjatuhkan terlalu banyak ruang: Pada baris terakhir ----tidak cocok dengan yang lain. "EISHVUF ARL WPJTNDBXKCYMGZQO "harus memiliki 2 spasi pada akhirnya.
Christoph
2

APL (Dyalog) , 92 byte

Kebutuhan ⎕IO←0yang standar pada banyak sistem.

0 3↓¯1⌽⍕{' ',(161↑⍨16÷≢⍵)⍀'.-'[⍉2⊥⍣¯1⍳≢⍵],' ',⍪⍵}¨'ET' 'IANM' 'SURWDKGO' 'HVF L PJBXCYZQ  '

Cobalah online!

{... }¨'... ' terapkan fungsi anonim berikut untuk masing-masing string:

⍪⍵ buat argumen menjadi kolom

' ', tambahkan sebuah spasi (pada setiap baris)

'.-'[... ], tambahkan string setelah diindeks dengan:

  ≢⍵ panjang argumen

   indeks itu (0, 1, 2, ..., panjang -1)

  2⊥⍣¯1 anti-base-2 (menggunakan bit sebanyak yang diperlukan)

   transpos (dari satu representasi di setiap kolom ke satu di setiap baris)

(... )⍀ rentangkan dengan (masukkan baris kosong seperti yang ditunjukkan oleh nol di):

  ≢⍵ panjang argumen

  16÷ bagi enam belas dengan itu

  1↑⍨ (lebih) ambil dari satu (buat daftar yang diikuti oleh 1- n nol)

  16⍴ daur ulang pola itu hingga memiliki enam belas elemen

' ', tambahkan sebuah spasi

 format (daftar tabel menjadi satu tabel, padding masing-masing dengan spasi di setiap sisi)

¯1⌽ putar satu langkah ke kanan (sehingga memindahkan ruang trailing ke depan)

0 3↓ turunkan nol baris dan tiga kolom (sehingga menghilangkan tiga spasi utama)

Adm
sumber
Hei, di mana 16÷⍨muncul di kode Anda‽
Zacharý
@ ZakaryT Pasti tidak. Terlihat dengan baik, tuan.
Adám
1

SOGL , 106 105 102 byte

¹θΞk“r²{r³³a:IA2─l4;- 0*;+Ζ0.ŗΖ1-ŗø4∫BƧ| ⁵±+⁷b<?⁄@*}+;j;@3*+}±kkk≥x}¹±č┐"7ŗ◄∑f^│N≥Χ±⅜g,ιƨΛ.⌡׀¹*ΛβΧκ‘čŗ

Jika ruang yang diawali diizinkan, 102 99 byte

¹θΞk“r²{r³³a:IA2─l4;- 0*;+Ζ0.ŗΖ1-ŗø4∫BƧ| ⁵±+⁷b<?⁄@*}+;j;@3*+}±≥x}¹±č┐"7ŗ◄∑f^│N≥Χ±⅜g,ιƨΛ.⌡׀¹*ΛβΧκ‘čŗ

141 byte, kompresi

Πa≤χ≥∫RωθΩ≡⅛QΨ═Λ9⁶Ul¹&╔²‘č"‼¼⁸Ƨ,9█ω½└╗«ωΤC¡ιΝ/RL⌡⁄1↑οπ∞b∑#⁵ø⁶‘č"⁵ ?∙«Σf⁾ƨ╤P1φ‛╤Β«╚Δ≡ΟNa1\÷╬5ŗķ§⁷D◄tFhžZ@š⁾¡M<╔↓u┌⁽7¡?v¦#DΘø⌡ ⁹x≡ō¦;⁵W-S¬⁴‘' n

hanya ingin melihat seberapa baik yang bisa dilakukan SOGL hanya dengan kompresi (baik itu punya lebih dari sekedar kompresi, tapi itu adalah string terkompresi 97%)

dzaima
sumber
1

JavaScript (205 byte)

for(A='EISHVUF ARL WPJTNDBXKCYMGZQO     ',q=0,i=15;30>i++;){for(x=i.toString(2).replace(/(.)/g,a=>1>a?'.':'-'),o='',j=4;j--;)o+=(i%2**j?A.slice(-6+j):x.slice(1,5-j)+' '+A.charAt(q++))+'   ';console.log(o)}

for(A='EISHVUF ARL WPJTNDBXKCYMGZQO     ',q=0,i=15;30>i++;){for(x=i.toString(2).replace(/(.)/g,a=>1>a?'.':'-'),o='',j=4;j--;)o+=(i%2**j?A.slice(-6+j):x.slice(1,5-j)+' '+A.charAt(q++))+'   ';console.log(o)}

Bergelombang
sumber
1

Ruby, 144 143 141 byte

k=0
16.times{|i|4.times{|j|$><<("%0#{j+1}b 9   "%(i>>3-j)).tr('109',(i+8&-i-8)>>3-j>0?'-.'+'  OQZGMYCKXBDNTJPW LRA FUVHSIE'[k-=1]:" ")}
puts}

Tidak disatukan

k=0                                                     #setup a counter for the letters
16.times{|i|                                            #16 rows    
  4.times{|j|                                           #4 columns
    $><<("%0#{j+1}b 9   "%(i>>3-j)).                    #send to stdout a binary number of j+1 digits, representing i>>3-j, followed by a 9, substituted as follows.
      tr('109',(i+8&-i-8)>>3-j>0?                       #(i&-i) clears all but the least significant 1's bit of i. the 8's ensure a positive result even if i=0.
      '-.'+'  OQZGMYCKXBDNTJPW LRA FUVHSIE'[k-=1]:      #if the expression righshifted appropriately is positive, substitute 1and0 for -and. Substitute 9 for a letter and update counter.
      " ")}                                             #else substiture 1,0 and 9 for spaces.
puts}                                                   #carriage return after each row.
Level River St
sumber
1

Pyth , 106 byte

DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNNjmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ  

Uji secara online!

Penjelasan

Dalam beberapa kata, apa yang saya lakukan di sini adalah untuk menghasilkan kolom tabel demi kolom dan kemudian memindahkan tabel sebelum mencetaknya. Kami memperhatikan bahwa dalam sebuah kolom, kode morse untuk huruf-huruf tersebut dapat direpresentasikan sebagai string biner (diganti .dengan 0dan -oleh 1) ketika menghitung dari nol hingga indeks huruf terakhir dalam kolom.

Algoritme bergantung pada fungsi dari mana saya memberikan contoh run di bawah ini (untuk kolom kedua):

1. Takes "IANM" as input
2. Generates the binary representations of zero up to len("IANM"): ["0", "1", "10", "11"]
3. Replace with dots and hyphens: [".", "-", "-.", "--"]
4. Pad with dots up to floor(log2(len("IANM"))): ["..", ".-", "-.", "--"]
5. Add the corresponding letters: [".. I", ".- A", "-. N", "-- M"]
6. After each element, insert a list of 16 / len("IANM") - 1 (= 3) strings containing only spaces of length floor(log2(len("IANM"))) + 2 (= 4):
    [".. I", ["    ", "    ", "    "], ".- A", ["    ", "    ", "    "], "-. N", ["    ", "    ", "    "], "-- M", ["    ", "    ", "    "]]
7. Flatten that list:
    [".. I", "    ", "    ", "    ", ".- A", "    ", "    ", "    ", "-. N", "    ", "    ", "    ", "-- M", "    ", "    ", "    "]
8. That's it, we have our second column!

Penjelasan kode

Saya memotong kode menjadi dua. Bagian pertama adalah fungsi yang dijelaskan di atas, bagian kedua adalah bagaimana saya menggunakan fungsi:

DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNN

DhNR                                                      # Define a function h taking N returning the rest of the code. N will be a string
      .e                                             N    # For each character b in N, let k be its index
                      .Bk                                 # Convert k to binary
                     :   \0\.                             # Replace zeros with dots (0 -> .)
                    :        \1\-                         # Replace ones with hyphens (1 -> -)
            .[\.sllN                                      # Pad to the left with dots up to floor(log2(len(N))) which is the num of bits required to represent len(N) in binary
          ++                     \ b                      # Append a space and b
         ]                                                # Make a list containing only this string. At this point we have something like [". E"] or [".. I"] or ...
        +                           *]*\ +2sllNt/16lN     # (1) Append as many strings of spaces as there are newlines separating each element vertically in the table
    .n                                                    # At this point the for each is ended. Flatten the resulting list and return it

(1) : Di tabel morse, di kolom pertama, ada tujuh baris setelah setiap baris yang berisi huruf ("E" dan "T"). Di kolom kedua, itu adalah tiga baris. Lalu satu (kolom ketiga), lalu nol (kolom terakhir). Di 16 / n - 1situlah njumlah huruf dalam kolom (yang ada Ndalam kode di atas). Apa yang dilakukan kode pada baris (1) :

*]*\ +2sllNt/16lN

       sllN          # Computes the num of bits required to represent len(N) in binary
     +2              # To that, add two. We now have the length of a element of the current column
  *\                 # Make a string of spaces of that length (note the trailing space)
           t/16lN    # Computes 16 / len(N) - 1
*]                   # Make a list of that length with the string of spaces (something like ["    ", "    ", ...])

Baiklah, sekarang kita memiliki fungsi membantu yang bagus hyang pada dasarnya menghasilkan kolom tabel dari urutan karakter. Mari kita gunakan (perhatikan dua spasi tambahan dalam kode di bawah ini):

jmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ  

           h"ET"                                        # Generate the first column
                h"IANM"                                 # Generate the second column
                       h"SURWDKGO"                      # Generate the third column
                                  h"HVF L PJBXCYZQ      # Generate the last column (note the two trailing spaces)
          [                                             # Make a list out of those columns
        .t                                              # Transpose, because we can print line by line, but not column by column
 mj*3\ d                                                # For each line, join the elements in that line on "   " (that is, concatenate the elements of the lines but insert "   " between each one)
j                                                       # Join all lines on newline

Kode masih dapat disingkat; mungkin saya akan kembali lagi nanti.

Jim
sumber
1

C, 199 195 byte

#define P putchar
m;p(i,v){printf("%*s",i&1|!v?v*(v+11)/2:3,"");for(m=1<<v;m;m/=2)P(45+!(i&m));P(32);P("  ETIANMSURWDKGOHVF L PJBXCYZQ  "[i]);v<3?p(2*i,v+1):P(10);++i&1&&p(i,v);}main(){p(2,0);}

Langsung di coliru (dengan #include untuk menghindari pesan peringatan.)

PEMBARUAN : Menyimpan empat karakter dengan memindahkan "deklarasi" di mluar fungsi, seperti yang disarankan oleh @zacharyT

Menggunakan apa yang tampaknya menjadi strategi standar: menyimpan huruf-huruf dalam pohon biner array-encoded, sehingga anak-anak elemen iadalah 2*idan 2*i+1. Pohon ini berakar pada 2 daripada 1 karena aritmatika bekerja sedikit lebih pendek, saya pikir. Yang lainnya adalah bermain golf.

Tidak Disatukan:

// Golfed version omits the include
#include <stdio.h>
// Golfed version uses the string rather than a variable.
char* tree = "  ETIANMSURWDKGOHVF L PJBXCYZQ  ";
/* i is the index into tree; v is the number of bits to print (-1) */
void p(int i, int v) {
  /* Golfed version omits all types, so the return type is int.
   * Nothing is returned, but on most architectures that still works although
   * it's UB.
   */
  printf("%*s", i&1 || !v ? v*(v+11)/2 : 3, "");
  /* v*(v+11)/2 is v*(v+1)/2 + 3*v, which is the number of spaces before the odd
   * element at level v. For even elements, we just print the three spaces which
   * separate adjacent elements. (If v is zero, we're at the margin so we
   * suppress the three spaces; with v == 0, the indent will be 0, too.
   *
   * Golfed version uses | instead of || since it makes no semantic difference.
   */

  /* Iterate over the useful bits at this level */
  for (int m=1<<v; m; m/=2) {
    /* Ascii '-' is 45 and '.' is 46, so we invert the tested bit to create the
     * correct ascii code.
     */
    putchar('-' + !(i&m));
  }
  /* Output the character */
  putchar(' ');
  putchar(tree[i]);
  /* Either recurse to finish the line or print a newline */
  if (v<3)
    p(2*i,v+1);
  else
    putchar('\n');
  /* For nodes which have a sibling, recurse to print the sibling */
  if (!(i&1))
    p(i+1, v);
}

int main(void) {
  p(2,0);
}
rici
sumber
Bisakah Anda memindahkannya int mke m;luar fungsi?
Zacharý
Apakah ini berfungsi repl.it/Iqma ?
Zacharý
@ ZacharyT: Saya kira ini akan bekerja tetapi satu karakter lagi (tanda kurung terbuka di #define) jadi sepertinya ada gunanya.
rici
Saya menghitung 194 byte dengan versi itu, apakah saya kehilangan sesuatu?
Zacharý
1

Bubblegum , 133 byte

000000: e0 01 be 00   7d 5d 00 17   08 05 23 e4   96 22 00 5d │ à.¾.}]....#ä.".]
000010: e5 e9 94 d3   78 24 16 ec   c1 c4 ad d8   6e 4d 41 e8 │ åé.Óx$.ìÁÄ.ØnMAè
000020: a3 a1 82 e6   f4 88 d9 85   6f ae 6b 93   aa 44 c8 e3 │ £¡.æô.Ù.o®k.ªDÈã
000030: 29 6f df 65   aa 4a f8 06   f5 63 1a 73   a7 e4 4d 19 │ )oßeªJø.õc.s§äM.
000040: 03 2c 87 59   7b df 27 41   4b b6 12 dd   7c e5 78 27 │ .,.Y{ß'AK¶.Ý|åx'
000050: 9c 9f 99 db   f6 8e 42 fd   43 68 48 46   37 da d7 21 │ ...Ûö.BýChHF7Ú×!
000060: a9 ca ea be   f4 57 e0 da   c1 16 97 ef   7a 0c e9 3c │ ©Êê¾ôWàÚÁ..ïz.é<
000070: 8e c2 b6 22   ca e4 e5 53   57 f0 f4 fb   a4 fb c0 a7 │ .¶"ÊäåSWðôû¤ûÀ§
000080: ec cd 6e 00   00                                      │ ìÍn..

Dikompresi sebagai aliran LZMA.

Uriel
sumber
0

C, 291 byte

Coba Online

char*i,*t=".aEc..aIc...aSc....aH/u...-aV/m..-aUc..-.aF/u..--/f.-aAc.-.aRc.-..aL/u.-.-/m.--aWc.--.aP/u.---aJ/-aTc-.aNc-..aDc-...aB/u-..-aX/m-.-aKc-.-.aC/u-.--aY/f--aMc--.aGc--..aZ/u--.-aQ/m---aOc---./u----";
s(n){while(n--)putchar(32);}f(){for(i=t;*i;i++)*i<97?putchar(*i-'/'?*i:10):s(*i-96);}

Bagaimana itu bekerja

Pertama saya diurai string di C, menghitung ruang yang kurang dari 26 jadi saya dikodekan dalam huruf kecil a, b, .. zdengan program kecil ini

for(char*i=t; *i; i++)
{
    if(*i == ' ') c++;
    else c = 0;

    if(i[1] != ' ' && c > 0) putchar('a'+c-1);
    else if(*i =='\n') putchar('/');
    else if(*i != ' ') putchar(*i);
}

Lalu saya menulis parser untuk pengkodean itu, di mana /ada baris baru, dan huruf kecil mewakili t[i] - 'a'spasi

int s(int n)
{
    while(n--) putchar(32);
}

f()
{
    for(char*i=t; *i; i++)
        if(*i < 'a')
            if(*i == '/') putchar('\n');
            else putchar(*i);
        else s(*i-'a'+1);
}
Khaled.K
sumber
263 byte
ceilingcat
0

Bash (dengan utilitas), 254 byte

tail -n+2 $0|uudecode|bzip2 -d;exit
begin 644 -
M0EIH.3%!6293631+'LX``&UV`%`P(`!``S____`@`(@:2!H#:@!ZFU'H@T](
MJ>H`'J``;4L>\%)R2H9TS-4WY[M(`"`@=((AJ")8HR^QFK?8RQO2B+W47&@`
M!"@$(!%Q,$'X:#+&>BI<RAC5.J53,S(%FFB!%A-*SM9TY&I8RFZJ9<D0H_B[
)DBG"A(&B6/9P
`
end
sigvaldm
sumber
0

Dyalog APL, 159 byte (tidak bersaing)

↑{X←⍵-1⋄Y←2*⍳4⋄R←Y+(Y÷16)×⍵-1⋄3↓∊{C←R[⍵]⋄'   ',(⍵⍴(1+0=1|C)⊃'    '({⍵⊃'.-'}¨1+(4⍴2)⊤X)),' ',((1+0=1|C)⊃' '((C-1|C)⊃' ETIANMSURWDKGOHVF L PJBXCYZQ  '))}¨⍳4}¨⍳16
Locoluis
sumber
Mengapa ini tidak bersaing?
Adám
Saya pikir Anda dapat menyimpan banyak dengan pengaturan ⎕IO←0(default pada banyak sistem) dan menggunakan (perjalanan) .
Adám
0

JavaScript (ES7), 242 240 238 byte

console.log([...'EISH000V00UF000 0ARL000 00WP000JTNDB000X00KC000Y0MGZ000Q00O 000 '].map((a,k)=>(n=>(a!='0'?(2**n+(k>>2)/2**(4-n)).toString(2).slice(-n).replace(/./g,c=>'.-'[c])+' '+a:'      '.slice(-n-2))+(n<4?'   ':'\n'))(k%4+1)).join``)

Cobalah online!

–2 byte terima kasih kepada Zachary .

eush77
sumber
Coba ubah a!='0'kea!=0
Cyoce
Bisakah Anda ganti .join('')dengan .join<insert backtick here><insert backtick here>? ( <insert backtick here>diganti dengan backticks yang sebenarnya)
Zacharý
Seperti Cyoce mengatakan, cobalah mengubah a!='0'ke a!=0, yang harus bekerja.
Zacharý
@ ZakaryT Tidak, tidak , tapi terima kasih lagi.
eush77
Maaf, lupa tentang ''kopernya.
Zacharý