Kết xuất kiểu đồng hồ kỹ thuật số


28

Viết chương trình ngắn nhất sẽ lấy một chuỗi số (có độ dài tối thiểu 20 chiều) làm đầu vào và hiển thị đầu ra bằng cách sử dụng các số kiểu đồng hồ kỹ thuật số tiêu chuẩn. Ví dụ cho đầu vào 81, một giải pháp với đầu ra ascii sẽ cung cấp:

 _
|_|  |
|_|  |

Đầu ra đồ họa cũng được chấp nhận, nếu nó giúp.


bất kỳ giới hạn trên đối với "lấy một chuỗi số làm đầu vào"?
Verman Aman ZeeK

Hmm, giả sử một hàng trên màn hình cột 80 (20) là đủ tốt .
mootinator


Câu trả lời:


6

APL (Dyalog) (45)

{3 3⍴' _|'[1+⍵⊤⍨9⍴3]}¨⎕UCS'ા8धगɯે૙ࣃଏ૽'[1+⍎¨⍞]

Chuỗi, ા8धगɯે૙ࣃଏ૽là các ký tự unicode 2750 56 2343 2327 623 2759 2777 2243 2831 2813(tuy nhiên, bạn sẽ có thể chỉ cần sao chép và dán nó). Họ mã hóa các con số. Chương trình đọc một dòng từ bàn phím.

Giải trình:

  • 1+⍎¨⍞: đọc một dòng từ bàn phím, phân tích từng ký tự dưới dạng một chữ số, sau đó thêm 1 vào mỗi số (các mảng APL được dựa trên 1 theo mặc định).
  • ⎕UCS'ા8धगɯે૙ࣃଏ૽'[... ]: Chọn các ký tự thuộc các chữ số của các số bạn đã nhập và tìm kiếm các giá trị Unicode.
  • {... : cho mỗi giá trị này, hãy làm:
  • 1+⍵⊤⍨9⍴3: lấy 9 chữ số cơ sở 3 đầu tiên từ giá trị như được biểu thị trong cơ sở 3 và thêm 1 (vì các mảng ar dựa trên 1).
  • ' _|'[... ]: chọn một khoảng trắng, đường ngang hoặc đường dọc tùy thuộc vào các chữ số này
  • 3 3⍴: định dạng dưới dạng hộp 3 x 3.

36

Chức năng

Không thực sự là một ngôn ngữ phù hợp để chơi gôn ... nhưng bất kể, tôi đã cố gắng giữ kích thước mã nhỏ nhất có thể - một thách thức hoàn toàn khác so với các ngôn ngữ thông thường của các nhà báo. Đây là 1555 ký tự hoặc 3110 byte (nếu được mã hóa dưới dạng UTF-16; UTF-8 lớn hơn).

Đây là một ảnh chụp màn hình của chương trình đang chạy. Nó thật sự có hiệu quả :)

Vì điều này trông xấu trong StackExchange do khoảng cách dòng bổ sung, hãy xem xét việc chạy đoạn mã sau trong bảng điều khiển JavaScript của trình duyệt của bạn để khắc phục điều đó: $('pre').css('line-height',1)

     ╓─╖ ╔╗┌─╖   ┌─╖
     ║ʜ║ ║╟┤↔╟┐ ┌┤‼╟┐
     ╙┬╜ ╚╝╘═╝│ │╘╤╝│
╔═╗  ┌┴────┐  │┌┴╖ ┌┴╖
║0║ ┌┴─┐  ┌┴─┐└┤ʜ╟─┤·╟┐
╚╤╝┌┴╖┌┴╖┌┴╖┌┴╖╘╤╝ ╘╤╝│
┌┘┌┤·╟┤ɦ╟┤·╟┤?╟ │  ┌┴╖│
│ │╘╤╝╘╤╝╘╤╝╘╤╝ └──┤‼╟┘
│┌┴╖│ ┌┴╖┌┘╔═╧╗    ╘═╝
└┤?╟┘┌┤?╟┘┌╢10║    ┌─────────┐
 ╘╤╝ │╘╤╝┌┘╚══╝ ┌─┬┘╔══╗┌──╖┌┴╖ ╓─╖
  ┘  └───┘╔════╗│┌┴┐║21╟┤>>╟┤·╟┐║ɦ║
╔════════╗║1005╟┘└┬┘╚══╝╘═╤╝╘╤╝│╙┬╜        ┌─┐
║14073768║╚════╝ ┌┴╖ ┌─╖ ┌┴╖┌┴╖└─┴─────────┘┌┴╖
║7584800 ╟───────┤?╟─┤‼╟─┤ʜ╟┤·╟─────────────┤·╟┐╔═══════╗╔══╗
╚════════╝       ╘╤╝ ╘╤╝ ╘╤╝╘╤╝    ╔══╗┌─╖┌┐╘╤╝│║2097151║║21╟┐
 ╔═══════════════╗│   ┘   │  │     ║48╟┤−╟┤├─┤┌┘╚══╤════╝╚══╝│
 ║140737555464224╟┘  ┌────┘┌┬┘     ╚══╝╘╤╝└┘┌┘│╓─╖ │┌┐┌─╖┌─╖┌┴─╖
 ╚═══════════════╝   │ ┌───┘└─────────┐┌┴─╖ │┌┘║↔║ ├┤├┤‼╟┤↔╟┤>>║
┌────────────┐┌────┐┌┴╖│┌────────────┐├┤<<║ ││ ╙┬╜┌┘└┘╘╤╝╘═╝╘╤═╝
│   ╔══╗╔═══╗├┘╓─╖ └┤·╟┘│   ╔══╗╔═══╗├┘╘╤═╝ │└─┐└─┤╔═╗┌┴╖ ┌──┘
│   ║95║║892║│┌╢‡╟┐ ╘╤╝ │   ║95║║877║│ ┌┘╔══╧═╗│  │║0╟┤?╟┬┘
│   ╚═╤╝╚═╤═╝││╙─╜│  │  │   ╚═╤╝╚═╤═╝│╔╧╗║2097║│  │╚═╝╘╤╝│
│╔══╗┌┴╖┌┐│  ││┌─╖│ ┌┴╖ │╔══╗┌┴╖┌┐│  │║1║║151 ║│  └──────┘
│║32╟┤?╟┤├┤  │└┤‼╟┘┌┤‡║ │║32╟┤?╟┤├┤  │╚═╝╚════╝│
│╚══╝╘╤╝└┘└──┴┐╘╤╝ │╘╤╝ │╚╤═╝╘╤╝└┘└──┴┐      ┌─┘
│    ┌┴╖     ┌┴╖┌─╖│ │ ┌┴╖│  ┌┴╖     ┌┴╖ ┌─╖┌┴╖
│    │‼╟─────┤·╟┤‼╟┘ │┌┤·╟┘  │‼╟─────┤·╟─┤‼╟┤‡║
└┐┌┐ ╘╤╝     ╘╤╝╘╤╝  ││╘╤╝┌┐ ╘╤╝     ╘╤╝ ╘╤╝╘╤╝
 ├┤├┐┌┴╖╔══╗  └──┐┌┐ │└┐├─┤├┐┌┴╖╔══╗  ├──┐└  │
 │└┘└┤?╟╢32║╔═══╗├┤│┌┴╖││ └┘└┤?╟╢32║╔═╧═╗│┌┐┌┴╖╔══╗
╔╧══╗╘╤╝╚══╝║881╟┘│├┤?╟┘│    ╘╤╝╚══╝║325║└┤├┤?╟╢32║
║927║╔╧══╗  ╚═══╝ └┘╘╤╝╔╧═══╗╔╧══╗  ╚═══╝ └┘╘╤╝╚══╝
╚═══╝║124╟───────────┘ ║1019║║124╟───────────┘
     ╚═══╝             ╚════╝╚═══╝

Nó có thể nhỏ hơn nếu tôi không mắc lỗi do đầu ra quay lại phía trước; Tôi đã sửa nó bằng cách thêm một chức năng bổ sung để đảo ngược đầu vào. Nếu không tôi có lẽ sẽ phải viết lại tất cả.

Tôi cũng đã mắc một lỗi khác (hoán đổi các toán hạng trong hai lệnh gọi ) khiến nó cần phải khai báo hàm phụ , nhưng cái này quá nhỏ nên nó nằm gọn trong hàm chính và do đó không thêm bất kỳ ký tự nào!


8
Whoa, trông thật tuyệt. Không chỉ là giải pháp, ngôn ngữ cũng vậy :-)
Joey

1
Điều đó thật tuyệt vời
Knerd

9

wxpython, nhiều nhân vật

import wx, wx.gizmos as g

class T(wx.Frame):
 def __init__(_):
  wx.Frame.__init__(_, None, size = (800, 60))
  l = g.LEDNumberCtrl(_, -1)
  l.Value = raw_input()

class M(wx.App):
 def OnInit(_):
  T().Show()
  return 1

M().MainLoop()

Kiểm tra

echo -n 81 | python codegolf-997-wx.py

nhập mô tả hình ảnh ở đây

ps: không phải là một mục nghiêm trọng, nhưng có vẻ như đầu ra đồ họa cũng được chấp nhận, vì vậy tôi chỉ thử nó :-)


+1 Vui mừng khi thấy điều này :).
mootinator

1
Cách quá nhiều bạn. : P
Bạn

8

Golfscript - 66 ký tự

"placeholder text for userscript which counts chars             ";

xxd: (sử dụng xxd -rđể hoàn nguyên)

0000000: 332c 7b3a 533b 2e7b 3438 2d22 5e70 285d  3,{:S;.{48-"^p(]
0000010: 7025 d3c4 4ab1 7d4a b8dc 4469 ce41 2222  p%..J.}J..Di.A""
0000020: f303 227b 6261 7365 7d2f 3330 2f53 3d33  .."{base}/30/S=3
0000030: 2f3d 7b22 5f20 7c22 3d7d 257d 256e 407d  /={"_ |"=}%}%n@}
0000040: 2f3b                                     /;

Điều này tuân theo hầu hết các câu trả lời khác ở chỗ không có khoảng trắng giữa các số và dấu cách được giữ nguyên. Một khoảng cách giữa các số có thể dễ dàng được thêm vào 1+trước đó {"_ |"=}%. Đóng gói thành một số cơ sở 3, và sau đó là cơ sở 243 thành một chuỗi.


Đủ công bằng. Tôi cập nhật câu hỏi để không bận tâm với không gian không cần thiết giữa các số.
mootinator

6
Tôi nghĩ rằng "giữ chỗ ..." là một chút khó hiểu.
Eelvex

8

J, 90 , 78 68 ký tự

[ cập nhật: sử dụng mã hóa unicode (1 byte):

,./(10 3 3$((90$3)#:256#.24x-~3&u:'%ė¨ÔW/~º»sy¡ăì<t÷²'){' _|'){~"./.Y
NB. utf characters are: 37 279 168 212 87 47 126 186 187 115 121 161 259 236 60 116 247 178

hoạt động như trước:]

,./(10 3 3$((90$3)#:1219424106940570763878862820444729939648410x){' _|'){~"./. '58321'
 _  _  _  _    
|_ |_| _| _|  |
 _||_| _||_   |

Khóa nằm trong mã hóa các chữ số dưới dạng số nguyên cơ số 3. Không, ví dụ là:

:
 _ 
| |
|_|

hoặc ' _ | ||_|', trở thành 010202212 3 = 2750.


Tôi có thể lưu 10 ký tự nếu J có số cơ sở chính xác cao 36. Có ai đề nghị không?
Eelvex

Tôi đang sử dụng nhị phân. Tôi tự hỏi nếu trinary sẽ tiết kiệm cho tôi một số đột quỵ?
luser droog

2
Xin chúc mừng vì đã có bài thứ 1000 trên codegolf.SE! ( http://codegolf.stackexchange.com/q/1000)
Doorknob

Hơn

5

Toán học 205 209 198 179

i = IntegerDigits; t = Thread; r = Rule;
z@n_ := Row@i@n /. t[r[Range[0, 9], Grid[Partition[ReplacePart[Characters@" _ |_||_|", 
t[r[#, ""]]], 3], Spacings -> 0] & 
/@ (i /@ {5, 24578, 49, 47, 278, 67, 6, 4578, , 78})]]

Sử dụng

z@1234567890

chữ số


5

JavaScript (145)

148 145

Vì JavaScript không thực sự có đầu vào / đầu ra tiêu chuẩn, nên nó được viết dưới dạng một hàm lấy một chuỗi và trả về đầu ra dưới dạng một chuỗi.

function r(n){for(i=o="",b=" |_\n|",L=n.length;i<3*L;)o+=b[(c="ǪĠòƲĸƚǚĢǺƺ".charCodeAt(n[i%L])>>(i++/L|0)*3)&1]+b[c&2]+b[c&4]+b[i%L?0:3];return o}

Cách nhau ra:

function r(n)
{
    for (i = o = "", b = " |_\n|", L = n.length;   i < 3*L;   )
        o += b [ (c = "ǪĠòƲĸƚǚĢǺƺ".charCodeAt(n[i%L]) >> (i++/L|0)*3) & 1 ] +
             b [ c&2 ] +
             b [ c&4 ] +
             b [ i%L ? 0 : 3 ];  // space or newline
    return o
}

Đây là cách nó hoạt động:

  • Mỗi hình dạng chữ số được mã hóa bằng ký tự Unicode gồm 9 bit.
  • Ba bit đầu tiên dành cho hàng đầu tiên, v.v.

  • Trong mỗi nhóm gồm ba bit, ký tự đầu tiên xác định xem ký tự đầu tiên là |không gian hay không gian, thứ hai là _không gian hoặc không gian thứ ba |và không gian thứ ba .

  • Ba bit được lấy ra như c&1, c&2c&4, sau đó được sử dụng như là chỉ số thành chuỗi b.

  • Ở mỗi lần lặp lại, i%Llà tọa độ x của tọa độ x, tức là chữ số trong đầu vàon

  • Ở mỗi lần lặp, i/Llà tọa độ y y, tức là hàng, nhưng chúng ta cần |0biến nó thành một số nguyên

  • Cuối cùng, khoảng trắng giữa các chữ số và dòng mới giữa các dòng cũng được lấy ra bằng cách lập chỉ mục vào b, sử dụng lại ký tự khoảng trắng vị trí 3 không được sử dụng trong chuỗi đó! :)


Unicode! BAH! ... tốt, nó ngắn hơn so với tôi. +1
luser droog

5

Hồng ngọc, 142

' _     _  _     _  _  _  _  _ 
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|'.lines{|l|puts x.chars.map{|i|l[i.to_i*3,3]}*''}

mong đợi đầu vào trong biến x. ví dụ:

x = '321'
#  _  _    
#  _| _|  |
#  _||_   |

x = '42'
#      _ 
#  |_| _|
#    ||_ 

ooooo. đẹp! ...
Luser droog

3

Golfscript - 97 ký tự

:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%

Sử dụng backtick để lưu char cho tất cả các chuỗi số (làm cách nào để chèn ký tự này ở định dạng mã?)
Nabb

@Nabb: Bạn không thể - StackExchange là tào lao như thế ...
Timwi

3

Windows PowerShell, 127

$i="$input"[0..99]
'☺ ☺☺ ☺☺☺☺☺','♠☻♥♥♦♣♣☻♦♦','♦☻♣♥☻♥♦☻♦♥'|%{$c=$_
""+($i|%{('···0·_·0··|0·_|0|_|0|_·0|·|'-split0)[$c[$_-48]]})}

Vì các chuỗi chứa một số ký tự khó viết, nên một hexdump để thuận tiện cho bạn:

000: 24 69 3D 22 24 69 6E 70 │ 75 74 22 5B 30 2E 2E 39  $i="$input"[0..9
010: 39 5D 0A 27 01 00 01 01 │ 00 01 01 01 01 01 27 2C  9]◙'☺ ☺☺ ☺☺☺☺☺',
020: 27 06 02 03 03 04 05 05 │ 02 04 04 27 2C 27 04 02  '♠☻♥♥♦♣♣☻♦♦','♦☻
030: 05 03 02 03 04 02 04 03 │ 27 7C 25 7B 24 63 3D 24  ♣♥☻♥♦☻♦♥'|%{$c=$
040: 5F 0A 22 22 2B 28 24 69 │ 7C 25 7B 28 27 20 20 20  _◙""+($i|%{('
050: 30 20 5F 20 30 20 20 7C │ 30 20 5F 7C 30 7C 5F 7C  0 _ 0  |0 _|0|_|
060: 30 7C 5F 20 30 7C 20 7C │ 27 2D 73 70 6C 69 74 30  0|_ 0| |'-split0
070: 29 5B 24 63 5B 24 5F 2D │ 34 38 5D 5D 7D 29 7D     )[$c[$_-48]]})}

5
Nhìn vào tất cả các mặt cười ..
Wang Đinh Vĩ

3

gForth, 186 175 ký tự

Phiên bản mới:

: s query parse-word bounds s" D@DD@DDDDDb`ddfFF`fff`Fd`df`f`" bounds do cr 2dup do i c@ '0 - j + c@ 3 0 do dup 3 and s"  _|" drop + 1 type 4 / loop drop loop 10 +loop bye ; s

Điều này thực sự phiền khi thoát (+3 ký tự) :). Đây là phiên bản dễ đọc hơn, nó có một số cách đóng gói bit để giảm kích thước LUT xuống 1/3, nhưng mã kết quả phức tạp hơn nên không tiết kiệm nhiều:

: 7s query parse-word bounds 
    s" D@DD@DDDDDb`ddfFF`fff`Fd`df`f`"
    bounds do 
        cr
        2dup do
            i c@ '0 - j + c@
            3 0 do
                dup 3 and
                s"  _|" drop + 1 type
                4 / \ shorter than an rshift
            loop
            drop
        loop
    10 +loop bye ;
7s

Phiên bản cũ:

: s query parse-word bounds s"  _     _  _     _  _  _  _  _ | |  | _| _||_||_ |_   ||_||_||_|  ||_  _|  | _||_|  ||_|  |" bounds do cr 2dup do i c@ '0 - 3 * j + 3 type loop 30 +loop ; s

Điều này làm cho ngăn xếp không cân bằng và không cần phải thoát trình thông dịch. Đây là một phiên bản dễ đọc hơn

: 7s query parse-word bounds 
    s"  _     _  _     _  _  _  _  _ | |  | _| _||_||_ |_   ||_||_||_|  ||_  _|  | _||_|  ||_|  |"
    bounds do 
        cr
        2dup do
            i c@ '0 - 3 * j + 3 type
        loop
    30 +loop 2drop bye ;
7s

2

Nhân vật C # 369

static void Main(string[] a){var b = new[] {123,72,61,109,78,103,119,73,127,111};var g = new[]{" _  ","|","_","| ","|","_","| "};a[0].ToCharArray().SelectMany((x,w)=>g.Select((y,i)=>new{s=((b[x-48]>>i&1)==1)?y:new String(' ',y.Length),j=i,v=w})).GroupBy(z=>(z.j+2)/3).ToList().ForEach(q=>Console.WriteLine(String.Join("", q.OrderBy(l=>l.v).Select(k=>k.s).ToArray())));}

Tôi có thể dễ dàng cắt một vài ký tự ra. Vấn đề là lạm dụng LINQ :)

Phiên bản khoảng trắng khác:

static void Main(string[] a)
{
    var b = new[] {123, 72, 61, 109, 78, 103, 119, 73, 127, 111};
    var g = new[] { " _  ", "|", "_", "| ", "|", "_", "| " };
    a[0].ToCharArray().SelectMany(
        (x,w)=>g.Select(
           (y,i)=>new{s=((b[x-48]>>i&1)==1)?y:new String(' ',y.Length),j=i,v=w}))
            .GroupBy(z=>(z.j+2)/3).ToList().ForEach(
            q=>Console.WriteLine(
                String.Join("", q.OrderBy(l=>l.v).Select(k=>k.s).ToArray())));
}

Trước hết, bạn cần một khai báo lớp và usings (409). Sau đó, có một số khoảng trắng không cần thiết có thể được loại bỏ (404). Nhiệm vụ nói rằng khoảng trắng giữa các chữ số sẽ bị bỏ qua (399).
Joey

Ừ, cảm ơn Tôi đã chỉnh sửa tác vụ vì không ai tuân theo quy tắc khoảng trắng ban đầu. Vui lòng chỉnh sửa câu trả lời nếu nó xúc phạm bạn, vì tôi không quan tâm.
mootinator

gchỉ được sử dụng một lần, vì vậy bạn có thể lưu 7 ký tự bằng cách nội tuyến.
Timwi

1
Trên thực tế bcũng chỉ được sử dụng một lần, vì vậy bạn cũng có thể nội tuyến nó. Ngoài ra, bạn có thể lưu rất nhiều ký tự nếu bạn thay đổi mảng số nguyên thành "{H=mNgwI\x7fo"hoặc thậm chí ngắn hơn nếu bạn thay đổi \x7fthành ký tự thực tế # 127 (không thể in được, nhưng được phép). Ý >>chí vẫn hoạt động vì có một chuyển đổi ngầm định từ charsang int.
Timwi

Ngoài ra, cả .ToCharArray().ToArray()đều dư thừa, bạn chỉ cần xóa chúng :)
Timwi

2

Giải pháp Java: 585 570 Chars

Tôi không nghĩ rằng tôi sẽ cố gắng chơi golf nữa trong Java ...

import java.util.*;
public class CG997{public static void main(String[]args){
short[][]lets=new short[][]{{0,1,3,2,0,4,2,1,4},{0,0,3,0,0,4,0,0,4},{0,1,3,0,1,
4,2,1,3},{0,1,3,0,1,4,0,1,4},{0,0,3,2,1,4,0,0,4},{0,1,3,2,1,3,0,1,4},{0,1,3,2,1
,3,2,1,4},{0,1,3,0,0,4,0,0,4},{0,1,3,2,1,4,2,1,4},{0,1,3,2,1,4,0,0,4}};
String[]syms=new String[]{" ","_","|","  ","| "};
String s=new Scanner(System.in).nextLine();
for(int o=0;o<3;o++){for(char c:s.toCharArray()){for(int i =0;i<3;i++)
System.out.print(syms[lets[Short.parseShort(c+"")][i+o*3]]);
}System.out.println();}}}

Phiên bản java của bạn tốt hơn / ngắn hơn so với của tôi :) btw! ... 6 trong biểu diễn đồng hồ kỹ thuật số có nắp (_) ở đầu hay không? Tôi đã bối rối sau khi bạn đầu ra!
Aman ZeeK Verma

Khi kiểm tra máy pha cà phê phía sau tôi, 6 chiếc phải có nắp. Tôi sẽ cập nhật giải pháp của tôi.
Mitch

2

Con trăn 218 180 176

b=map(int,raw_input());a=map(int,bin(914290166014670372457936330)[2:]);c=' |_';p=lambda k:''.join(c[a[9*n+k]]+c[2*a[9*n+1+k]]+c[a[9*n+2+k]]for n in b)+'\n';print p(6)+p(0)+p(3)

Với ngắt dòng:

b=map(int,raw_input())
a=map(int,bin(914290166014670372457936330)[2:])
p=lambda k:''.join(' |'[a[9*n+k]]+' _'[a[9*n+1+k]]+' |'[a[9*n+2+k]]for n in b)+'\n'
print p(6)+p(0)+p(3)

2

Bash, 11 ký tự

toilet "$i"

Có tôi biết, tôi đang gian lận.

Bạn cần phải có nhà vệ sinh được cài đặt.


1
Và có phông chữ mặc định được đặt thành một với 7 số hiển thị phân đoạn. figletcũng sẽ làm việc
Cướp

2

Java, 2.095

public class DigitalNumber {
    public static void main(String args[]){
        char[][] panel = new char[3][120]; //A 20 digit panel!
        int digXIndex = 0;int digYIndex = 0;
        for (int i=0;i<args[0].length(); i++){
            int dig=Integer.parseInt(""+args[0].charAt(i));
            panel[digXIndex][digYIndex]=32;   
            digYIndex++;
            if (dig!=1 && dig!=4)
                panel[digXIndex][digYIndex]='_';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
                panel[digXIndex][digYIndex]=32; 
            digYIndex=3*i;
            digXIndex++;
            if (dig!=1 && dig!=2 && dig!=3 && dig!=7)
                panel[digXIndex][digYIndex]='|';    
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=1 && dig!=0 && dig!=7)
                panel[digXIndex][digYIndex]='_';    
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=6 && dig!=5)
                panel[digXIndex][digYIndex]='|';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex=3*i;
            digXIndex++;
            if (dig!=6 && dig!=8 && dig!=2 && dig!=0)
                panel[digXIndex][digYIndex]=32;  
            else
                panel[digXIndex][digYIndex]='|';
            digYIndex++;
            if (dig!=7 && dig!=4 && dig!=1)
                panel[digXIndex][digYIndex]='_';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=2)
                panel[digXIndex][digYIndex]='|';  
            else
                panel[digXIndex][digYIndex]=32;
            digXIndex=0;
            digYIndex+=(i*3)+1;
        }       
        for (int i=0; i<3; i++){
            for (int j=0; j<120; j++)
                if (panel[i][j]!=0)
                System.out.print((char)(panel[i][j]));
                else
                    System.out.print("");
            System.out.println();
        }   
    }
}

MẪU I / O

java DigitalNumber 98765432109876543210
     _  _  _  _  _     _  _     _  _  _  _  _  _     _  _     _ 
    |_||_|  ||_ |_ |_| _| _|  || ||_||_|  ||_ |_ |_| _| _|  || |
     _||_|  ||_| _|  | _||_   ||_| _||_|  ||_| _|  | _||_   ||_|

5
Tôi nên bắt đầu ghét java :)
Aman ZeeK Verma

1
Java là tuyệt vời cho nhiều thứ, nhưng mã terse không phải là một trong số đó.
Jonathan M Davis

2
Chà, mã này thậm chí không được đánh gôn. Nó có thể ngắn hơn
Joey

Tôi đã đánh mã số của bạn một chút;)
Knerd

1

D: 295 Nhân vật

import std.stdio;void main(string[]a){string[3]o;foreach(c;a[1]){int n=cast(int)(c)-48;auto e=" ";o[0]~=n!=1&&n!=4?" _ ":"   ";o[1]~=!n||n>3&&n!=7?"|":e;o[1]~=n>1&&n!=7?"_":e;o[1]~=n<5||n>6?"|":e;o[2]~=!(n&1)&&n!=4?"|":e;o[2]~=!n||n>1&&n!=4&&n!=7?"_":e;o[2]~=n!=2?"|":e;}foreach(l;o)writeln(l);}

Dễ đọc hơn:

import std.stdio;

void main(string[] a)
{
    string[3] o;

    foreach(c; a[1])
    {
        int n = cast(int)(c) - 48;
        auto e = " ";

        o[0] ~= n != 1 && n != 4 ? " _ " : "   ";

        o[1] ~= !n || n > 3 && n != 7 ? "|" : e;
        o[1] ~= n > 1 && n != 7 ? "_" : e;
        o[1] ~= n < 5 || n > 6 ? "|" : e;

        o[2] ~= !(n&1) && n != 4 ? "|" : e;
        o[2] ~= !n || n > 1 && n != 4 && n != 7 ? "_" : e;
        o[2] ~= n != 2 ? "|" : e;
    }

    foreach(l; o)
        writeln(l);
}

1

Ocaml, 268

let t=function|'1'|'4'->"   "|_->" _ "let m=function|'0'->"| |"|'1'|'7'->"  |"|'2'|'3'->" _|"|_->"|_|"|'5'|'6'->"|_ "let b=function|'0'|'8'->"|_|"|'1'|'4'|'7'->"  |"|'2'->"|_ "|_->" _|"let f s=let g h=String.iter(fun c->print_string(h c))s;print_newline()ing t;g m;g b

Phiên bản dễ đọc

let t = function
  | '1'
  | '4' -> "   "
  | _ -> " _ "
let m = function
  | '0' -> "| |"
  | '1'
  | '7' -> "  |"
  | '2'
  | '3' -> " _|"
  | _ -> "|_|"
  | '5'
  | '6' -> "|_ "
let b = function
  | '0'
  | '8' -> "|_|"
  | '1'
  | '4'
  | '7' -> "  |"
  | '2' -> "|_ "
  | _ -> " _|"
let f s =
  let g h =
    String.iter (fun c -> print_string (h c)) s;
    print_newline () in
  g t;
  g m;
  g b

1

Perl (182 180)

#!perl -l
$_=<<7;
 _     _  _     _  _  _  _  _ 
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|
7
@b=map{[/(...)/g]}split/\n/;@d=split//,<>;for$p(@b){print map$p->[$_],@d}

đọc từ STDIN.

$ perl 7segment.pl 
1234567890987654321
    _  _     _  _  _  _  _  _  _  _  _  _  _     _  _     _ 
  | _| _||_||_ |_   ||_||_|| ||_||_|  ||_ |_ |_| _| _|  || |
  ||_  _|  | _||_|  ||_| _||_| _||_|  ||_| _|  | _||_   ||_|

1

Bản thảo (270) (248) (214)

Chỉnh sửa: Thay thế nhiều hơn. Xóa không gian giữa các chữ số.

Chỉnh sửa: Thậm chí nhiều thay thế. Vòng lặp chính bây giờ trông giống như những gì nó làm!

/F{forall}def[48<~HUp;::1ncBInp~>{1 index 1 add}F
pop/*{dup
2 idiv exch
2 mod
1 eq}/P{print}/#{( )P}/?{ifelse
P}/O{{( )}?}/|{*{(|)}O}/_{*{(_)}O}>>begin[[[[ARGUMENTS{{load
# _ #}F()=]2{{| _ |}F()=]}repeat]pop[[[[}F

Sử dụng tính năng xử lý đối số của ghostscript: gọi với gs -dNODISPLAY -- digit.ps 012 345 6789.


1

Delphi | | 453 (568 Với định dạng)

Thậm chí không đủ gần để giành chiến thắng nhưng thật vui khi làm ^. ^

const asc: array[0..9] of array[0..2] of string = ((' _ ','| |','|_|'),('   ','  |','  |'),(' _ ',' _|','|_ '),(' _ ',' _|',' _|'),('   ','|_|','  |'),(' _ ','|_ ',' _|'),(' _ ','|_ ','|_|'),(' _ ','  |','  |'),(' _ ','|_|','|_|'),(' _ ','|_|',' _|'));var s,l:string;x,i:integer;begin Readln(s);s:=StringReplace(s,' ','',[rfReplaceAll]);for I := 0 to 2 do begin l:='';for x := 1 to length(s) do l := l + asc[StrToInt(s[x])][i];writeln(l);end;readln;end.  

Với định dạng

const
asc: array[0..9] of array[0..2] of string = (
  (' _ ','| |','|_|'),
  ('   ','  |','  |'),
  (' _ ',' _|','|_ '),
  (' _ ',' _|',' _|'),
  ('   ','|_|','  |'),
  (' _ ','|_ ',' _|'),
  (' _ ','|_ ','|_|'),
  (' _ ','  |','  |'),
  (' _ ','|_|','|_|'),
  (' _ ','|_|',' _|'));
var
s,l:string;
x,i:integer;
begin
    Readln(s);
    s:=StringReplace(s,' ','',[rfReplaceAll]);
    for I := 0 to 2 do
    begin
      l:='';
      for x := 1 to length(s) do
        l := l + asc[StrToInt(s[x])][i];
      writeln(l);
    end;
    readln

kết thúc.


1

PHP, 140 136 133 131 129 128 byte

Tôi có thể tiết kiệm thêm 5 7 với ascii mở rộng: mỗi cái cho "| _"và ngắt dòng, ba cho ~"z/]{4lno~|"(phủ định bitwise sẽ biến mọi thứ thành các ký tự ascii mở rộng = không có ký tự đặc biệt và PHP không cần trích dẫn ở đó), hai cho -1(nó chỉ có ở đó để giữ bản đồ trong ascii tiêu chuẩn). Nhưng để dễ đọc và tương thích, tôi ở lại với ascii tiêu chuẩn.

for(;""<$c=$argv[1][$i++];)for($n=753754680;$n>>=3;)$r[$p++%3].="| _"[ord(~"z/]{4lno~|"[$c])-1>>$n%8&1?:$n&2];echo join("
",$r);

bitmap

  • Hãy LEDS _, |_|, |_|như bit -6-, 024, 135(bit số & 2 là 0 cho đèn LED dọc)
  • Tạo bitmap cho các số 0..9: [123,48,94,124,53,109,111,112,127,125]
  • Giảm 1 để làm cho tất cả các mã ascii có thể in -> "z/]{4lno~|"
  • phủ định -> ~"z/]{4lno~|"(cho phép tốc ký nhanh trong lựa chọn nhân vật)

bản mẫu

  • sử dụng 7cho các không gian -> 767, 024,135
  • tập hợp lại bởi các cột thay vì hàng -> 701, 623, 745(làm cho $p=0lỗi thời)
  • đảo ngược -> 547326107(đọc bản đồ từ phải sang trái; cho phép lặp số học)
  • nối số 0 -> 5473261070(cho phép kết hợp dịch chuyển với kiểm tra trong đầu vòng lặp)
  • đọc số bát phân, chuyển thành số thập phân -> 753754680(ngắn hơn hai byte: một chữ số và tiền tố)

phá vỡ

for(;""<$c=$argv[1][$i++];) // loop through input characters
    for($n=753754680;$n>>=3;)   // loop through template
        $r[$p++%3].="| _"[          // append character to row $p%3:
            ord(~"z/]{4lno~|"[$c])-1// decode bitmap
                >>$n%8&1            // test bit $n%8 (always 1 for bit 7)
            ?                       // if set: 1 (space)
            :$n&2                   // else: 2 (underscore) for bits 2,3,6; 0 (pipe) else
        ];
echo join("\n",$r);         // print result

+16 byte cho hệ thập lục phân:ord(~"z/]{4lno~|v.J=NF"[hexdec($c)])-1
Titus

1

Java 8, 280 byte

interface M{static void main(String[]a){String x="",y=x,z=x;for(int c:a[0].getBytes()){c-=48;x+=" "+(c==4|c==1?" ":"_")+" ";y+=(c==7|c>0&c<4?" ":"|")+(c==7|c<2?" ":"_")+(c>4&c<7?" ":"|");z+=(c%2<1&c!=4?"|":" ")+(c%3==1?" ":"_")+(c==2?" ":"|");}System.out.print(x+"\n"+y+"\n"+z);}}

Giải trình:

Hãy thử nó ở đây.

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    String x="",                 //   String for row 1, starting empty
           y=x,                  //   String for row 2, starting empty
           z=x;                  //   String for row 3, starting empty
    for(int c:a[0].getBytes()){  //   Loop over the bytes of the input
      c-=48;                     //    Convert the byte to integer
      x+=                        //    Append to row 1:
         " "                     //     a space
         +(c==4|c==1?            //     +If the digit is a 1 or 4:
            " "                  //       Append a space
           :                     //      Else:
            "_")                 //       Append an underscore
         +" ";                   //     + another space
      y+=                        //    Append to row 2:
         (c==7|c>0&c<4?          //      If the digit is 1, 2, 3, or 7:
           " "                   //       Append a space
          :                      //      Else:
           "|")                  //       Append a pipe
         +(c==7|c<2?             //     +If the digit is 0, 1, or 7:
            " "                  //       Append a space
           :                     //      Else:
            "_")                 //       Append an underscore
         +(c>4&c<7?              //     +If the digit is 5 or 6:
            " "                  //       Append a space
           :                     //      Else:
            "|");                //       Append a pipe
      z+=                        //    Append to row 3:
         (c%2<1&c!=4?            //      If the digit is 0, 2, 6 or 8:
           "|"                   //       Append a pipe
          :                      //      Else:
           " ")                  //       Append a space
          +(c%3==1?              //     +If the digit is 1, 4, or 7:
             " "                 //       Append a space
            :                    //      Else:
             "_")                //       Append a pipe
          +(c==2?                //     +If the digit is 2:
             " "                 //       Append a space
            :                    //      Else:
             "|");               //       Append a pipe
    }                            //   End of loop
    System.out.print(x+"\n"+y+"\n"+z);
                                 //   Print the three rows
  }                              //  End of main-method
}                                // End of class

Như chức năng này sẽ là 218 byte thay thế.


0

Python, 227 ký tự

a="   ";b=" _ ";c="|_|";d="| |";e="|  ";f="  |";g="|_ ";h=" _|"
z=[[b,d,c],[a,f,f],[b,h,g],[b,h,h],[a,c,f],[b,g,h],[b,g,c],[b,f,f],[b,c,c],[b,c,h]]
x=map(int,raw_input())
for i in range(3):
 for j in x:
  print z[j][i],
 print

Đơn giản và dễ hiểu.


0

Perl, 145 ký tự

$i=<>;for$s(6,3,0){for($i=~/./g){$v=(175,9,158,155,57,179,183,137,191,187)[$_]>>$s;$o.=($v&4?'|':$").($v&2?'_':$").($v&1?'|':$")}$o.="
"}print$o

Ung dung:

# Read STDIN
$i = <>;
# Amount to bit shift later
for $s (6,3,0)
{
  # For each character C from STDIN
  for ($i =~ /./g)
  {
    # Get the Cth array index, bit shifted right by $s
    $v = (175, 9, 158, 155, 57, 179, 183, 137, 191, 187)[$_]>>$s;
    # Concatenate each character if the bitwise masked value says it should be there
    $o .= ($v & 4 ? '|' : $") .
          ($v & 2 ? '_' : $") .
          ($v & 1 ? '|' : $");
  }
  # Concatenate a newline
  $o .= "
";
}
# Print the result
print $o;

0

Python 3.4.3 - 1514 858 byte

Sự cám dỗ để giải quyết điều này là quá tuyệt vời để không đăng ký và trả lời = P

Tôi là một người mới với Python, vì vậy tôi đã định dạng chương trình của mình đẹp và gọn gàng (hoặc ít nhất là tôi đã làm). Cải tiến được đánh giá rất cao!

import sys;l1,l2,l3,l4,l5="";num=input()
for c in num:
    if c=="1":
        l1+=" oo  ";l2+="  o  ";l3+="  o  ";l4+="  o  ";l5+="oooo "
    if c=="2":
        l1+="oooo ";l2+="   o ";l3+="oooo ";l4+="o    ";l5+="oooo "
    if c=="3":
        l1+="oooo ";l2+="   o ";l3+=" ooo ";l4+="   o ";l5+="oooo "
    if c=="4":
        l1+="o  o ";l2+="o  o ";l3+="oooo ";l4+="   o ";l5+="   o "
    if c=="5":
        l1+="oooo ";l2+="o    ";l3+="oooo ";l4+="   o ";l5+="oooo "
    if c=="6":
        l1+="oooo ";l2+="o    ";l3+="oooo ";l4+="o  o ";l5+="oooo "
    if c=="7":
        l1+="oooo ";l2+="   o ";l3+="   o ";l4+="   o ";l5+="   o "
    if c=="8":
        l1+="oooo ";l2+="o  o ";l3+="oooo ";l4+="o  o ";l5+="oooo "
    if c=="9":
        l1+="oooo ";l2+="o  o ";l3+="oooo ";l4+="   o ";l5+="oooo "
    if c=="0":
        l1+="oooo ";l2+="o  o ";l3+="o  o ";l4+="o  o ";l5+="oooo "
print(l1+"\n"+l2+"\n"+l3+"\n"+l4+"\n"+l5)

Chỉnh sửa: Tên biến rút ngắn, được sử dụng; để rút ngắn, chỉ một không gian ở cuối các số đầu ra, tất cả các biến được xác định cùng một lúc.

Các dòng mới là 2 byte (CRLF) và tôi đã sử dụng các tab thay vì 4 khoảng trắng.


2
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Vì đây là một thử thách chơi gôn mã, bạn sẽ muốn làm cho mã của mình càng ngắn càng tốt. Những lời khuyên này có thể hữu ích cho việc chơi golf.
Alex A.

"Tôi đã sử dụng các tab thay vì 4 khoảng trắng" Tôi bối rối. Tại sao bạn không sử dụng tab? ;)
Cuộc đua nhẹ nhàng với Monica

0

SmileBASIC, 216 byte

?INPUT N$DIM A[14]COPY A,@A@A
DATA 1,0,0,1,3,1,1,3,0,4,3,4,1,6FOR D=0 TO LEN(N$)-1X=ASC("w$]m.k{%\o"[VAL(N$[D])])FOR I=0TO 6T=I*2IF X<<31THEN GBOX A[T]+D*5,A[T+1],A[T]+D*5+!(I MOD 3),A[T+1]+!!(I MOD 3)
X=X/2NEXT
NEXT

Sử dụng đồ họa thay vì văn bản, vì nó có thể ngắn hơn.

Giải trình:

PRINT 'so the input and output don't overlap
INPUT NUMBER$ 'get number
DIM PTS[7*2] 'locations of segments
COPY PTS,@PTDATA 'copy data into array
@PTDATA
DATA 1,0,0,1,3,1,1,3,0,4,3,4,1,6 'stored as x,y,x,y,...
FOR DIGIT=0 TO LEN(NUMBER$)-1
 NUM=ASC("w$]m.k{%\o"[VAL(NUMBER$[DIGIT])]) 'get digit data. That data string doesn't have any non-ASCII characters, except \ which is 127 in SB.
 FOR I=0 TO 7-1 'draw each segment
  T=I*2 'position of point in array
  IF X AND 1 THEN GLINE PTS[T]+DIGIT*5,PTS[T+1],PTS[T]+DIGIT*5+!(I MOD 3),PTS[T+1]+!!(I MOD 3) 'draw segment. I MOD 3 determines whether it's horizontal or vertical.
  X=X>>1 'shift to next bit
 NEXT
NEXT

0

C ++, 230 229 225 223 218 207 204 198 byte

#import<iostream>
#define d for(auto
std::string v[3],t,g="|_| =2$0^262\'032;2$2?272";main(){std::cin>>t;d i:t)d j:{0,1,2})d k:{0,1,2})v[k]+=g[g[i*2-92+!k]>>j+k/2*3&1?j:3];d j:v)std::cout<<j<<'\n';}

Đọc từ stdin và đầu ra cho thiết bị xuất chuẩn.

Giải trình:

#import<iostream>                // string inside

std::string v[3], t, g="|_| "    // symbol on different horizontal position
      "=2$0^262\'032;2$2?272";   // space(0) or not(1) for each number and position
                                 // binary representation, last 6 bits is used
                                 // even positions are for row 1, 2; odds are for row 0

main() {
    std::cin>>t;                 // input
    for (auto i:t)               // for each character
        for (auto j:{0,1,2})     // for each horizontal position
            for (auto k:{0,1,2}) // for each vertical position
                v[k]+=g[         // use first four chars only
                    g[i*2-92     // i*2-96 is number*2, +4 to skip first four
                        +!k]     // row 0 uses another character
                    >>j+k/2*3    // (k==2?3:0)+j, the expected bit
                    &1           // extract the bit
                    ?j:3         // space or not space
                ];

    for (auto j:v) std::cout<<j<<'\n'; // output
}

0

Powershell, 114 byte

param($a)6,3,0|%{$l=$_
-join($a|% t*y|%{('   0 _ 0 _|0|_ 0| |0  |0|_|'-split0)[(+('f-SR5Z^mvr'["$_"])-shr$l)%8]})}

Kịch bản thử nghiệm:

$f = {

param($a)6,3,0|%{$l=$_
-join($a|% t*y|%{('   0 _ 0 _|0|_ 0| |0  |0|_|'-split0)[(+('f-SR5Z^mvr'["$_"])-shr$l)%8]})}

}

&$f "1234567890"
&$f "81"

Đầu ra:

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

Ý chính:

Mỗi số kiểu đồng hồ kỹ thuật số tiêu chuẩn chứa 3 dòng. Hơn nữa, dòng đầu tiên chỉ chứa 2 tùy chọn. Tổng cộng có 6 lựa chọn. Do đó, 7 bit là đủ để mã hóa từng chữ số.

line str=@('   ', ' _ ', ' _|', '|_ ', '| |', '  |', '|_|')

#    line str    binary       dec    ASCII
-    --------    ---------    ---    -----
0 -> 1 
     4 
     6        -> 1 100 110 -> 102 -> 'f'

1 -> 0
     5
     5        -> 0 101 101 ->  45 -> '-'

...

8 -> 1
     6
     6        -> 1 110 110 -> 118 -> 'v'

9 -> 1
     6
     2        -> 1 110 010 -> 114 -> 'r'

Vì vậy, chuỗi f-SR5Z^mvrmã hóa tất cả các phân đoạn cho tất cả các số kiểu đồng hồ kỹ thuật số tiêu chuẩn.

Lưu ý: Thứ tự của line strđã được chọn đặc biệt sao cho tất cả các mã nằm trong khoảng 32..126.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.