형식화 된 모스 코드 치트 시트 작성


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까지의 문자에 대한 모스 부호 형식의 표입니다. 각 열은 3 개의 공백으로 구분됩니다.

국제 문자 세트에 사용되는 4 개의 누락 된 슬롯이 있습니다. 프로그램은 거기에 공백을 써야합니다.

출력은 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

테이블을 고려하면 약 450 바이트입니다 @Brunner, 나는 최적의 솔루션 하드 코딩되어 의심
Cyoce

@Cyoce 여기에서 가장 짧은 버전은 아니지만 Joerg Huelsermann은 그의 훌륭한 PHP 답변에서 208 바이트로 떨어졌습니다.
Brunner

1
후행 공백이 허용됩니까?
Adám

답변:


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

파이썬 3.6 201 197 193 187 바이트

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__

코드가 각각 시작 .하고 -각각 사전로드 된 문자입니다 . (사전로드를 피하는 것이 이론적으로 가능 .-하지만이 방법으로 바이트를 절약합니다.) _s는 공백으로 사용되므로 문자로 간주되므로 아래에서 쉽게 일치시킬 수 있습니다.

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

여기서 우리는 각 줄을 다섯 조각으로 나눕니다.

  • 접두사 문자 (있는 경우)
  • 현재 모스 부호
  • 현재 편지
  • 나머지 문자의 첫 번째 절반 (다음 문자는 .)
  • 나머지 글자의 후반부 (다음 문자는 -)

그런 다음 조각을 두 줄로 다시 조립합니다.

  • 접두사 문자, 현재 모스 부호, 현재 문자, .접미사가 있는 모스 부호 , 나머지 문자의 첫 절반
  • 처음 세 조각, 모스 부호를 -접미사로 대체하는 공백 , 나머지 문자의 후반

새 줄은 기존 줄과 동일한 형식을 따르며 추가로 Morse 접두사와 처리 할 문자 수의 절반이 남아 있습니다. 그런 다음 각 줄에 문자가 하나만있을 때까지이 과정이 반복됩니다.

_
  [single space]

_의 다음 구역으로 다시 변경된다.


3

자바 스크립트 (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, 18383181 바이트

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"28함께 31.

후행 공백이있는 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 (필요한 비트 수만큼 사용)

   전치 (각 열의 한 표현에서 각 행의 한 표현으로)

(… 다음으로 )⍀ 확장합니다 (0으로 표시된대로 빈 행 삽입).

  ≢⍵ 인수의 길이

  16÷ 열 여섯을 나누다

  1↑⍨ (over) one에서 가져옴 (1에서 n을 0으로 한리스트 )

  16⍴ 16 개의 요소가있을 때까지 해당 패턴을 재활용

' ', 공백을 두다

 형식 (테이블 목록을 단일 테이블로 묶고 각 측면에 공백으로 채워짐)

¯1⌽ 한 단계 오른쪽으로 회전 (후행 공간을 앞쪽으로 이동)

0 3↓ 0 행과 3 열 삭제 (따라서 3 개의 선행 공백 제거)


이봐, 코드에서 어디에 16÷⍨나타남‽
Zacharý

@ZacharyT 확실하지 않습니다. 멋지게 발견되었습니다
Adám

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

자바 스크립트 (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

루비, 144143141 바이트

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}

언 골프

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) 때 열에서 마지막 문자의 인덱스 0에서 계산.

알고리즘은 아래에서 두 번째 열에 대해 예제 실행을 제공하는 함수에 의존합니다.

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!

코드 설명

코드를 2 개로 자릅니다. 첫 번째 부분은 위에서 설명한 기능이고 두 번째 부분은 내가 기능을 사용하는 방법입니다.

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")가 포함 된 7 개의 줄이 있습니다. 두 번째 열에서는 세 줄입니다. 그런 다음 1 (세 번째 열), 0 (마지막 열)입니다. 즉 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);}

콜리 루에서 라이브 (경고 메시지를 피하기 위해 #include 포함)

업데이트 : m@zacharyT에서 제안한 것처럼 함수 외부의 "선언"을 이동하여 4 문자를 저장 했습니다.

표준 전략 인 문자를 사용합니다. 문자를 배열로 인코딩 된 이진 트리로 유지하여 element의 하위 요소 i2*i2*i+1입니다. 이 나무는 산술이 조금 더 짧았 기 때문에 1이 아니라 2에 뿌리를두고 있다고 생각합니다. 나머지는 모두 골프입니다.

언 골프 드 :

// 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 mm;함수의 외부를?
Zacharý

이 작업이 repl.it/Iqma 입니까?
Zacharý

@ ZacharyT : 작동 할 것이라고 생각하지만 한 문자 더 길면 (#define의 열린 괄호) 약간의 포인트가있는 것 같습니다.
rici

해당 버전으로 194 바이트를 계산했는데 뭔가 빠졌습니까?
Zacharý

1

풍선 껌 , 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);}

작동 원리

우선 적은 I 작은 대문자 그들을 인코딩되도록 26보다 공간 계수, C의 문자열을 파싱 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

배쉬 (유틸리티 포함), 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

이것이 경쟁이 아닌 이유는 무엇입니까?
Adám

나는 ⎕IO←0많은 시스템에서 기본값을 설정 하고 (commute)를 사용하여 많이 절약 할 수 있다고 생각합니다 .
Adám

0

자바 스크립트 (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``)

온라인으로 사용해보십시오!

Zachary 덕분에 –2 바이트 .


변경 시도 a!='0'a!=0
Cyoce

당신은 대체 할 수 .join('')와 함께 .join<insert backtick here><insert backtick here>? ( <insert backtick here>실제 백틱으로 대체 됨)
Zacharý

Cyoce 말했듯이, 변화 시도 a!='0'a!=0, 그 작동합니다.
Zacharý

@ZacharyT 아니요 그렇지 않습니다 . 다시 한 번 감사드립니다.
eush77 2016 년

죄송합니다 ''. 사건을 잊었습니다 .
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.