Viết một cái áo mã Morse được định dạng


24

Thử thách:

Viết chương trình tạo đầu ra sau:

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

Đây là bảng được định dạng của mã Morse của các chữ cái từ A đến Z. Mỗi cột được phân tách bằng ba khoảng trắng.

Có bốn vị trí bị thiếu, được sử dụng bởi các bộ ký tự quốc tế. Chương trình của bạn phải viết một không gian ở đó.

Đầu ra phải bao gồm các khoảng trắng ASCII, dấu chấm, dấu gạch ngang, chữ in hoa và dòng mới (chỉ là LF hoặc CRLF).

Chương trình của bạn chấp nhận không có đầu vào.

Sau đây là chương trình Python mẫu tạo ra đầu ra mong muốn:

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


1
mỗi dòng 3 không gian chuẩn bị?
dzaima

1
Lỗ hổng tiêu chuẩn không cho phép giải pháp mã hóa cứng. Bao nhiêu bảng chúng ta được phép mã cứng?
Brunner

@Brunner xem xét bảng là khoảng 450 byte, tôi nghi ngờ mã hóa cứng là giải pháp tối ưu
Cyoce

@Cyoce Chắc chắn không phải là phiên bản ngắn nhất ở đây, nhưng Joerg Huelsermann đã đưa nó xuống còn 208 byte trong các câu trả lời php xuất sắc của mình.
Brunner

1
Chúng ta có được phép có không gian dấu không?
Adám

Câu trả lời:


5

Thạch , 85 byte

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

Một chương trình đầy đủ in tờ cheat.

Hãy thử trực tuyến!

Làm sao?

Lưu ý: Tôi nghĩ có thể có một cách để cắt giảm điều này bằng cách tạo một danh sách định dạng chính xác bằng cách sử dụng nguyên tử lưới G, nhưng tôi không thể tìm ra cách làm.

Ø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

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

Sử dụng một số định dạng, giải nén và ma thuật A000918 .


Nhân tiện, f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')có cùng chiều dài với''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Uriel

5

Võng mạc , 125 byte

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

Hãy thử trực tuyến! Nên là 121 byte nhưng tôi quá lười để xử lý khoảng trắng ở đầu và cuối. Giải trình:

[blank line]
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__

Các chữ cái có mã bắt đầu bằng .-tương ứng được tải sẵn. (Về mặt lý thuyết có thể tránh tải trước .-nhưng nó tiết kiệm byte theo cách này.) _S được sử dụng thay cho khoảng trắng vì chúng được coi là các chữ cái giúp chúng dễ khớp hơn bên dưới.

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

Ở đây chúng tôi chia mỗi dòng thành năm mảnh:

  • Các chữ cái cho tiền tố, nếu có
  • Mã Morse hiện tại
  • Bức thư hiện tại
  • Nửa đầu của các chữ cái còn lại (ký tự tiếp theo của chúng là .)
  • Nửa sau của các chữ cái còn lại (ký tự tiếp theo của chúng là - )

Các mảnh sau đó được ghép lại thành hai dòng:

  • Các chữ cái cho tiền tố, mã Morse hiện tại, chữ cái hiện tại, mã Morse với một . hậu tố, nửa đầu của các chữ cái còn lại
  • Dấu cách thay thế ba phần đầu tiên, mã Morse bằng -hậu tố, nửa sau của các chữ cái còn lại

Các dòng mới theo cùng định dạng với dòng hiện có, chỉ với một tiền tố Morse bổ sung và một nửa số chữ cái còn lại để xử lý. Điều này sau đó được lặp lại cho đến khi mỗi dòng chỉ có một chữ cái.

_
  [single space]

Các _s sau đó được thay đổi trở lại vào không gian.


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>


Ôi trời ơi! Tôi đã bỏ lỡ điều này ... sẽ không làm phiền khác! Làm tốt lắm :-)
Bumpy

2

PHP, 208 byte

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

Hãy thử trực tuyến!

PHP, 229 byte

<?=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",". ","- ","..","--"]);

Hãy thử trực tuyến!


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

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++];

Chạy với -nrhoặc thử trực tuyến .

phá vỡ

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 với khoảng trắng hàng đầu : Thay thế ltrim("$r\n")bằng "$r\n"28bằng 31.

171 (= -10) byte có dấu cách :

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,"-.");

sự cố thử trực tuyến

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,"-.");

1
Không có dòng thực sự phá vỡ thời gian này?
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++];nên tiết kiệm 2 byte.
Christoph

1
Có vẻ như bạn đã bỏ một khoảng trống quá nhiều: Trong dòng cuối cùng ----không khớp với phần còn lại. "EISHVUF ARL WPJTNDBXKCYMGZQO "nên có 2 khoảng trống cuối cùng.
Christoph

2

APL (Dyalog) , 92 byte

Nhu cầu ⎕IO←0được mặc định trên nhiều hệ thống.

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

Hãy thử trực tuyến!

{... }¨'... ' áp dụng các chức năng ẩn danh sau đây để mỗi người trong số các dây:

⍪⍵ biến đối số thành một cột

' ', đặt trước một khoảng trắng (trên mỗi hàng)

'.-'[... ], thêm vào trước chuỗi sau khi nó đã được lập chỉ mục với:

  ≢⍵ độ dài của đối số

   các chỉ số của điều đó (0, 1, 2, Hoài, dài -1)

  2⊥⍣¯1 anti-base-2 (sử dụng càng nhiều bit càng cần thiết)

   hoán vị (từ một đại diện trong mỗi cột sang một trong mỗi hàng)

(... )⍀ mở rộng bằng cách (chèn hàng trống như được chỉ ra bởi số không in):

  ≢⍵ độ dài của đối số

  16÷ chia mười sáu cho đó

  1↑⍨ (trên) lấy từ một (tạo ra một danh sách một tiếp theo 1- n số không)

  16⍴ tái chế mẫu đó cho đến khi nó có mười sáu yếu tố

' ', chuẩn bị một không gian

 định dạng (danh sách các bảng thành một bảng duy nhất, đệm mỗi bảng với một khoảng trắng ở mỗi bên)

¯1⌽ xoay một bước bên phải (do đó di chuyển không gian dấu ra phía trước)

0 3↓ thả các hàng 0 và ba cột (do đó loại bỏ ba khoảng trắng hàng đầu)


Này, nơi nào 16÷⍨xuất hiện trong mã của bạn‽
Zacharý

@ZacharyT Nó chắc chắn không. Phát hiện độc đáo, thưa ông.
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,ιƨΛ.⌡׀¹*ΛβΧκ‘čŗ

Nếu không gian cho phép được cho phép, 102 99 byte

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

141 byte, nén

Π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

chỉ muốn xem SOGL có thể làm tốt như thế nào chỉ với việc nén (cũng có nhiều thứ hơn là chỉ nén, nhưng đó là chuỗi nén 97%)


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


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}

Bị đánh cắp

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.

1

Bình thường , 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  

Kiểm tra nó trực tuyến!

Giải trình

Trong một vài từ, những gì tôi làm ở đây là tạo cột bảng theo cột và sau đó hoán chuyển bảng trước khi in. Chúng tôi nhận thấy rằng trong một cột, mã morse cho các chữ cái có thể được biểu diễn dưới dạng chuỗi nhị phân (thay thế .bởi 0-bởi 1) khi đếm từ 0 đến chỉ mục của chữ cái cuối cùng trong cột.

Thuật toán dựa trên một hàm mà tôi đưa ra một ví dụ chạy bên dưới (cho cột thứ hai):

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!

Giải thích mã

Tôi cắt mã làm hai. Phần đầu tiên là chức năng được mô tả ở trên, phần thứ hai là cách tôi sử dụng chức năng:

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) : Trong bảng morse, trong cột đầu tiên, có bảy dòng sau mỗi dòng chứa một chữ cái ("E" và "T"). Trong cột thứ hai, nó là ba dòng. Sau đó, một (cột thứ ba), sau đó bằng không (cột cuối cùng). Đó là 16 / n - 1nơi ncó số lượng chữ cái trong cột (nằm Ntrong đoạn mã trên). Đó là những gì mã ở dòng (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 ["    ", "    ", ...])

Được rồi, bây giờ chúng ta có một hàm hữu ích tuyệt vời h, về cơ bản tạo ra một cột của bảng trong một chuỗi các ký tự. Hãy sử dụng nó (lưu ý hai dấu cách trong mã bên dưới):

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

Mã vẫn có thể được rút ngắn; có lẽ tôi sẽ quay lại sau.


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

Sống trên coliru (với để tránh thông báo cảnh báo.)

CẬP NHẬT : Đã lưu bốn ký tự bằng cách di chuyển "khai báo" mbên ngoài hàm, như được đề xuất bởi @zacharyT

Sử dụng những gì dường như là một chiến lược tiêu chuẩn: giữ các chữ cái trong cây nhị phân được mã hóa mảng, vì vậy các phần tử con i2*i2*i+1. Cây này được bắt nguồn từ 2 chứ không phải 1 vì số học làm việc ngắn hơn một chút, tôi nghĩ vậy. Tất cả phần còn lại là chơi gôn.

Ung dung:

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

Bạn có thể di chuyển int mđến m;bên ngoài chức năng?
Zacharý

Công việc này có thay thế không.it / Iqma ?
Zacharý

@ZacharyT: Tôi cho rằng nó sẽ hoạt động nhưng nó dài hơn một ký tự (dấu ngoặc đơn mở trong #define) nên có vẻ như rất ít điểm.
rici

Tôi đã đếm 194 byte với phiên bản đó, tôi có thiếu thứ gì không?
Zacharý

1

Bong bóng , 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..

Được nén dưới dạng luồng LZMA.


0

C, 291 byte

Thử trực tuyến

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

Làm thế nào nó hoạt động

Đầu tiên tôi phân tích chuỗi trong C, đếm các khoảng trắng nhỏ hơn 26 vì vậy tôi đã mã hóa chúng bằng các chữ cái nhỏ a, b, .. zvới chương trình nhỏ này

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

Sau đó, tôi đã viết một trình phân tích cú pháp cho mã hóa đó, ở đâu /là một dòng mới và một chữ cái nhỏ thể hiện các t[i] - 'a'khoảng trắng

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


0

Bash (có tiện ích), 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

0

Dyalog APL, 159 byte (không cạnh tranh)

↑{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

Tại sao điều này không cạnh tranh?
Adám

Tôi nghĩ bạn có thể tiết kiệm rất nhiều bằng cách cài đặt ⎕IO←0(mặc định trên nhiều hệ thống) và sử dụng (đi lại) .
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``)

Hãy thử trực tuyến!

Mật mã byte2 nhờ Zachary .


Hãy thử đổi a!='0'thànha!=0
Cyoce

Bạn có thể thay thế .join('') bằng .join<insert backtick here><insert backtick here>? ( <insert backtick here>được thay thế bằng backticks thực tế)
Zacharý

Như Cyoce nói, hãy thử thay đổi a!='0'để a!=0, nên hoạt động.
Zacharý

@ZacharyT Không, không , , nhưng cảm ơn lần nữa.
eush77

Xin lỗi, quên ''trường hợp.
Zacharý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.