Escribir una hoja de referencia con código Morse formateado

24

Reto:

Escriba un programa que produzca el siguiente resultado:

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

Esta es una tabla formateada de los códigos Morse de las letras de la A a la Z. Cada columna está separada por tres espacios.

Hay cuatro espacios faltantes, que son utilizados por los juegos de caracteres internacionales. Su programa debe escribir un espacio allí.

La salida debe consistir en espacios ASCII, puntos, guiones, letras mayúsculas y nuevas líneas (ya sea LF o CRLF) solamente.

Su programa no acepta entradas.

El siguiente es un programa de Python de muestra que produce el resultado deseado:

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

Este es el , por lo que gana la respuesta más corta en bytes.

Locoluis
fuente
1
¿Puede cada línea 3 espacios pendientes?
dzaima
1
Las lagunas estándar impiden la codificación dura de la solución. ¿Qué parte de la tabla se nos permite codificar?
Brunner
@Brunner teniendo en cuenta la tabla es de alrededor de 450 bytes, dudo codificación duro es la solución óptima
Cyoce
@Cyoce Definitivamente no es la versión más corta aquí, pero Joerg Huelsermann lo redujo a 208 bytes en sus brillantes respuestas php.
Brunner
1
¿Se nos permite tener espacios finales?
Adám

Respuestas:

5

Jalea , 85 bytes

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

Un programa completo que imprime la hoja de trucos.

Pruébalo en línea!

¿Cómo?

Nota: Creo que puede haber una forma de recortar esto formando una lista que se formatee correctamente mediante el uso del átomo de cuadrícula G, pero no puedo entender cómo.

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

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

Utiliza algo de formato, desembalaje y magia A000918 .

Uriel
fuente
Por cierto, f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')tiene la misma duración que''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Uriel
5

Retina , 125 bytes

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

Pruébalo en línea! Debería tener 121 bytes, pero era demasiado vago para lidiar con el espacio en blanco al principio y al final. Explicación:

[blank line]
. EISHVUF_ARL_WPJ¶- TNDBXKCYMGZQO__

Las letras cuyo código comienza con .y -respectivamente están precargadas. (Teóricamente es posible evitar precargar el .-pero ahorra bytes de esta manera). Los _s se usan en lugar de espacios, ya que se consideran letras, lo que hace que sean más fáciles de combinar a continuación.

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

Aquí dividimos cada línea en cinco partes:

  • Las letras para prefijos, si hay
  • El código Morse actual
  • La carta actual
  • La primera mitad de las letras restantes (su siguiente carácter es .)
  • La segunda mitad de las letras restantes (su siguiente carácter es -)

Las piezas se vuelven a montar en dos líneas:

  • Las letras de los prefijos, el código Morse actual, la letra actual, el código Morse con .sufijo, la primera mitad de las letras restantes
  • Espacios que reemplazan las primeras tres piezas, el código Morse con un -sufijo, la segunda mitad de las letras restantes

Las nuevas líneas siguen el mismo formato que la línea existente, solo con un prefijo Morse adicional y la mitad de las letras restantes para procesar. Esto se repite hasta que cada línea tenga solo una letra.

_
  [single space]

Los _s se vuelven a convertir en espacios.

Neil
fuente
3

JavaScript (ES6), 154 147 145 bytes

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

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

Arnauld
fuente
Oh dang! Me perdí este ... ¡de lo contrario no me habría molestado! Bien hecho :-)
Bumpy
2

PHP, 208 bytes

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

Pruébalo en línea!

PHP, 229 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
2

Perl 5, 158156 bytes

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

PHP, 184 183 181 bytes

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

Ejecutar -nro probarlo en línea .

Descompostura

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 bytes con espacios iniciales: reemplazar ltrim("$r\n")con "$r\n"y 28con 31.

171 (= -10) bytes con espacios finales :

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

desglose probarlo en línea

for(;$y<16;$y++)                                    # loop through rows
    for(
        print str_pad("\n",[0,7,14,22][             # 2. print left padding
            $c="03231323"[$y&7]                     # 1. $c=bits in 1st code -1
        ]); 
        $c++<4;)                                        # 3. loop through columns
        echo                                                # print ...
            strtr(sprintf("%0${c}b %s   ",                  # 3. delimiting spaces
            $y>>4-$c,                                       # 1. morse code
            "EISHVUF ARL WPJTNDBXKCYMGZQO"[$i++]            # 2. letter
        ),10,"-.");
Titus
fuente
1
¿No hay un verdadero salto de línea esta vez?
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++];debería guardar 2 bytes.
Christoph
1
Parece que dejaste demasiado espacio: en la última línea ----no coincide con el resto. "EISHVUF ARL WPJTNDBXKCYMGZQO "debe tener 2 espacios al final.
Christoph
2

APL (Dyalog) , 92 bytes

Necesidades, lo ⎕IO←0cual es predeterminado en muchos sistemas.

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

Pruébalo en línea!

{... }¨'... ' aplique la siguiente función anónima a cada una de las cadenas:

⍪⍵ hacer el argumento en una columna

' ', anteponer un espacio (en cada fila)

'.-'[... ], anteponer la cadena después de que se haya indexado con:

  ≢⍵ la longitud del argumento

   los índices de eso (0, 1, 2, ..., longitud -1)

  2⊥⍣¯1 anti-base-2 (usa tantos bits como sea necesario)

   transposición (de una representación en cada columna a una en cada fila)

(... )⍀ expandir por (inserte filas en blanco como se indica con ceros en):

  ≢⍵ la longitud del argumento

  16÷ dividir dieciséis por eso

  1↑⍨ (over) take from one (hace una lista de uno seguido de 1- n ceros)

  16⍴ reciclar ese patrón hasta que tenga dieciséis elementos

' ', anteponer un espacio

 formato (la lista de tablas en una sola tabla, rellenando cada una con un espacio en cada lado)

¯1⌽ gire un paso hacia la derecha (moviendo así el espacio posterior hacia el frente)

0 3↓ suelte cero filas y tres columnas (eliminando así los tres espacios iniciales)

Adán
fuente
Oye, ¿dónde 16÷⍨aparece en tu código?
Zacharý
@ZacharyT Seguro que no. Muy bien visto, señor.
Adám
1

SOGL , 106 105 102 bytes

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

Si se permiten espacios previos, 102 99 bytes

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

141 bytes, compresió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

solo quería ver qué tan bien podía hacer SOGL con solo compresión (bueno, tiene más que solo compresión, pero es 97% cadenas comprimidas)

dzaima
fuente
1

JavaScript (205 bytes)

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

Desigual
fuente
1

Ruby, 144 143 141 bytes

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}

Sin golf

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

Pyth , 106 bytes

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

¡Pruébalo en línea!

Explicación

En pocas palabras, lo que hago aquí es generar la tabla columna por columna y luego transponer la tabla antes de imprimirla. Notamos que en una columna, los códigos morse para las letras se pueden representar como cadenas binarias (reemplazar .por 0y -por 1) al contar desde cero hasta el índice de la última letra en la columna.

El algoritmo se basa en una función de la que doy un ejemplo a continuación (para la segunda columna):

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!

Explicación del código

Corté el código en dos. La primera parte es la función descrita anteriormente, la segunda parte es cómo uso la función:

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) : en la tabla morse, en la primera columna, hay siete líneas después de cada línea que contiene una letra ("E" y "T"). En la segunda columna, son tres líneas. Luego uno (tercera columna), luego cero (última columna). Ahí es 16 / n - 1donde nestá el número de letras en la columna (que está Nen el código anterior). Eso que hace el código en la línea (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 ["    ", "    ", ...])

Bien, ahora tenemos una buena función útil hque básicamente genera una columna de tabla a partir de una secuencia de caracteres. Vamos a usarlo (tenga en cuenta los dos espacios finales en el código a continuación):

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

El código aún se puede acortar; tal vez volveré sobre eso más tarde.

Jim
fuente
1

C, 199 195 bytes

#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 (con #include para evitar el mensaje de advertencia).

ACTUALIZACIÓN : Guardado cuatro caracteres al mover la "declaración" de mfuera de la función, como lo sugiere @zacharyT

Utiliza lo que parece ser una estrategia estándar: mantener las letras en un árbol binario codificado en matriz, de modo que los elementos secundarios del elemento isean 2*iy 2*i+1. Este árbol tiene sus raíces en 2 en lugar de 1 porque la aritmética funcionó un poco más corta, creo. Todo lo demás es golf.

Sin golf:

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

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

int main(void) {
  p(2,0);
}
rici
fuente
¿Podría mover el int mpara estar m;fuera de la función?
Zacharý
¿Este trabajo repl.it/Iqma ?
Zacharý
@ZacharyT: supongo que funcionará, pero es un carácter más largo (el paréntesis abierto en el #define), por lo que parece poco importante.
rici
Conté 194 bytes con esa versión, ¿me estoy perdiendo algo?
Zacharý
1

Chicle , 133 bytes

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

Comprimido como una secuencia LZMA.

Uriel
fuente
0

C, 291 bytes

Probar en línea

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ómo funciona

Primero analicé la cadena en C, contando espacios que son menos de 26, así que los codifiqué en minúsculas a, b, .. zcon este pequeño programa

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

Luego escribí un analizador para esa codificación, donde /hay una nueva línea, y una letra minúscula representa t[i] - 'a'espacios

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

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

Bash (con utilidades), 254 bytes

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

Dyalog APL, 159 bytes (no competidor)

↑{X←⍵-1⋄Y←2*⍳4⋄R←Y+(Y÷16)×⍵-1⋄3↓∊{C←R[⍵]⋄'   ',(⍵⍴(1+0=1|C)⊃'    '({⍵⊃'.-'}¨1+(4⍴2)⊤X)),' ',((1+0=1|C)⊃' '((C-1|C)⊃' ETIANMSURWDKGOHVF L PJBXCYZQ  '))}¨⍳4}¨⍳16
Locoluis
fuente
¿Por qué esto no es competitivo?
Adám
Creo que puede ahorrar mucho configurando ⎕IO←0(predeterminado en muchos sistemas) y usando (conmutar) .
Adám
0

JavaScript (ES7), 242 240 238 bytes

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

Pruébalo en línea!

–2 bytes gracias a Zachary .

eush77
fuente
Intenta cambiar a!='0'aa!=0
Cyoce
¿Se puede reemplazar .join('')con .join<insert backtick here><insert backtick here>? ( <insert backtick here>siendo reemplazado por
backticks
Como dijo Cyoce, intenta cambiar a!='0'a a!=0, eso debería funcionar.
Zacharý
@ZacharyT No, no lo hace , pero gracias de nuevo.
eush77
Lo siento, olvidé el ''caso.
Zacharý