正确的数字加法得到很多的8


16

受到这个问题的启发,这个问题进一步启发了这个问题,编写了一个程序,该程序采用两个整数并将其以独特的方式相加,方法是对用于在7段显示器中显示它们的段执行“或”运算。供参考,数字以以下方式表示:

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

请注意,1使用右侧的两个段,而不是左侧的两个段。有两种可以用这种方式产生的特殊字符,它们不是数字。请参阅以下附加表:

  | 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

有用的意见:

  • 任何数字加自身等于自身
  • 8加任何数字等于8
  • 2加1、3或7等于字母“ a”(必须为小写)
  • 4加7等于“ q”或“ Q”,由您选择
  • 数字应右对齐,因此数字应从右向左添加。如果一个数字比另一个数字多,则开头的多余数字应保持不变。除非数字正好为0,否则没有前导0。
  • 所有数字均为0或更大。您无需处理“-”号。(主要是因为'-'和'1'或'7'的总和不适合。)

您的程序应接受2个您选择的任何格式的整数,并以这种方式计算时输出包含其“和”的字符串。这是代码高尔夫球,因此您的程序应尽可能小。

例子:

  • 输入:12345、123。输出:12389
  • 输入:88888、42。输出:88888
  • 输入:0、23。输出:28
  • 输入:120、240。输出:a80
  • 输入:270、42。输出:2Q8(或2q8)
  • 输入:1234567890、1234567890。输出:1234567890

4
有趣的挑战,但这可能会使用一些测试用例,以便人们可以验证其答案。
AdmBorkBork,2016年

3
不应该Q是小写吗?实际形状看起来像q,而不是一个Q
路易斯Mendo

输入的整数将是个位数,有限位数还是无限制?
Digital Trauma

1
@LuisMendo-我想它可以任意选择。我将由您自行决定。在a绝对应该情况下,虽然低,因为A看起来完全不同。
Darrel Hoffman

2
@Adám-是的,我考虑过这一点,但认为并不是每个人都可以使用他们选择的高尔夫语言访问Unicode字符,因此指望他们能够处理这是不公平的。
Darrel Hoffman

Answers:


7

Bash +通用Linux实用程序,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

请注意^?,源中的in应该替换为ASCII 0x7f字符。

该字符串s是每个7段数字0-9, a, Q,每个段对应于ASCII字符的一位。

h()函数将输入数字从十进制转换为所指定的编码s,然后将结果作为原始十六进制字符串输出。

OR使用常规bash运算将两个所得的原始十六进制字符串合在一起,然后通过dcP命令作为字节流。然后将此字节流转译回十进制+ a + Q并输出。

还要注意,<<<在函数中使用bash herestring构造时,会将h()换行符隐式附加到重定向的字符串之后。没关系-只需将其翻译为0x0a每个十六进制字符串的末尾即可;当两个十六进制数字OR一起被ed时,结果仍在0x0a最后一个字符中,该字符不会被音译,因此简单地转换回换行符,并在结果后输出。

测试输出:

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

1
我将继续授予该奖项,因为似乎没有人再尝试过了。
Darrel Hoffman

感谢Darrel-这是一个有趣而有趣的挑战。如果您想获得更多答案,可以考虑在上面悬赏。
Digital Trauma

不,我在这个网站上没有足够的代表来花所有的钱在赏金上。(由于我没有运行Linux,所以我什至无法测试它,我只是给社区带来了疑问的好处。)我只是基于另一个问题,一时兴起。
Darrel Hoffman

3

Python 2,155个字节

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]

更换 DEL字符(0x7F的)。

调用f("12345", "123")打印12389


%13技巧适用于三组值。显然,您选择的字符集不超过40个,但是对于我的JavaScript翻译,我选择了最短的字符集。第三组本来是JavaScript中最长的111,5,118,117,29,121,123,37,127,125
尼尔

2

的JavaScript(ES6),158个 144字节

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

通过无耻地偷@Lynn的%13把戏节省了14个字节。

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字节

这是很长的时间...但是反正这是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;}

完整程序,无代码

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

所有输出(全部重复一次)

12389
88888
23
a80
2q8
1234567890

保证不会使用golflangs解决此问题(它的成本可能不超过50个字节)
Leaky Nun

我从来没有说过人们不能为此使用高尔夫语言-老实说,我还没有人感到惊讶。无论如何,即使没有它,您也可以使用Java 8 lambda保存一些字节?
达雷尔·霍夫曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.