36

チャレンジ

指定された 16 進数の 7 セグメント表示表現を生成するための、文字数による最短コード。

入力

入力は、数字 [0-9] と、大文字と小文字の両方の 16 進文字 [a-fA-F] のみで行われます。特別なケースを処理する必要はありません。

出力

出力は、これらのASCIIフェースを使用して、入力の 7 セグメント表現になります。

  _       _   _       _   _   _   _   _   _       _       _   _  
 | |   |  _|  _| |_| |_  |_    | |_| |_| |_| |_  |    _| |_  |_  
 |_|   | |_   _|   |  _| |_|   | |_|  _| | | |_| |_  |_| |_  | 

制限

次の使用は禁止されています: eval、exec、system、figlet、toilet、および外部ライブラリ。

テストケース:

Input:
    deadbeef

Output:
        _  _        _  _  _ 
     _||_ |_| _||_ |_ |_ |_ 
    |_||_ | ||_||_||_ |_ |  


Input:
    4F790D59

Output:
        _  _  _  _     _  _ 
    |_||_   ||_|| | _||_ |_|
      ||    | _||_||_| _| _|

コード カウントには、入力/出力 (つまり、完全なプログラム) が含まれます。

4

26 に答える 26

30

C89 (181 文字; 引数)

char*q,a=3;p(l){putchar(*q?"|#]u&rzc~vn:X=ZJ"[*q-(*q&64?55:48
)&15]+1>>l&1?"|_||_|_"[l]:32:10);}main(r,v)char**v;{for(;a--
;p())for(q=v[1];*q;++q)for(r=3;r--;)p(a-2?5-r-a*3:r-1?7:6);}

C89 (192 文字; stdin)

char*q,b[9],gets(char*),a=3;p(l){putchar(*q?"|#]u&rzc~vn:X=ZJ"[*
q-(*q&64?55:48)&15]+1>>l&1?"|_||_|_"[l]:32:10);}main(r){for(gets
(b);a--;p())for(q=b;*q;++q)for(r=3;r--;)p(a-2?5-r-a*3:r-1?7:6);}

説明:

char*q,b[9],gets(char*),a=3;
p(l){
    putchar(*q?
        /*
         * Each element of the magic string is decremented so 0x7F is
         * '~' (0x7E).  Each bit before the decrement represents
         * a segment (thus "8" is 0x7F (0x7E), i.e. all 7 bits on).
         * Bit 7 is always cleared so p(7) always prints a space.
         */
        "|#]u&rzc~vn:X=ZJ"
        [*q-(*q&64?55:48)&15]+1 /* d[ascii2hex(*q)] + 1 */
        >>l&1                   /* Is bit 'l' set? */
            ?"|_||_|_"[l]       /* Yes; choose _ or | by position. */
            :32                 /* No; enter a space. */
    :10);                       /* End of line. */
}
main(r){
    for(gets(b);a--;p())                /* Grab input and loop through each of 3 lines (a = 2, 1, 0). */
        for(q=b;*q;++q)                 /* Iterate across input. */
            for(r=3;r--;)               /* For each of three characters across... */
                p(a-2?5-r-a*3:r-1?7:6); /* Print the segment, mapping position to the bit. */
}
于 2009-09-10T20:29:58.523 に答える
30

Perl、134 文字

すべての改行を削除できます。

@s=unpack"C*",~"P\xdbLI\xc3a`[\@AB\xe0t\xc8df";
$_=<>;for$s(6,3,0){print map$s[hex$&]&1<<$_+$s?$_%2?"_":"|":" ",
0..2while/./g;print$/}

説明

@s各セグメントのビットを格納します。エントリは 0 から F までの順序であり (おかげでhex())、ビットは次の順序でセグメントにマップされます。

6 7 x
3 4 5
0 1 2

0LSBである。(ビット 6 は使用されません)。値はビット反転された文字列にパックされて格納されるため、より多くの印刷可能な文字があります。演算子はビットを反転し、~unpack は数値を返します (文字列に関しては、perl のビット単位の演算子は非常に扱いにくいです)。

データが手元にあるので、入力を読み取り、それを 3 回ループします。3 つのループの唯一の違いは、必要なビットマスクです。入力の各文字に対して、出力の 3 文字が出力されます。印刷する文字は

$s[ hex $& ] & (1 << ($_ + $s) )
? ($_ % 2 ? "_" : "|" )
: " "

@sルックアップ テーブル、$sは行に応じた効果の変化、 は行$_の 1 番目、2 番目、または 3 番目の文字を出力するかどうかです。ルックアップ テーブル エントリの右側のビットが false の場合、スペースが出力されます。それ以外の場合は、「|」を出力します 両側または中央に「_」。

于 2009-09-11T00:28:22.923 に答える
14

COM実行可能ファイル:102バイト

A86を使用して以下を組み立てます(これは元の、より大きなバージョンです):

dd 0801E8Ah,0BD80C380h,03B50154h,0D789D58Ah,0B20082BEh,077F33B03h,0C048A29h,0149F0420h
dd 020AD431h,088C402C4h,01468BC1h,0F8C1E0D3h,046220Fh,0AA036E8Dh,0DD75CAFEh,04609ED83h
dd 0C583D1EBh,0D0AB809h,075CDFEABh,0AA24B0C3h,021CD09B4h,05F0000C3h,020B7EBh,8EFB7C00h
dd 07C3EF75Fh,0BF7CF9E4h,0B6DE5FA2h
dw 0F47Ch
db 0DFh

編集:

DosBoxの問題は、おそらくプログラムが起動時にレジスタ値を想定する方法です。とにかく、これが102バイトにアセンブルされ、DosBoxで動作するはずの変更されたソースです。

    mov bp,d1
    mov ch,3
    mov dx,ds ; if you want to use dos box, put "mov dx,08000h" here instead, it might fix the problem
    mov di,dx
l4: mov si,082h
l3: mov bl,3
    cmp byte ptr [si],0dh
    je l5
    mov cl,[si]
    cmp cl,40h
    jle l2
    add cl,9
l2: and cl,0fh
l1: mov ax,word ptr [bp+1]
    shl ax,cl
    sar ax,15
    and al,byte ptr [bp]
    add bp,3
    stosb
    dec bl
    jnz l1
    sub bp,9
    inc si
    jmp l3
l5: add bp,9
    mov ax,0d0ah
    stosw
    dec ch
    jnz l4
    mov al,'$'
    stosb
    mov ah,9
    int 21h
d1: ret
    dw 0
    db '_'
    dw 01011011111101011xb
    db ' '
    dw 0
    db '|'
    dw 01000111011111011xb
    db '_'
    dw 00011111011110111xb
    db '|'
    dw 01111100111100100xb
    db '|'
    dw 01010001010111111xb
    db '_'
    dw 01011011011011110xb
    db '|'
    dw 01101111111110100xb

いくつかの調整をしてくれたephemientに感謝します!

于 2009-09-11T14:25:54.100 に答える
13

x86 (146 バイト; 引数)

Code Golf: The waveのJonas Gulleに触発されました。通常、私は 32 ビットの Linux ELF を作成しますが、16 ビットの DOS COM ははるかに小さくなります (命令が短く、オーバーヘッドがゼロ)。

46 の命令と 24 の非実行ワード。コードをデータとして再利用することほどトリッキーなことはありません。とにかく、おそらく10バイト以上節約できないでしょう。

C:\>od -xAn ss.com
 c930 82be ac00 0d3c 3e74 403c 027e 0904
 0f24 0198 bbc8 0162 c301 0eb4 078a 0424
 0474 7cb0 02eb 20b0 10cd 078a 0224 0474
 5fb0 02eb 20b0 10cd 078a 0124 0474 7cb0
 02eb 20b0 10cd bdeb f980 7420 b014 cd0d
 b010 cd0a 6610 c381 0010 0000 c180 eb10
 c3a1 0002 0202 0200 0202 0202 0002 0002
 0202 0105 0303 0607 0106 0707 0607 0304
 0606 0107 0306 0301 0107 0307 0705 0706
 0406
C:\>ss デッドビーフ
    _ _ _ _ _
 _||_ |_| _||_ |_ |_ |_
|_||_ | ||_||_||_ |_ |  

これは、最初の行を文字ごとに印刷し、次に 2 行目というように、3 バイトを使用して各文字の 9 ビットのデータを格納するだけです。明らかに拡張の余地が残されています… ( NASM構文を使用するのはこれが初めてです。私はガスに慣れていますが、生のバイナリを出力するように説得することはできませんでした。)

org 0x100

; initialize registers
    xor cl,cl

; reset ds:[si] to start of arguments
start:
    mov si,0x82

; load one character of arguments
read:
    lodsb
    cmp al,0xd
    je next

; transform [0-9A-Fa-f] to [\x00-\x0f]
    cmp al,0x40
    jle skipa
    add al,0x9
skipa:
    and al,0xf

; load font definition
    cbw
    add ax,cx
    mov bx,letters
    add bx,ax
    mov ah,0xe

; print first char
    mov al,[bx]
    and al,0x4
    jz s1
    mov al,0x7c
    jmp short w1
s1:
    mov al,0x20
w1:
    int 0x10

; print second char
    mov al,[bx]
    and al,0x2
    jz s2
    mov al,0x5f
    jmp short w2
s2:
    mov al,0x20
w2:
    int 0x10

; print third char
    mov al,[bx]
    and al,0x1
    jz s3
    mov al,0x7c
    jmp short w3
s3:
    mov al,0x20
w3:
    int 0x10

; next character
    jmp short read

; print newline
next:
    cmp cl,0x20
    je end
    mov al,0xd
    int 0x10
    mov al,0xa
    int 0x10
    add ebx,0x10
    add cl,0x10
    jmp short start

end:
    ret

letters:
    db 2,0,2,2,0,2,2,2,2,2,2,0,2,0,2,2
    db 5,1,3,3,7,6,6,1,7,7,7,6,4,3,6,6
    db 7,1,6,3,1,3,7,1,7,3,5,7,6,7,6,4
于 2009-09-12T05:21:45.723 に答える
6

男... perlに勝てない。これは 163 文字の py3k です。

i=input()
[print(''.join('     | _  _||  | ||_ |_|'[(7&(d>>l))*3:][:3]for d
in[255&0xb4b61fa637bdbbbf89b7b3399b9e09af>>int(x,16)*8 for x in i]))for
l in[6,3,0]]

説明。まず、完全に最適化されていない状態は次のとおりです。

# segment positions, easily understandable as octal.  first digit is top row
# last digit is bottom row.  high bit is first column, low bit last.

a=[0o257, 0o011, 0o236, 0o233,
   0o071, 0o263, 0o267, 0o211,
   0o277, 0o273, 0o275, 0o067,
   0o246, 0o037, 0o266, 0o264]

# and the corresponding segments:
#   421    421    421    421    421    421    421    421  
b=['   ', '  |', ' _ ', ' _|', '|  ', '| |', '|_ ', '|_|']

# function to look for the proper segment for a decoded digit:
def lookup(digit, line):
    return b[ 7& (digit>>(6-line*3))]

#function to encode an ascii hex string into coded form suitible for
#above function
def code(i):
    return [a[int(x,16)] for x in i]

def fmt(i):
    return '\n'.join(''.join(lookup(d,l) for d in code(i)) for l in [0,1,2])

i = input()
print(fmt(i))

次に、データをパックする方法を見つけます。a最初に、一度に 8 ビットずつ、最後の要素から大きな長整数に変換できます。これにより、8 進数で次のようになり0o2645541764615736673577046675463463347404657ます。16 進数で書かれているため、8 進数0xb4b61fa637bdbbbf89b7b3399b9e09afのリストより 90 文字短くなります。それを使用するには、もちろんコードを書き直す必要があります。それは次のように見えます

def code_a_8(i):
    return [255&a_8>>int(x,16)*8 for x in i]

b連結可能で''.join(b)、引用符を含めて 26 文字です。これをサポートするには、ルックアップ関数も変更する必要があります。

def lookup_b_cat(d, l):
    return b_cat[(7&(d>>6-l*3))*3:][:3]

次に、関数と定数を式に折りたたんで、不要な構文をすべて削除します。これでほとんど終わりです。

印刷を少しきつくすることも可能です。行を結合する代わりに、すぐに印刷してください。これにより、次のように変更されfmt()ます。

def fmt_print(i):
    [print(''.join(lookup(d,l) for d in code(i))) for l in [0,1,2]]
于 2009-09-11T05:19:25.627 に答える
6

Perl のような特殊な言語に勝るものはありません。ただし、160 バイトのPythonバージョンは次のとおりです。

i=input().lower()
for x in[' #_ 14bd# ','| 1237d#_ 017c#| 56bcef','| 134579#_ 147af#| 2cef']: print(' '.join(''.join(y[j in y]for y in x.split('#'))for j in i))

非ゴルフバージョン:

input_ = input().lower()

for magic in [' #_ 14bd# ',
          '| 1237d#_ 017c#| 56bcef',
          '| 134579#_ 147af#| 2cef',
         ]:
    # We have three lines, so x iterates over 3 magic strings.
    print(' '.join(
                # This is the cycle iterating over digits.
                ''.join(
                    # For each line and digit we need to print several
                    # letters. To do this, we break a magic string into
                    # 3 chunks. A chunk usually contains digits that
                    # *don't* have an element there. 
                    chunk[digit in chunk]
                    # For example, lower right chunk y="| 2cef". For digits
                    # 2, c, e, f, there should be " ", for all others there
                    # should be "|". So for digits 2, c, e, f, `j in y` returns
                    # False and indexes y[0], for other digits it indexes y[1]. 
                for chunk in magic.split('#'))
          for digit in input_)) 
于 2009-09-14T19:30:58.847 に答える
5

ルビー:175

d="3yy0nxcoypnk4185nbr3k9ddjlhe".to_i 36
s=gets.chomp
o=''
for i in 0..2
s.each_char{|c|q=d>>c.to_i(16)*3
"|_|".each_char{|z|o<<(q&1>0?z:' ')
q>>=1}}
d>>=48
o<<"\n"
end
puts o

そしてもう少し読みやすいとき...

d="3yy0nxcoypnk4185nbr3k9ddjlhe".to_i 36
s=gets.chomp
o=''
for i in 0..2
  s.each_char { |c|
    q = d >> c.to_i(16) * 3
    "|_|".each_char { |z|
      o << (q & 1 > 0 ? z : ' ')
      q >>= 1
    }
  }
  d >>= 48
  o << "\n"
end
puts o
于 2009-09-11T00:16:49.600 に答える
5

Golfscript - 116 文字

$ echo -n deadbeef | ./golfscript.rb  led.gs 
    _  _        _  _  _ 
 _||_ |_| _||_ |_ |_ |_ 
|_||_ | ||_||_||_ |_ | 

最後に余分な改行を入れずに保存してください。そうしないと、入力文字列が最後に出力されます。

{32:^|}%:
{^' _':$@'14bd'{?~!=}:&~^}%n
{:x' |':|\'1237d'&$x'017c'&|x'56bcef'&}%n
{:x|\'134579'&$x'147af'&|x'2cef'&}%

使い方

範囲 0 ~ F では、オフよりも多くのセグメントがオンになっていることに注意してください。各セグメントの例外 (セグメントがオフになっている数字) をリストします。

#Python version of the algorithm above
s=raw_input().lower()
J=''.join()
print J(' '+'_ '[c in'14bd']+' 'for c in s)
print J('| '[c in'1237d']+'_ '[c in'017c']+'| '[c in'56bcef']for c in s)
print J('| '[c in'134579']+'_ '[c in'147af']+'| '[c in'2cef']for c in s)
于 2009-11-10T01:03:29.543 に答える
5

C (170 文字)

i,j;main(c,s){char**r=s,*p=*++r;for(;i<3;)j--?putchar(!p[-1]?p=*r,++i,j=0,10:
"##3#3133X=W.<X/`^_G0?:0@"[i*8+c/2]-33>>c%2*3+j&1?"|_"[j&1]:32):(j=3,c=*p++&31,
c-=c>6?10:1);}

これは、入力文字列をコマンドライン引数として受け取ります。stdin を使用するための変換は、もう 1 文字になります。

i,j;main(c){char s[99],*p=s;for(gets(s+1);i<3;)j--?putchar(!*p?p=s,++i,j=0,10:
"##3#3133X=W.<X/`^_G0?:0@"[i*8+c/2]-33>>c%2*3+j&1?"|_"[j&1]:32):(j=3,c=*++p&31,
c-=c>6?10:1);}

標準入力バージョンは、最大 98 文字の入力を受け入れることができます。もちろん、それ以上だfloor(terminalWidth / 3)と改行が混乱します。

各文字の出力は、各行のセルがセグメントである 3x3 グリッドのように扱われます。セグメントは「オン」または「オフ」のいずれかです。セグメントが「オン」の場合、位置に応じてa'|'または aが出力されます。'_'オフの場合はスペースが出力されます。文字配列は、各セグメントがオンかオフかを決定するビットの配列です。コードの後に​​それについての詳細:

i,j; /* Loop variables. As globals, they'll be initialized to zero. */
main(c,s){
    /* The signature for main is
     *
     *     main(int argc, char **argv)
     *
     * Rather than add more characters for properly declaring the parameters,
     * I'm leaving them without type specifiers, allowing them to default to
     * int.  On almost all modern platforms, a pointer is the same size as
     * an int, so we can get away with the next line, which assigns the int
     * value s to the char** variable r.
     */

    char**r=s,*p=*++r;
    /* After coercing the int s to a char** r, offset it by 1 to get the
     * value of argv[1], which is the command-line argument.  (argv[0] would
     * be the name of the executable.)
     */

    for(;i<3;) /* loop until we're done with 3 lines */

        j--?
         /* j is our horizontal loop variable.  If we haven't finished a
          * character, then ... */

            putchar(  /* ...we will output something */
                !p[-1]? /* if the previous char was a terminating null ... */

                    p=*r,++i,j=0,10
                    /* ... reset for the next row.  We need to:
                     *
                     * - reinitialize p to the start of the input
                     * - increment our vertical loop variable, i
                     * - set j to zero, since we're finished with this
                     *   "character" (real characters take 3 iterations of
                     *   the j loop to finish, but we need to short-circuit
                     *   for end-of-string, since we need to output only one
                     *   character, the newline)
                     * - finally, send 10 to putchar to output the newline. */

                    :"##3#3133X=W.<X/`^_G0?:0@"[i*8+c/2]-33>>c%2*3+j&1?
                    /* If we haven't reached the terminating null, then
                     * check whether the current segment should be "on" or
                     * "off".  This bit of voodoo is explained after the
                     * code. */

                        "|_"[j&1]:32
                        /* if the segment is on, output either '|' or '_',
                         * depending on position (value of j), otherwise,
                         * output a space (ASCII 32) */
            )/* end of putchar call */

            :(j=3,c=*p++&31,c-=c>6?10:1);
            /* this is the else condition for j--? above.  If j was zero,
             * then we need to reset for the next character:
             *
             * - set j to 3, since there are three cells across in the grid
             * - increment p to the next input character with p++
             * - convert the next character to a value in the range 0–15.
             *   The characters we're interested in, 0–9, A–F, and a–f, are
             *   unique in the bottom four bits, except the upper- and
             *   lowercase letters, which is what we want.  So after anding
             *   with 15, the digits will be in the range 16–25, and the
             *   letters will be in the range 1–6.  So we subtract 10 if
             *   it's above 6, or 1 otherwise.  Therefore, input letters
             *   'A'–'F', or 'a'–'f' map to values of c between 0 and 5,
             *   and input numbers '0'–'9' map to values of c between
             *   6 and 15.  The fact that this is not the same as the
             *   characters' actual hex values is not important, and I've
             *   simply rearranged the data array to match this order.
             */
}

文字配列は、文字グリッドを記述します。配列内の各文字は、2 つの入力文字に対する出力グリッドの 1 つの水平行を表します。グリッド内の各セルは 1 ビットで表されます。これは、セグメントが「オン」であることを意味し (したがって、位置に応じてaまたは aを1出力します)、セグメントが「オフ」であることを意味します。'|''_'0

2 つの入力文字のグリッド全体を記述するには、配列内の 3 文字が必要です。配列内の各文字の下位 3 ビット (ビット 0 ~ 2) は、2 つの偶数入力文字の 1 つの行を表します。次の 3 ビット (ビット 3 ~ 5) は、2 つのうち奇数の入力文字の 1 つの行を表します。ビット 6 と 7 は未使用です。+33 のオフセットを持つこの配置により、エスケープ コードや非 ASCII 文字を使用せずに、配列内のすべての文字を印刷可能にすることができます。

入力文字の 7 つのセグメントすべてのビットを配列内の 1 つの文字に入れるなど、いくつかの異なるエンコーディングをいじりましたが、これが全体的に最短であることがわかりました。この方式では、入力文字 16 文字のみのセグメントを表すために配列内に 24 文字が必要ですが、他のエンコーディングでは、ASCII 以外の文字を使用する必要がありました (モールス符号のゴルフの回答でこれを使用すると、当然ながら問題が発生しました)。 、および/または複雑なデコードコード。このスキームのデコード コードは驚くほど単純ですが、括弧を追加する必要がないように C の演算子の優先順位を最大限に活用しています。

それを理解するために小さなステップに分けてみましょう。

"##3#3133X=W.<X/`^_G0?:0@"

これはエンコードされた配列です。デコードする適切な文字を取得しましょう。

[i*8

最初の 8 文字はセグメントの一番上の行を表し、次の 8 文字はセグメントの真ん中の行を表し、最後の 8 文字はセグメントの一番下の行を表します。

 +c/2]

この時点で、c には 0 ~ 15 の値が含まれており、これは ABCDEF0123456789 の入力に対応し、配列はエンコードされた文字ごとに 2 つの入力文字をエンコードすることに注意してください。したがって、配列の最初の文字'#'は 'A' と 'B' の一番上の行のビットを保持し、2 番目の文字も'#''C' と 'D' の一番上の行をエンコードします。

-33

エンコーディングの結果、32 未満の値がいくつか発生するため、エスケープ コードが必要になります。このオフセットにより、エンコードされたすべての文字が、印刷可能なエスケープされていない文字の範囲になります。

>>

右シフト演算子は算術演算子よりも優先順位が低いため、このシフトはオフセットを減算した後の文字に対して行われます。

c%2*3

c%2は偶数の場合は 0、奇数の場合は 1 と評価されるため、奇数文字の場合は右に 3 シフトしてビット 3 ~ 5 を取得し、偶数文字の場合はまったくシフトせず、ビット 0 ~ 2 へのアクセスを提供します。 . c&1偶数/奇数チェックに使用することを好みますが、それは私が他の場所で使用するものですが、&演算子の優先順位が低すぎて、括弧を追加せずにここで使用することはできません。%演算子には適切な優先順位があります。

+j

j現在の出力位置の正しいビットを取得するには、さらにビットをシフトします。

&1

ビットごとの and 演算子は、算術演算子とシフト演算子の両方よりも優先順位が低いため、シフトによって関連するビットがビット 0 になった後にビット 0 が設定されているかどうかをテストします。

?

ビットゼロが設定されている場合...

"|_"

... によって選択されたこれらの文字の 1 つを出力します ...

[j&1]

... 水平ループ変数が偶数か奇数か。

:32

それ以外の場合 (ビット 0 が設定されていない)、出力 32 (空白文字)。


私はこれをこれ以上削減することはできないと思います。

于 2009-09-11T14:14:35.630 に答える
4

私の最初のコードゴルフ。空白以外の279文字、スペースを含む433文字。Pythonではもっと短くなる可能性があると確信しています。

Python

import sys
w = sys.stdout.write
i = raw_input()
d = [111,9,94,91,57,115,119,73,127,123,125,55,102,31,118,116]
p = [' _ ','|','_','|','|','_','|']
j = 0
for r in range(3):
    for c in i.lower():
        for n in range(3 if r else 1):
            s = p[j+n]
            if (1<<6-j-n) & d[ord(c)-(ord('0') if c.isdigit() else ord('a')+6)]:
                w(s)
            else:
                w(' '*len(s))
    j += n+1
    w('\n')
于 2009-09-10T20:54:04.237 に答える
4

BrainF***、デジタル時計用920 906 885 868 863 860 858 文字

私はこれを(現在は閉鎖されている)デジタル時計コードゴルフで始めたので、 : もサポートされています。Todo: 小文字を扱います。

-[>+<-----]->----[>,]<[<]>>[[->]<+[-<+]->]<+>-[>]+++[[<]>>[[>]>[>]+[<]<[<]+[>]>[
>]+[-<+]->[[>]>[>]<+[<]<[<]>+[>]+[-<+]->-]->]<[<]>+[-[>]+[-<+]+<[<]>[[>]+[-<+]->
+<[<]>-]>+]+[-->]+[->]-[>-<-----]>+++>-->->----<<<[>>+++>+++++>-[+++<]>]-<+[>]-[
<]>>>+[-<<+[->+]<<-[-[++>->>[>]>>+++++>>+++++>>>>>+++++>>>+++++++>>>>>>+++++>>>+
++++>>+[<+]<[<]<]>[-<++>>>[>]<--->+>+>->++++++>+>-->>>>>>>+++>-->-->>+>+>-->->->
>+++++>+[<++++]<[<]]<]>[-<+>>>[>]<--->++++++>+>-->+>-->+++++>>>>>>>+++>->-->>-->
->>->+>>-->+[<++++]<[<]]<+>-[[>]>[>]<[-]<[<]<[<]>-]>[>]>[>]+<-[-[-[-[-[-[-[-[-[[
<]<<.>...>>[>]<-]>[<+[<]<<.>.<.>.>>[>]<->]<]>[<+[<]<..>>[>]<->]<]>[<+[<]<<<<.>>>
.>>[>]<->]<]>[<+[<]<....>>[>]<->]<]>[<+[<]<<.<.>>..>>[>]<->]<]>[<+[<]<..<.>.>>[>
]<->]<]>[<+[<]<.<<.>.>.>>[>]<->]<]>[<+[<]<<.<.>.>.>>[>]<->]<]>[<+[<]<.<<.>>..>>[
>]<->]<<[[-]<]-[<]>>>+]++++++++++.[>]<[[-]<]+[-<+]-[>]<-]

$ echo 01:23456789DEADBEEF | beef clock.b 
 _         _   _       _   _   _   _   _       _   _           _   _   _  
| |   | .  _|  _| |_| |_  |_    | |_| |_|  _| |_  |_|  _| |_  |_  |_  |_  
|_|   | . |_   _|   |  _| |_|   | |_|  _| |_| |_  | | |_| |_| |_  |_  |   

これは、プラットフォームが 8 ビットであることに大きく依存します。

于 2010-07-25T22:48:12.400 に答える
3

Python、合計 188 文字

他のソリューションはあまり見ていませんが、まだ改善の余地がたくさんあると確信しています。

n=int(raw_input(),16)
O=[""]*3
while n:O=["".join(" |_"[(m>>n%16*3+i&1)*(i%2+1)]for i in[2,1,0])+o
for o,m in zip(O,[0x482092490482,0xd9cdff3b76cd,0x9bef5f3d978f])];n>>=4
print"\n".join(O)
于 2009-09-10T23:14:12.490 に答える
3

F#、294 文字

私は巧妙なことは何もしませんでしたが、それでも立派なスコアを獲得しました。

let rec G s=for r in[" _     _  _     _  _  _  _  _  _     _     _  _ ";"| |  | _| _||_||_ |_   ||_||_||_||_ |   _||_ |_ ";"|_|  ||_  _|  | _||_|  ||_| _|| ||_||_ |_||_ |  "]do Seq.iter(printf"%s"<<S r)s;printfn""
and S a h=a.Substring(3*(int h-if h<'A'then 48 elif h<'a'then 55 else 87),3)

わかりやすくするために空白を使用します。

let rec G s=
    for r in[" _     _  _     _  _  _  _  _  _     _     _  _ ";
             "| |  | _| _||_||_ |_   ||_||_||_||_ |   _||_ |_ ";
             "|_|  ||_  _|  | _||_|  ||_| _|| ||_||_ |_||_ |  "] do 
        Seq.iter (printf "%s" << S r) s;
        printfn""
and S a h=
    a.Substring(3*(int h - if h<'A'
                           then 48 
                           elif h<'a'
                           then 55 
                           else 87),3)

サンプル:

G("abcdefFEDCBA9876543210")

出力:

 _     _     _  _  _  _     _     _  _  _  _  _  _     _  _     _
|_||_ |   _||_ |_ |_ |_  _||  |_ |_||_||_|  ||_ |_ |_| _| _|  || |
| ||_||_ |_||_ |  |  |_ |_||_ |_|| | _||_|  ||_| _|  | _||_   ||_|
于 2009-09-11T08:22:39.663 に答える
2

C ++、286バイト

ふふ、誰もがデータを表現するためのより簡潔な方法を考え出しました。

とにかく、それが完全な時間の無駄にならないように(コマンドラインからの入力):

#include<cstdio>
#define P(x)putchar(x);
int main(int,char**v){int i,j,d[]={0,6947821,0,7209841,7734140,1180575,8257861,
3933037,1442811};char*p,c[]="|_|";for(++v;*v;++v){for(i=0;i<9;i+=3){for(p=*v;*p;
++p){for(j=0;j<3;++j)P(1<<((*p>96?*p-32:*p)-48)&d[i+j]?c[j]:32)P(32)}P(10)}P(10)
}}

そして難読化されていない:

#include <cstdio>

void out(const char* s)
{
    int i, j;
    const char* c = "|_|";
    unsigned d[9] = {0, 6947821, 0, 7209841, 7734140, 1180575, 8257861, 3933037, 1442811};
    for (i = 0; i < 9; i += 3) {
        for (const char* p = s; *p; ++p) {
            for (j = 0; j != 3; ++j)
                putchar(1 << ((*p > 96 ? *p - 32 : *p) - '0') & d[j + i] ? c[j] : ' ');
            putchar(' ');
        }
        putchar('\n');
    }
}

int main(int, char** argv)
{
    for (++argv;*argv;) {
        out(*argv++);
        putchar('\n');
    }
}

魔法の数字は、どのキャラクターが_または|を持っているかを示します 特定の位置で。たとえば、0、3、5、および「A」のすべてに|がある場合 どこかで、数は1 << n('0') | 1 << n('3') | 1 << n('5') | 1 << n('A')-になります。ここで、n(x)はを意味しx - '0'ます。ASCIIチャート'9'との間には小さなギャップがあるため、これは少なくとも32ビットの整数を想定しています。'A'

両方のコードは最近編集されました:2次元(d)の代わりに1次元配列を使用しtoupper、cctypeを含める代わりに独自のエラー防止""を使用し、すべてをメインに移動し、コマンドライン引数をループする別の方法、より凝縮された変数宣言、char定数の代わりのマジック値、およびその他のいくつかの小さな変更。

于 2009-09-10T21:31:02.743 に答える
2

Java1.5-不要な空白を削除した272文字

JRLのアイデアを使用して、以前のバージョンよりもはるかに短くなっています。コマンドライン引数を使用して短くすることもできますが、それは仕様に反します。

class D{public static void main(String[]a){char[]q=new java.util.Scanner
(System.in).nextLine().toCharArray();int j=0,k;for(;j<9;j+=3){for(int c:
q){for(k=j;k<j+3;k++){System.out.print(("{H=mNgwI\177o_v3|7\027".charAt(
"0123456789abcdef".indexOf(c|32))&"\0\1\0\2\4\10\20 @".charAt(k))>0?
" _ |_||_|".charAt(k):32);}}System.out.println();}}}
于 2009-09-10T20:59:05.833 に答える
1

C#-576文字(改行なし)

これを行うにはおそらくもっと良い方法がありますが、これが私の解決策です:

using C=System.Console;class Z{static void Main(){new Z();}int L=0;Z(){
try{var s=C.ReadLine().ToUpper();C.Clear();foreach(var c in s){int n=(
int)c;var p=(n==48?"_ ;| |;|_|":n==49?";  |;  |":n==50?"_; _|;|_":n==51
?"_; _|; _|":n==52?";|_|;  |":n==53?"_;|_; _|":n==54?"_;|_;|_|":n==55?
"_;  |;  |":n==56?"_;|_|;|_|":n==57?"_;|_|; _|":n==65?"_;|_|;| |":n==66
?";|_;|_|":n==67?"_;|;|_":n==68?"; _|;|_|":n==69?"_;|_;|_":n==70?"_;|_;|"
:";;").Split(';');P(0);C.Write(" "+p[0]);P(1);C.Write(p[1]);P(2);C.Write
(p[2]);L+=4;}C.WriteLine();}catch{}}void P(int t){C.SetCursorPosition(L,t);}}
于 2009-09-11T06:15:20.560 に答える
1

パックされたときのJavascript333文字

s=" ";
function r(p)
{
if(t[p]=="0")
return s;
return "_|_||_|".split("")[p];
}
function g(w){
a="";b=a;c=a;
z=[];
for(x=0;x<w.length;x++){
t=("000"+parseInt("6F095E5B397377497F7B7D37661F7674".substr(parseInt(w.substr(x,1),16)*2,2),16).toString(2)).slice(-7).split("");
a+=s+r(0)+s+s;
b+=r(1)+r(2)+r(3)+s;
c+=r(4)+r(5)+r(6)+s;
}
return a+"\n"+b+"\n"+c;
}

alert(g("0123456789deadbeef"));
于 2009-10-13T15:00:15.433 に答える
1

私のものは短くはありませんが、やっていて楽しかったです:

~ dlamblin$ ./7seg 31337aAbcdeF
 _     _  _  _  _  _     _     _  _ 
 _|  | _| _|  ||_||_||_ |   _||_ |_ 
 _|  | _| _|  || || ||_||_ |_||_ |  

#include <stdio.h>
#define P(x) fputs(x,stdout)
#define Z "\33[3D\33[B"
#define a "   " Z
#define s " _ " Z
#define d "  |" Z
#define f " _|" Z
#define g "|  " Z
#define h "| |" Z
#define j "|_ " Z
#define k "|_|" Z
int main(int argc, char** argv){
char m=0,n,*b[]={s h k,a d d,s f j,s f f,a k d,s j f,s j k,s d d,s k k,s k d,
"","","","","","","",
s k h,a j k,s g j,a f k,s j j,s j g};
P("\n\n\n\33[3A");
while (argc>1&&0!=(n=argv[1][m++])){
P(b[n>96?n-80:n-48]);P("\33[3A\33[3C");
}
P("\n\n\n");
}

改行をいくつか削除することで数文字を節約できますが、私は気にしません。これは 500 文字、または改行を削除して 482 文字です。argc>1&&

VT100 エスケープ コードのサポートが必要で、80 列の端末では 26 文字を超える出力はできません。

PSもっと多くの人が自分の成果を見せてくれるのを見たいです。

于 2009-09-10T23:09:45.363 に答える
1

Haskell、259 文字。

Haskell はゴルフに悪いですか、それとも私 (初めてのゴルフ) ですか?

import Char
i=iterate
d b=map(`mod`b).i(`div`b)
z _ 0=' '
z a 1=a
r=take 3
main=
  getLine>>=
  putStr.unlines.foldl1(zipWith(++)).
  map(r.map r.i(drop 3).take 9.zipWith z(cycle"|_|").(0:).d 2.
    (d 256(0xddfd91edcd9cd97990f5*2^384+0x2d6df865ecbd*(2^520+2^776))!!).ord)

(読みやすくするためにメインを行に分割)

于 2009-09-11T13:11:36.280 に答える
1

Windows PowerShell、157

$i=[char[]]"$input"
'☺ ☺☺ ☺☺☺☺☺☺ ☺ ☺☺','♠☻♥♥♦♣♣☻♦♦♦♣•♥♣♣','♦☻♣♥☻♥♦☻♦♥♠♦♣♦♣•'|%{$c=$_
""+($i|%{('···0·_·0··|0·_|0|_|0|_·0|·|0|··'-split0)[$c[("0x$_"|iex)]]})}
于 2011-02-18T06:14:51.137 に答える
1

スカラ、234バイト

val a=Seq("|_|"," _ ","  |","| |"," _|","|  ","|_ ","   ")
val m=argv(0).toLowerCase.map(_-'0').map(i=>if(i<10)i else i-39)
for(s<-Seq(0,16,32))
println(m.map(i=>a("171171111117171132440662000654660264240204306065"(i+s)-'0')).mkString)

コードは非常に簡単です。9 つの可能なセグメントすべてが配列にパックされ、16 進数と位置の間でマッピングされます。おそらく、それはもっとうまく詰めることができます。

マジックナンバーを計算するコード:

val s = " _     _ *all numbers in one line here* |_||_ |  "
val gl = (0 to s.size / 3-1).map(c => s.substring(c*3, c*3+3 ))
// gl now contains flat list of string of 3 chars each

val arr=gl.toSet.toArray   // remove duplicates

// for each segment string find corresponding packed index
val n = gl.map( arr indexOf _).mkString

結果として、n はマジック ナンバー、arr は文字列の配列です。

于 2010-07-25T19:46:33.190 に答える
1

dc - 172 chars

A bit late but a dc entry, almost to spec: it does only accept uppercase numbers, i.e. [0-9A-F] and may print extra 0s at the beginning. Anyway, here it is:

16iD9B4FE55FFBDFFA5BF5BAB774977sK
[   ][ _ ][  |][ _|][|  ][|_ ][| |][|_|]8[1-ds_:al_d0<L]dsLx
?dsNZdsZ
40sr[[1-dlNr10r^/10%80r^lKr/80%lr/8%;aPd0<L]dsLxAP]dsAx
lZ8srlAxlZ1srlAx

A little explanation (line breaks are not required):

The constant 0xD9B4FE55FFBDFFA5BF5BAB774977 encodes each digit in 7 bit, e.g. the number '4' is encoded as 0 111 010, meaning use the string '0' for the top (''), string 7 for the middle ('|_|') and string 2 for the bottom ('|').

The second line defines the strings and stores them in array 'a'

The third lines handles the input and checks how long the number is.

The fourth line does the computation. It created the "subroutine" A and execute it for the first line. The subroutine extracts the appropriate digit (1-dlNr10r^/10), then extracts the 7-bit encoding data (80r^lKr/80%), then takes the appropriate part for the specific line (lr/8%) loads the string and prints it (;aP) then it loops over all the digits (d0<L)

The last line does the same for lines 2 and 3 of the display.

于 2010-03-23T21:37:28.397 に答える
0

-Wallでコンパイルし、理解できます。それほど短くはありません(〜400文字)。深刻な実装では、出力部分からchar-> indexを引き出します(そして、charではなくバッファにインデックスを格納します)。グローバルrは0に初期化されますが、メインでローカルの場合は初期化されません。

#include <stdio.h>
typedef char const* R;
R _=" _ ",S="   ",I="  |",J=" _|",L="|_ ",U="|_|",N="| |",C="|  ";
R s[][16]={
    {_,S,_,_,S,_,_,_,_,_,_,S,_,S,_,_},
    {N,I,J,J,U,L,L,I,U,U,U,L,C,J,L,L},
    {U,I,L,J,I,J,U,I,U,J,N,U,L,U,L,C}};
int r,c,i;
int main(){
    char b[999];
    scanf("%s",b);
    for(;r<3;++r)
        for(c=0;;) {
            i=b[c++]-'0';
            if (i>16) i-=7;
            if (i>15) i-=32;
            if (i<0||i>15){putchar('\n');break;}
            printf("%s",s[r][i]);
        }
    return 0;
}
于 2009-09-10T21:20:34.990 に答える
0

Python ワンライナー (322 文字)

print(lambda l:(lambda s:'\n'.join([' '.join(x) for x in zip(*[l[c].split('\n')
for c in s])])))(dict(zip('0123456789abcdef', 'eJxdjrEBwDAIw3au0Ac9iUd0fJM2DTQD'
'g5ExJgkxTOMKYIzPDDUYORlNsZ3zppwuXsqt/pmmjVmZ\nH6M+9BTXZvU8Umg9fd03SOgvPw=='
.decode('base64').decode('zlib').split('\n/\n'))))(__import__('sys').argv[-1]
.lower())

長さのほとんどは、私が怠け者であり、ルックアップ テーブルに zlib と base64 のビルトインを使用しているためです。次のようにコマンド ラインから実行します。

$ python golf.py fedcba9876543210
于 2009-09-11T00:55:10.270 に答える
0

PHP、232 文字

$d=str_split('    _ | ||_ |_| _|  ||  124066153155046135134166144145142034173054133137',3);
foreach(str_split(strtolower($s))as$c){
    $c=hexdec($c)+8;$r[0].=$d[$d[$c][0]];$r[1].=$d[$d[$c][1]];$r[2].=$d[$d[$c][2]];i
}
echo implode("\n",$r);

説明

# Array containing possible lines
$d=array(
    0 => '   ',
    1 => ' _ ',
    2 => '| |',
    3 => '|_ ',
    4 => '|_|',
    5 => ' _|',
    6 => '  |',
    7 => '|  '
);

# Array mapping characters to 3 lines
$m=array(
    0 => '124', # i.e. The character '0' is represented by $d[1], $d[2] and $d[4]
    1 => '066',
    2 => '153',
    3 => '155',
    4 => '046',
    5 => '135',
    6 => '134',
    7 => '166',
    8 => '144',
    9 => '145',
    a => '142',
    b => '034',
    c => '173',
    d => '054',
    e => '133',
    f => '137',
);

# traverse $s and append to array $r
foreach (str_split(strtolower($s)) as $c) {
    $r[0].=$d[$m[$c][0]];
    $r[1].=$d[$m[$c][1]];
    $r[2].=$d[$m[$c][2]];
}

# echo $r
echo implode("\n",$r);

最適化:

  • 配列は動的に生成されますstr_split()
  • 両方のアレイが 1 つに結合されます
  • 文字は数値的にマッピングされますhexdec()
于 2009-09-14T23:06:52.133 に答える
0

JavaScript、309 304 バイト。

String/Array にプロトタイプ関数が追加されていないことを要求します。

function d(b){r="";o='î$º¶tÖÞ¤þöü^Ê>ÚØ'.split("");p=b.split(r);a=[" 0 ",
"132","465"];c="036";for(k in a){for(var e in p)for(var f in a[k])r+=(U=
a[k][f])==" "?" ":(y=((Q=o[parseInt(p[e],16)].charCodeAt().toString(2))
.length==6?"00"+Q:Q.length==7?0+Q:Q)[U])==0?" ":c.indexOf(U)>-1?"_":"|";
r+="\n"}return r}

"テスト ケース (最初に文字列をマークすることによる書式設定:

d("0123456789abcdef");

" _     _  _     _  _  _  _  _  _     _     _  _ 
| |  | _| _||_||_ |_   ||_||_||_||_ |   _||_ |_ 
|_|  ||_  _|  | _||_|  ||_| _|| ||_||_ |_||_ |  "
于 2011-03-19T18:59:44.970 に答える