เขียนสูตรรหัสมอร์สที่จัดรูปแบบ


24

ท้าทาย:

เขียนโปรแกรมที่สร้างผลลัพธ์ต่อไปนี้:

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

นี่คือตารางที่จัดรูปแบบของรหัสมอร์สของตัวอักษรจาก A ถึง Z แต่ละคอลัมน์จะคั่นด้วยช่องว่างสามช่อง

มีสล็อตที่หายไปสี่ช่องซึ่งถูกใช้โดยชุดอักขระสากล โปรแกรมของคุณจะต้องเขียนช่องว่าง

การส่งออกจะต้องประกอบด้วยช่องว่าง ASCII, จุด, ขีดกลาง, ตัวอักษรตัวพิมพ์ใหญ่และบรรทัดใหม่ (LF หรือ CRLF) เท่านั้น

โปรแกรมของคุณไม่รับอินพุต

ต่อไปนี้เป็นโปรแกรม Python ตัวอย่างที่สร้างเอาต์พุตที่ต้องการ:

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


1
แต่ละบรรทัดที่ 3 สามารถเติมช่องว่างได้หรือไม่
dzaima

1
ช่องโหว่มาตรฐานไม่อนุญาตให้ใช้วิธีการเข้ารหัสอย่างหนัก เราได้รับอนุญาตให้ใช้โค้ดหนักเท่าไรในตาราง
Brunner

@Brunner พิจารณาตารางอยู่ที่ประมาณ 450 ไบต์ผมสงสัยอย่างหนักเข้ารหัสวิธีการแก้ปัญหาที่ดีที่สุด
Cyoce

@Cyoce ไม่ใช่รุ่นที่สั้นที่สุดที่นี่ แต่ Joerg Huelsermann ได้รับมันถึง 208 ไบต์ในคำตอบ php ที่ยอดเยี่ยมของเขา
Brunner

1
เราได้รับอนุญาตให้มีช่องว่างต่อท้ายหรือไม่?
2560

คำตอบ:


5

เยลลี่ , 85 ไบต์

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

โปรแกรมเต็มรูปแบบการพิมพ์แผ่นโกง

ลองออนไลน์!

อย่างไร?

หมายเหตุ:ฉันคิดว่าอาจมีวิธีในการลดทอนลงด้วยการสร้างรายการที่จัดรูปแบบได้อย่างถูกต้องโดยใช้กริดอะตอมGแต่ฉันไม่สามารถหาวิธีที่จะทำได้

Ø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 bytes

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

ใช้การจัดรูปแบบการเปิดออกและA000918เวทมนต์


โดยวิธีf'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')การมีความยาวเท่ากับ''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Uriel

5

เรติน่า 125 ไบต์

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

ลองออนไลน์! ควรเป็น 121 ไบต์ แต่ฉันขี้เกียจเกินไปที่จะจัดการกับช่องว่างที่จุดเริ่มต้นและสิ้นสุด คำอธิบาย:

[blank line]
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__

ตัวอักษรที่มีรหัสขึ้นต้นด้วย.และ-ถูกโหลดไว้ล่วงหน้าตามลำดับ (เป็นไปได้ในทางทฤษฎีที่จะหลีกเลี่ยงการโหลดล่วงหน้า.-แต่จะช่วยประหยัดไบต์ด้วยวิธีนี้) _ใช้แทนช่องว่างเนื่องจากถือว่าเป็นตัวอักษรซึ่งทำให้ง่ายต่อการจับคู่ด้านล่าง

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

ที่นี่เราแบ่งแต่ละบรรทัดออกเป็นห้าชิ้น:

  • ตัวอักษรสำหรับคำนำหน้าถ้ามี
  • รหัสมอร์สปัจจุบัน
  • ตัวอักษรปัจจุบัน
  • ครึ่งแรกของตัวอักษรที่เหลือ (อักขระถัดไปคือ.)
  • ครึ่งหลังของตัวอักษรที่เหลือ (ตัวอักษรถัดไปของพวกเขาคือ-)

ชิ้นส่วนจะประกอบกันอีกสองบรรทัด:

  • ตัวอักษรสำหรับคำนำหน้ารหัสมอร์สปัจจุบันตัวอักษรปัจจุบันรหัสมอร์สที่มี.คำต่อท้ายครึ่งแรกของตัวอักษรที่เหลือ
  • ช่องว่างแทนที่สามชิ้นแรกรหัสมอร์สด้วย-คำต่อท้ายครึ่งหลังของตัวอักษรที่เหลือ

บรรทัดใหม่จะมีรูปแบบเดียวกับบรรทัดที่มีอยู่โดยมีคำนำหน้ามอร์สเพิ่มเติมและอีกครึ่งตัวอักษรที่เหลืออยู่สำหรับการประมวลผล สิ่งนี้จะถูกทำซ้ำจนกระทั่งแต่ละบรรทัดมีตัวอักษรเพียงตัวเดียว

_
  [single space]

_s มีการเปลี่ยนแปลงแล้วกลับเข้ามาในพื้นที่


3

JavaScript (ES6), 154 147 145 ไบต์

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>


โอ้แดง! ฉันพลาดอันนี้ไป ... คงไม่สนใจอย่างอื่น! ทำได้ดีมาก :-)
Bumpy

2

PHP, 208 ไบต์

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

ลองออนไลน์!

PHP, 229 ไบต์

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

ลองออนไลน์!


2

Perl 5, 158 156 ไบต์

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 ไบต์

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

ทำงานด้วย-nrหรือลองออนไลน์

ทำให้พังถล่ม

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 ไบต์ที่มีช่องว่างนำ : แทนที่ltrim("$r\n")ด้วย"$r\n"และมี2831

171 (= -10) ไบต์ที่มีช่องว่างต่อท้าย :

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

รายละเอียด ลองมันออนไลน์

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
ไม่มีการแบ่งสายจริงในเวลานี้?
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++];ควรบันทึก 2 ไบต์
Christoph

1
ดูเหมือนว่าคุณจะเว้นช่องว่างมากเกินไป: ในบรรทัดสุดท้าย----ไม่ตรงกับส่วนที่เหลือ "EISHVUF ARL WPJTNDBXKCYMGZQO "ควรมี 2 ช่องว่างในท้ายที่สุด
Christoph

2

APL (Dyalog) , 92 ไบต์

ความต้องการ⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

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

ลองออนไลน์!

{... }¨'... ' ใช้ฟังก์ชั่นที่ไม่ระบุชื่อต่อไปนี้ให้กับแต่ละสาย:

⍪⍵ ทำให้อาร์กิวเมนต์เป็นคอลัมน์

' ', เพิ่มช่องว่าง (ในแต่ละแถว)

'.-'[], เพิ่มสตริงหลังจากที่ถูกทำดัชนีด้วย:

  ≢⍵ ความยาวของการโต้แย้ง

   ดัชนีของสิ่งนั้น (0, 1, 2, …, ความยาว -1)

  2⊥⍣¯1 anti-base-2 (ใช้บิตได้มากเท่าที่ต้องการ)

   ไขว้ (จากการแสดงเพียงครั้งเดียวในแต่ละคอลัมน์เป็นหนึ่งในแต่ละแถว)

()⍀ ขยายโดย (แทรกแถวว่างตามที่ระบุโดยศูนย์ใน):

  ≢⍵ ความยาวของการโต้แย้ง

  16÷ หารสิบหกโดยที่

  1↑⍨ (เหนือ) รับจากหนึ่งรายการ (ทำรายการหนึ่งตามด้วยศูนย์1- n )

  16⍴ รีไซเคิลรูปแบบนั้นจนกว่าจะมีองค์ประกอบสิบหก

' ', เสริมพื้นที่

 รูปแบบ (รายการของตารางลงในตารางเดียว padding แต่ละที่มีช่องว่างในแต่ละด้าน)

¯1⌽ หมุนไปทางขวาหนึ่งก้าว (เช่นย้ายพื้นที่ต่อท้ายไปด้านหน้า)

0 3↓ ปล่อยศูนย์แถวและสามคอลัมน์ (ดังนั้นการลบช่องว่างนำหน้าทั้งสาม)


เฮ้รหัส16÷⍨ของคุณปรากฏที่ไหน‽
Zacharý

@ZacharyT ไม่แน่ใจ เห็นดีครับ
อดัม

1

SOGL , 106 105 102 ไบต์

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

หากอนุญาตให้เว้นวรรคล่วงหน้าได้102 99 ไบต์

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

141 ไบต์การบีบอัด

Π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

แค่อยากจะเห็นว่า SOGL ทำได้ดีแค่ไหนกับการบีบอัดข้อมูล (มันมีมากกว่าแค่การบีบอัด แต่มันเป็น 97% ของสตริงที่บีบอัด)


1

JavaScript (205 ไบต์)

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

ทับทิม, 144 143 141 ไบต์

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}

Ungolfed

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

Pyth , 106 ไบต์

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

ทดสอบออนไลน์!

คำอธิบาย

ในสองสามคำสิ่งที่ฉันทำที่นี่คือการสร้างคอลัมน์ตารางโดยคอลัมน์แล้วแปลงตารางก่อนที่จะพิมพ์ เราสังเกตเห็นว่าในคอลัมน์รหัสมอร์สสำหรับตัวอักษรสามารถแสดงเป็นสตริงไบนารี (แทนที่.ด้วย0และ-โดย1) เมื่อนับจากศูนย์ถึงดัชนีของตัวอักษรตัวสุดท้ายในคอลัมน์

อัลกอริทึมอาศัยฟังก์ชันที่ฉันให้ตัวอย่างทำงานด้านล่าง (สำหรับคอลัมน์ที่สอง):

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!

คำอธิบายรหัส

ฉันตัดโค้ดเป็นสองส่วน ส่วนแรกคือฟังก์ชั่นที่อธิบายไว้ข้างต้นส่วนที่สองคือวิธีที่ฉันใช้ฟังก์ชั่น:

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) : ในตารางมอร์สในคอลัมน์แรกมีเจ็ดบรรทัดหลังจากแต่ละบรรทัดมีตัวอักษร ("E" และ "T") ในคอลัมน์ที่สองเป็นสามบรรทัด จากนั้นหนึ่ง (คอลัมน์ที่สาม) จากนั้นศูนย์ (คอลัมน์สุดท้าย) นั่นคือ16 / n - 1ที่ที่nมีจำนวนตัวอักษรในคอลัมน์ (ซึ่งอยู่Nในรหัสด้านบน) รหัสอะไรที่บรรทัด (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 ["    ", "    ", ...])

เอาล่ะตอนนี้เรามีฟังก์ชั่นที่มีประโยชน์ที่ดีhซึ่งสร้างคอลัมน์ของตารางตามลำดับอักขระ มาใช้กัน (สังเกตช่องว่างต่อท้ายสองช่องในรหัสด้านล่าง):

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

รหัสยังสามารถตัดให้สั้นลงได้ บางทีฉันจะกลับมาในภายหลัง


1

C, 199 195 ไบต์

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

Live on coliru (พร้อม #include เพื่อหลีกเลี่ยงข้อความเตือน)

UPDATE : บันทึกสี่ตัวละครโดยการย้าย "ประกาศ" ของmนอกฟังก์ชั่นตามที่แนะนำโดย @zacharyT

ใช้สิ่งที่ดูเหมือนจะเป็นกลยุทธ์มาตรฐาน: ให้ตัวอักษรในต้นไม้ไบนารีอาร์เรย์เข้ารหัสเพื่อให้เด็กขององค์ประกอบiที่มีและ2*i 2*i+1ต้นไม้นี้มีรากที่ 2 แทนที่จะเป็น 1 เพราะเลขคณิตนั้นสั้นกว่านี้นิดหน่อย สิ่งที่เหลือก็คือการเล่นกอล์ฟ

Ungolfed:

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

คุณสามารถย้ายเครื่องint mให้อยู่m;นอกฟังก์ชั่นได้หรือไม่?
Zacharý

การทำงานนี้repl.it/Iqma ?
Zacharý

@ ZacharyT: ฉันคิดว่ามันจะใช้งานได้ แต่จะมีความยาวหนึ่งตัวอักษร (เครื่องหมายวงเล็บเปิดใน #define) ดังนั้นดูเหมือนว่าจะเป็นจุดเล็ก ๆ
rici

ฉันนับ 194 ไบต์กับเวอร์ชันนั้นฉันขาดอะไรไปหรือเปล่า?
Zacharý

1

Bubblegum , 133 ไบต์

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

บีบอัดเป็นสตรีม LZMA


0

C, 291 ไบต์

ลองออนไลน์

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

มันทำงานอย่างไร

ครั้งแรกที่ฉันแยกวิเคราะห์สตริงใน C นับช่องว่างที่มีน้อยกว่า 26 ดังนั้นฉันเข้ารหัสไว้ในตัวอักษรตัวพิมพ์เล็กa, b, .. zมีโปรแกรมเล็ก ๆ นี้

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

จากนั้นฉันก็เขียนโปรแกรมแยกวิเคราะห์สำหรับการเข้ารหัสนั้นซึ่ง/จะขึ้นบรรทัดใหม่และตัวอักษรตัวพิมพ์เล็กแทนt[i] - 'a'ช่องว่าง

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 (พร้อมยูทิลิตี้) 254 ไบต์

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 ไบต์ (ไม่ใช่การแข่งขัน)

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

ทำไมสิ่งนี้จึงไม่ใช่การแข่งขัน
2560

ฉันคิดว่าคุณสามารถบันทึกจำนวนมากโดยการตั้งค่า⎕IO←0(ค่าเริ่มต้นในระบบจำนวนมาก) และการใช้(การเดินทาง)
Adám

0

JavaScript (ES7), 242 240 238 ไบต์

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

ลองออนไลน์!

-2 ไบต์ขอบคุณที่รี


ลองเปลี่ยนa!='0'เป็นa!=0
Cyoce

คุณสามารถแทนที่.join('')ด้วย.join<insert backtick here><insert backtick here>? ( <insert backtick here>ถูกแทนที่ด้วย backticks จริง)
Zacharý

อย่างที่ Cyoce กล่าวลองเปลี่ยนa!='0'ไปa!=0ใช้วิธีนี้
Zacharý

@ ZacharyT ไม่ได้แต่ขอขอบคุณอีกครั้ง
eush77

ขออภัยลืมเกี่ยวกับ''กรณี
Zacharý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.