数字を追加して8をたくさん取得する正しい方法


16

触発され、この問題をさらに触発されたこの1、7セグメントディスプレイでそれらを表示するために使用されるセグメントにOR演算を行うことにより、2つの整数をとり、ユニークな方法でそれらを加算するプログラムを書きます。参考のため、数字は次のように表されます。

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

1は左側ではなく右側の2つのセグメントを使用することに注意してください。この方法で生成できる2つの特殊文字は、数字ではありません。以下の追加表を参照してください。

  | 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

3
Q小文字ではいけませんか?実際の形状は、qむしろQ
ルイスメンドー

入力整数は1桁、制限された桁数、または無制限ですか?
デジタル外傷

1
@LuisMendo-どちらにでも行くことができると思います。それはあなたの裁量にお任せします。a確か以来、しかしケース低くなければならA完全に異なるルックス。
ダレルホフマン

2
@Adám-ええ、私はそれについて考えましたが、誰もが選択したゴルフ言語のユニコード文字にアクセスできるとは思わなかったので、それらを扱うことを期待するのは不公平でしょう。
ダレルホフマン

回答:


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

^?ソースのをASCII 0x7f文字に置き換える必要があることに注意してください。

文字列s0-9, a, Q、ASCII文字のビットに対応する各セグメントでエンコードされた7セグメントの数字です。

このh()関数は、入力数値を10進数からで指定されたエンコードに変換しs、結果を生の16進文字列として出力します。

結果の2つの生の16進文字列はOR、通常のbash演算を使用して一緒にedされ、その後、dcPコマンドによってバイトストリームとして出力されます。このバイトストリームは、10進数+ a + Qに変換されて出力されます。

また<<<、関数でbash herestringコンストラクトを使用するh()と、リダイレクトされた文字列に暗黙的に改行が追加されることに注意してください。これは重要ではありません- 0x0a各16進文字列の最後に単純に変換されます。2つの16進数が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-楽しくて面白いチャレンジでした。さらに回答が必要な場合は、賞金を支払うことを検討してください。
デジタル外傷

いや、私はこのサイトで十分な担当者がいないので、すべてを報奨金に費やしています。(Linuxを実行していないので、これをテストすることさえできません。コミュニティに疑いの恩恵を与えているだけです。)とにかく別の質問に基づいて気まぐれにこれを投げただけです。
ダレルホフマン

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

printsを呼び出しf("12345", "123")ます12389


この%13トリックが機能する値には3つのセットがあります。明らかに、40未満の文字が含まれていないセットに行きましたが、JavaScriptの翻訳では、最短のセットを選択しました。3番目のセットは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]));
        }
    }
}

すべての出力(すべて1回複製)

12389
88888
23
a80
2q8
1234567890

この問題を解決するためにgolflangsを使用しないことを約束します(おそらく50バイト以下の費用がかかります)
Leaky Nun

私は人々これにゴルフ言語を使用できないとは決して言いませんでした。とにかく、それなしでも、おそらくJava 8ラムダを使用していくつかのバイトを節約できますか?
ダレルホフマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.