Cách chính xác để thêm số để nhận được nhiều số 8


16

Lấy cảm hứng từ câu hỏi này được lấy cảm hứng từ câu hỏi này , hãy viết một chương trình lấy hai số nguyên và thêm chúng theo cách duy nhất, bằng cách thực hiện thao tác OR trên các phân đoạn được sử dụng để hiển thị chúng trong màn hình 7 đoạn. Để tham khảo, các chữ số được biểu diễn theo cách sau:

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

Lưu ý rằng 1 sử dụng hai phân đoạn bên phải, không phải bên trái. Có hai ký tự đặc biệt có thể được tạo ra theo cách này không phải là số. Xem bảng bổ sung dưới đây:

  | 0 1 2 3 4 5 6 7 8 9
--+--------------------
0 | 0 0 8 8 8 8 8 0 8 8
1 | 0 1 a 3 4 9 8 7 8 9
2 | 8 a 2 a 8 8 8 a 8 8
3 | 8 3 a 3 9 9 8 3 8 9
4 | 8 4 8 9 4 9 8 Q 8 9
5 | 8 9 8 9 9 5 6 9 8 9
6 | 8 8 8 8 8 6 6 8 8 8
7 | 0 7 a 3 Q 9 8 7 8 9
8 | 8 8 8 8 8 8 8 8 8 8
9 | 8 9 8 9 9 9 8 9 8 9

Những quan sát hữu ích:

  • Bất kỳ chữ số nào cộng với chính nó đều bằng chính nó
  • 8 cộng với bất kỳ chữ số nào bằng 8
  • 2 cộng 1, 3 hoặc 7 bằng chữ 'a' (phải viết thường)
  • 4 cộng 7 bằng 'q' hoặc 'Q', lựa chọn của bạn
  • Các số phải được căn phải, vì vậy các chữ số nên được thêm từ phải sang trái. Nếu một số có nhiều chữ số hơn số kia, các chữ số phụ ở đầu sẽ không thay đổi. Không có số 0 đứng đầu, trừ khi số chính xác là 0.
  • Tất cả các số sẽ là 0 hoặc lớn hơn. Bạn không cần phải xử lý dấu '-'. (Chủ yếu là vì không phù hợp với tổng số '-' và '1' hoặc '7'.)

Chương trình của bạn nên chấp nhận 2 số nguyên ở bất kỳ định dạng nào bạn chọn và xuất ra một chuỗi chứa "tổng" của chúng khi được tính theo cách này. Đây là môn đánh gôn, vì vậy chương trình của bạn nên càng nhỏ càng tốt.

Ví dụ:

  • Đầu vào: 12345, 123. Đầu ra: 12389
  • Đầu vào: 88888, 42. Đầu ra: 88888
  • Đầu vào: 0, 23. Đầu ra: 28
  • Đầu vào: 120, 240. Đầu ra: a80
  • Đầu vào: 270, 42. Đầu ra: 2Q8 (hoặc 2q8)
  • Đầu vào: 1234567890, 1234567890. Đầu ra: 1234567890

4
Thử thách thú vị, nhưng điều này có thể sử dụng một số trường hợp thử nghiệm để mọi người có thể xác nhận câu trả lời của họ.
admBorkBork

3
Không nên Qviết thường? Hình dạng thực tế trông giống như một qthay vìQ
Luis Mendo

Các số nguyên đầu vào sẽ là một chữ số, số chữ số giới hạn hoặc không giới hạn?
Chấn thương kỹ thuật số

1
@LuisMendo - Tôi cho rằng nó có thể đi một trong hai cách. Tôi sẽ để nó tùy ý bạn. Các achắc chắn sẽ thấp hơn trường hợp mặc dù, vì Angoại hình hoàn toàn khác nhau.
Darrel Hoffman

2
@ Adám - Vâng, tôi đã nghĩ về điều đó, nhưng hình dung không phải ai cũng có quyền truy cập vào các ký tự Unicode trong ngôn ngữ chơi gôn của họ, vì vậy sẽ không công bằng khi mong họ xử lý việc đó.
Darrel Hoffman

Câu trả lời:


7

Bash + Các tiện ích Linux phổ biến, 80

s=~0my3[_p^?{}s
h()(tr 0-9 $s<<<$1|xxd -p)
dc -e$[0x`h $1`|0x`h $2`]P|tr $s 0-9aQ

Lưu ý ^?trong nguồn nên được thay thế bằng ký tự ASCII 0x7f.

Chuỗi slà mỗi chữ số 7 đoạn 0-9, a, Qđược mã hóa với mỗi phân đoạn tương ứng với một chút của ký tự ASCII.

Các h()chức năng transliterates số đầu vào từ thập phân để mã hóa theo quy định của s, sau đó kết quả đầu ra kết quả như là một chuỗi hex thô.

Kết quả là hai chuỗi hex liệu được ORed cùng sử dụng số học bash thường xuyên, sau đó đầu ra bởi dc's Plệnh như một bytestream. Bytestream này sau đó được chuyển thành chữ thập phân + a + Q và đầu ra.

Cũng lưu ý rằng khi sử dụng <<<cấu trúc bash herestring trong chức năng, h()một dòng mới sẽ được gắn hoàn toàn vào chuỗi được chuyển hướng. Điều này không thành vấn đề - nó chỉ đơn giản được dịch sang 0x0acuối mỗi chuỗi hex; khi hai số hex được ORed với nhau, kết quả vẫn 0x0anằm trong char cuối cùng không được phiên âm và do đó chỉ đơn giản là chuyển trở lại một dòng mới xuất ra sau kết quả.

Đầu ra thử nghiệm:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 

1
Tôi sẽ tiếp tục và trao giải thưởng này vì dường như không ai còn thử cái này nữa.
Darrel Hoffman

Cảm ơn Darrel - Đó là một thử thách thú vị, vui vẻ. Nếu bạn muốn có nhiều câu trả lời hơn, bạn có thể cân nhắc đưa tiền thưởng vào nó.
Chấn thương kỹ thuật số

Không, tôi không có đủ đại diện trên trang này để chi tiêu tất cả cho tiền thưởng. (Tôi thậm chí không thể kiểm tra cái này vì tôi không chạy Linux, tôi chỉ mang đến cho cộng đồng lợi ích của sự nghi ngờ.) Tôi chỉ loại bỏ điều này với nhau dựa trên một câu hỏi khác.
Darrel Hoffman

3

Python 2, 155 byte

def f(a,b):exec"a=[ord('?(u|j^_,♥~'[int(c)])for c in a];a=max(len(b)-len(a),0)*[0]+a;a,b=b,a;"*2;print`['214567q3a980'[(c|d)%13]for c,d in zip(a,b)]`[2::5]

Thay thế bằng một DELký tự (0x7F).

Gọi f("12345", "123")in 12389.


Có ba bộ giá trị mà %13thủ thuật đó hoạt động. Rõ ràng là bạn đã chọn bộ không có ký tự dưới 40, nhưng với bản dịch JavaScript của tôi, tôi đã chọn bộ ngắn nhất. Bộ thứ ba là bộ JavaScript dài nhất 111,5,118,117,29,121,123,37,127,125.
Neil

2

JavaScript (ES6), 158 144 byte

f=(s,t)=>t[s.length]?f(t,s):s[t.length]?f(s,' '+t):s.replace(/./g,(c,i)=>"540q9361278a"[(a[c]|a[t[i]])%13],a=[119,20,47,31,92,91,123,22,127,95])

Đã lưu 14 byte bằng cách ăn cắp một cách đáng xấu hổ @ %13lừa của Lynn .

f=(s,t)=>t[s.length]?f(t,s):s[t.length]?f(s,' '+t):s.replace(/./g,(c,i)=>"540q9361278a"[(a[c]|a[t[i]])%13],a=[119,20,47,31,92,91,123,22,127,95])
;o.textContent=[...s="0123456789"].map(c=>f(c.repeat(10),s)).join`
`;
<pre id=o></pre>


1

Java, 170 byte

Cái này quá dài ... nhưng dù sao đây cũng là Java.

String A(int a,int b){String c="|HgmY=?h}oy",r="";for(;a>0|b>0;a/=10,b/=10)r="0123456789aq".charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0)))+r;return r;}

Chương trình đầy đủ, với mã không mã hóa

public class Q80716 {
    String A(int a,int b){String c="|HgmY=?h}oy",r="";for(;a>0|b>0;a/=10,b/=10)r="0123456789aq".charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0)))+r;return r;}
    String Add(int a,int b){
        String c = "|HgmY=?h}oy", d = "0123456789aq";
        String r = "";
        for(;a>0|b>0;a/=10,b/=10){
            r = d.charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0))) + r;
        }
        return r;
    }
    public static void main(String[]args){
        int[][] testcases = new int[][]{
            {12345,123},
            {88888,42},
            {0,23},
            {120,240},
            {270,42},
            {1234567890,1234567890}
        };
        for(int i=0;i<testcases.length;i++){
            System.out.println(new Q80716().Add(testcases[i][0],testcases[i][1]));
            System.out.println(new Q80716().A(testcases[i][0],testcases[i][1]));
        }
    }
}

Tất cả đầu ra (tất cả được nhân đôi một lần)

12389
88888
23
a80
2q8
1234567890

Tôi hứa rằng tôi sẽ không sử dụng golflang để giải quyết vấn đề này (có thể sẽ tốn không quá 50 byte)
Leaky Nun

Tôi chưa bao giờ nói mọi người không thể sử dụng ngôn ngữ golf cho việc này - tôi thực sự ngạc nhiên khi chưa có ai. Dù sao đi nữa, ngay cả khi không có điều đó, bạn có thể lưu một số byte bằng lambda Java 8?
Darrel Hoffman
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.