Biçimlendirilmiş bir Mors kodu kopya kağıdı yazın


24

Meydan okuma:

Aşağıdaki çıktıyı üreten bir program yazın:

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

Bu, A'dan Z'ye harflerin Mors kodlarının biçimlendirilmiş bir tablodur. Her sütun üç boşlukla ayrılmıştır.

Uluslararası karakter setleri tarafından kullanılan dört tane eksik yuva vardır. Programın orada bir boşluk bırakmalı.

Çıktı yalnızca ASCII boşluklarından, noktalardan, kısa çizgilerden, büyük harflerden ve yeni satırlardan (LF veya CRLF) oluşmalıdır.

Programınız giriş kabul etmiyor.

İstenilen çıktıyı üreten örnek bir Python programı:

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

Bu , yani bayt cinsinden en kısa cevap kazanır.


1
Her satır 3 boşluk hazırlayabilir mi?
dzaima

1
Standart boşluklar çözelti sert kodlamaya izin vermez. Masanın ne kadarına kod yazmamıza izin verilir?
Brunner

@Brunner tablonun yaklaşık 450 byte olduğunu düşünüyor, sert kodlamanın en uygun çözüm olduğundan şüpheliyim
Cyoce

@Cyoce Kesinlikle buradaki en kısa sürüm değil, fakat Joerg Huelsermann mükemmel php cevaplarında 208 bayta indi.
Brunner

1
Sondaki boşluklara izin veriliyor mu?
Adám

Yanıtlar:


5

Jöle , 85 bayt

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

Hile sayfası yazdırmak tam bir program.

Çevrimiçi deneyin!

Nasıl?

Not: Izgara atomunu kullanarak doğru biçimlendirilmiş bir liste oluşturarak bunu düzeltmenin bir yolu olabileceğini düşünüyorum G, ancak bunun nasıl olduğunu tam olarak çözemiyorum.

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

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

Bazı biçimlendirme, açma ve A000918 sihri kullanır.


Bu arada, f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')aynı uzunluk''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Uriel

5

Retina , 125 bayt

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

Çevrimiçi deneyin! 121 byte olmalı ama başlangıçtaki ve sondaki boşluklarla ilgilenemeyecek kadar tembeldim. Açıklama:

[blank line]
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__

Sırasıyla başlayan .ve -sırasıyla gelen harfler önceden yüklenir. (Önyüklemekten kaçınmak teorik olarak mümkündür .-ancak baytları bu şekilde kurtarır.) _Harfleri, altlarında eşleşmelerini kolaylaştıran harfler olarak kabul edildiğinden, boşluk yerine kullanılır.

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

Burada her satırı beş parçaya böldük:

  • Varsa önek harfleri
  • Geçerli Mors kodu
  • Mevcut mektup
  • Kalan harflerin ilk yarısı (sonraki karakterleri .)
  • Kalan harflerin ikinci yarısı (sonraki karakter -)

Parçalar daha sonra iki satıra monte edilir:

  • Önekler için harfler, geçerli Mors kodu, geçerli harf, .son ekli Mors kodu , kalan harflerin ilk yarısı
  • İlk üç parçanın yerini alan boşluklar, Mors kodu -ekli, kalan harflerin ikinci yarısı

Yeni satırlar mevcut satır ile aynı formatta, sadece ekstra bir Mors ön eki ve işlemden kalan harflerin yarısı ile devam ediyor. Bu daha sonra her satırda yalnızca bir harf bulunana kadar tekrar edilir.

_
  [single space]

_S sonra boşluklar içine geri değiştirilmektedir.


3

JavaScript (ES6), 154 147 145 bayt

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>


Lanet olsun! Bunu özledim ... aksi halde rahatsız olmazdı! Aferin :-)
Bumpy

2

PHP, 208 Bayt

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

Çevrimiçi deneyin!

PHP, 229 Bayt

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

Çevrimiçi deneyin!


2

Perl 5, 158 156 bayt

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 bayt

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

Çevrimiçi olarak çalıştırın -nrveya deneyin .

Yıkmak

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

Önde gelen boşluklarla -7 bayt : ltrim("$r\n")ile "$r\n"ve 28ile değiştirin 31.

Sonunda boşluk olan 171 (= -10) bayt :

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

arıza çevrimiçi deneyin

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
Bu sefer gerçek bir satır sonu yok mu?
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 bayt kaydetmelisiniz.
Christoph

1
Görünüşe göre çok fazla yer bıraktın: Son satırda ----geri kalanıyla uyuşmuyor. "EISHVUF ARL WPJTNDBXKCYMGZQO "sonunda 2 boşluk olmalıdır.
Christoph

2

APL (Dyalog) , 92 bayt

⎕IO←0Birçok sistemde varsayılan olan ihtiyaçlar .

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

Çevrimiçi deneyin!

{... }¨'... ' dizeleri her birine şu isimsiz işlev geçerlidir:

⍪⍵ argümanı bir sütuna dönüştür

' ', boşluk bırak (her satırda)

'.-'[], Dizini indeksledikten sonra hazırlayın:

  ≢⍵ argümanın uzunluğu

   bunun endeksleri (0, 1, 2,…, uzunluk -1)

  2⊥⍣¯1 anti-base-2 (gerektiği kadar çok bit kullanır)

   transpozisyon (her sütunda bir temsilden her satırda birine)

()⍀ Tarafından genişlet (boşlukların içinde gösterildiği şekilde boş satırlar ekle):

  ≢⍵ argümanın uzunluğu

  16÷ on altıya bölün

  1↑⍨ (üstü) bir taneden alma (bir tanenin ardından 1- n sıfıra ait listenin listesini yapar )

  16⍴ on altı öğeye sahip olana kadar bu kalıbı geri dönüştür

' ', boşluk bırakmak

 format (tabloların listesini tek bir tabloya yerleştirin, her birini her bir tarafta boşluk bırakarak doldurun)

¯1⌽ bir adım sağa döndürün (böylece arkadaki boşluğu öne doğru hareket ettirin)

0 3↓ sıfır satır ve üç sütun bırak (böylece üç boş alanı kaldırarak)


Hey, 16÷⍨kodunuzda nerede görünüyor?
Zacharý

@ ZacharyT Kesinlikle öyle değil. Güzel lekeli efendim.
Adám

1

SOGL , 106 105 102 bayt

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

Hazırlık alanlarına izin verilirse, 102 99 bayt

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

141 bayt, sıkıştırma

Π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

sadece SOGL'nin sıkıştırmayla ne kadar iyi yapabileceğini görmek istedim (tamamıyla sıkıştırmadan daha fazlası var, ancak% 97 sıkıştırılmış dizeleri)


1

JavaScript (205 bayt)

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 bayt

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 bayt

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

Çevrimiçi test edin!

açıklama

Birkaç kelimeyle, burada yaptığım şey tablo sütununu sütun olarak oluşturmak ve sonra tabloyu yazdırmadan önce çevirmektir. Biz ikili dizeleri (replace gibi bir sütunda, harfler için mors kodları temsil edilebilir olduğunu fark .tarafından 0ve -tarafından1 ) ne zaman sütununda son harfi endeksine sıfırdan sayma.

Algoritma, aşağıdaki örnek bir çalışmayı verdiğim bir işleve dayanır (ikinci sütun için):

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!

Kod açıklaması

Kodu ikiye böldüm. İlk bölüm yukarıda açıklanan işlev, ikinci bölüm işlevi nasıl kullandığımdır:

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) : Mors tablosunda, ilk sütunda, her satırdan sonra bir harf ("E" ve "T") içeren yedi satır vardır. İkinci sütunda, üç satırdır. Sonra bir (üçüncü sütun), sonra sıfır (son sütun). Yani 16 / n - 1burada n(sütunun harf sayısı olan Nkod yukarıda). Satırdaki kod ne (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 ["    ", "    ", ...])

Tamam, şimdi htemelde bir karakter dizisinden bir tablonun sütununu üreten hoş bir fonksiyonumuz var. Hadi kullanalım (aşağıdaki koddaki iki boşluğa dikkat edin):

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

Kod hala kısaltılabilir; belki daha sonra tekrar gelirim.


1

C 199 195 bayt

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

Coliru'da canlı (uyarı iletisini önlemek için #include ile).

GÜNCELLEME ;m @zacharyT tarafından önerildiği gibi, fonksiyonun dışına ait

Standart bir strateji gibi görünen şeyleri kullanır: Harfleri dizi kodlu bir ikili ağaçta tutun, böylece öğenin çocukları i vardır 2*ive2*i+1 . Sanırım aritmetik biraz daha kısa olduğu için bu ağaç 1 yerine 2'ye dayanıyor. Her şey golf oynuyor.

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

Taşımak Could int molmak m;işlevinin dışında?
Zacharı

Bu işe yarıyor mu?
Zacharı

@ ZacharyT: İşe yaradığını sanıyorum ama bir karakterden daha uzun (#define'deki açık parantez) bu yüzden çok az nokta var.
rici

Bu sürümle 194 bayt saydım, bir şey eksik mi?
Zacharý

1

Bubblegum , 133 bayt

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

Bir LZMA akışı olarak sıkıştırılmıştır.


0

C, 291 bayt

Çevrimiçi dene

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

Nasıl çalışır

İlk önce dizgiyi C de ayrıştırdım, 26'dan küçük boşlukları sayarak bu küçük programa, b, .. z ile küçük harflerle kodladım.

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

Sonra kodlama için bir çözümleyici yazdım, /yeni bir satır nerede ve küçük bir harf t[i] - 'a'boşlukları temsil ediyor

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 (yardımcı programlarla birlikte), 254 bayt

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 bayt (yarışmacı olmayan)

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

Bu neden rekabet etmiyor?
Adám

Bence ⎕IO←0(birçok sistemde varsayılan) ve (commute) kullanarak çok tasarruf edebileceğinizi düşünüyorum .
Adám

0

JavaScript (ES7), 242 240 238 bayt

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

Çevrimiçi deneyin!

- Zachary sayesinde 2 byte .


Değiştirmeyi deneyin a!='0'içina!=0
Cyoce

Eğer değiştirebilir miyim .join('')ile .join<insert backtick here><insert backtick here>? ( <insert backtick here>gerçek backticks ile değiştiriliyor)
Zacharý

Cyoce dediği gibi, değiştirmeyi deneyin a!='0'için a!=0, o çalışmalıdır.
Zacharı

@ ZacharyT Hayır değil ama tekrar teşekkürler.
eush77

Üzgünüm, ''davayı unuttum .
Zacharı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.