Richtige Methode zum Hinzufügen von Zahlen, um viele Achteln zu erhalten

16

Inspiriert von dieser Frage, die weiter von dieser inspiriert wurde , schreiben Sie ein Programm, das zwei Ganzzahlen verwendet und diese auf einzigartige Weise addiert, indem Sie eine ODER-Operation für die Segmente ausführen, die für die Anzeige in einer 7-Segment-Anzeige verwendet werden. Als Referenz werden die Ziffern folgendermaßen dargestellt:

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

Beachten Sie, dass die 1 die beiden Segmente rechts und nicht links verwendet. Es gibt zwei Sonderzeichen, die auf diese Weise erzeugt werden können und keine Zahlen sind. Siehe nachstehende Hinzufügungstabelle:

  | 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

Nützliche Beobachtungen:

  • Jede Ziffer plus ist gleich sich
  • 8 plus eine beliebige Ziffer entspricht 8
  • 2 plus 1, 3 oder 7 entspricht dem Buchstaben 'a' (muss klein geschrieben sein)
  • 4 plus 7 entspricht entweder "q" oder "Q", Ihre Wahl
  • Zahlen sollten rechtsbündig sein, daher sollten die Ziffern von rechts nach links addiert werden. Wenn eine Nummer mehr Ziffern als die andere enthält, sollten die zusätzlichen Ziffern am Anfang unverändert bleiben. Es gibt keine führenden 0en, es sei denn, die Zahl ist genau 0.
  • Alle Zahlen sind 0 oder höher. Sie müssen nicht mit einem '-' Zeichen umgehen. (Hauptsächlich, weil die Summe aus '-' und '1' oder '7' nicht passt.)

Ihr Programm sollte 2 Ganzzahlen in jedem von Ihnen gewählten Format akzeptieren und eine Zeichenfolge ausgeben, die deren "Summe" enthält, wenn Sie auf diese Weise berechnet werden. Das ist Code-Golf, also sollte Ihr Programm so klein wie möglich sein.

Beispiele:

  • Eingabe: 12345, 123. Ausgabe: 12389
  • Eingabe: 88888, 42. Ausgabe: 88888
  • Eingabe: 0, 23. Ausgabe: 28
  • Eingabe: 120, 240. Ausgabe: a80
  • Eingabe: 270, 42. Ausgabe: 2Q8 (oder 2q8)
  • Eingabe: 1234567890, 1234567890. Ausgabe: 1234567890
Darrel Hoffman
quelle
4
Interessante Herausforderung, aber dies könnte einige Testfälle nutzen, damit die Leute ihre Antworten validieren können.
AdmBorkBork
3
Sollte das Qnicht Kleinbuchstaben sein? Die tatsächliche Form sieht qeher wie einQ
Luis Mendo
Sind die eingegebenen Ganzzahlen einstellig, nur eine begrenzte Anzahl von Stellen oder unbegrenzt?
Digitales Trauma
1
@ LuisMendo - Ich nehme an, es könnte in beide Richtungen gehen. Das überlasse ich Ihrem Ermessen. Das asollte aber unbedingt Kleinbuchstaben sein, da Asieht das ganz anders aus.
Darrel Hoffman
2
@ Adám - Ja, ich habe darüber nachgedacht, aber es stellte sich heraus, dass nicht jeder Zugriff auf Unicode-Zeichen in der Golfsprache seiner Wahl hat. Es wäre also unfair, zu erwarten, dass sie damit umgehen.
Darrel Hoffman

Antworten:

7

Bash + Gemeinsame Linux-Dienstprogramme, 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

Beachten Sie, dass ^?in der Quelle das Zeichen 0x7f durch ein ASCII-Zeichen ersetzt werden sollte.

Die Saite s ist jeweils eine 7-Segment-Ziffer 0-9, a, Q, die mit jedem Segment codiert ist, das einem Bit eines ASCII-Zeichens entspricht.

Das h() Funktion setzt die eingegebene Zahl von dezimal in die von angegebene Kodierung um sund gibt das Ergebnis als rohen Hex-String aus.

Die beiden resultierenden rohen Hex-Zeichenfolgen sind OR mit regulärer Bash-Arithmetik zusammengefügt und dann mit dcdem PBefehl 's als Bytestream ausgegeben. Dieser Bytestream wird dann zurück in das Dezimalzeichen + a + Q transkribiert und ausgegeben.

Beachten Sie auch, dass bei Verwendung des <<<bash-Herestring-Konstrukts in function h()implizit eine neue Zeile an die umgeleitete Zeichenfolge angehängt wird. Das spielt keine Rolle - es wird einfach übersetzt0x0a am Ende jeder Hex-Zeichenfolge übersetzt. Wenn die beiden Hexadezimalzahlen ORzusammengefügt werden, befindet sich das Ergebnis immer noch 0x0aim letzten Zeichen, das nicht transliteriert wird, und wird daher einfach in eine neue Zeile zurückübersetzt, die nach dem Ergebnis ausgegeben wird.

Testausgang:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 
Digitales Trauma
quelle
1
Ich werde weitermachen und dies vergeben, da niemand mehr versucht, dies zu tun.
Darrel Hoffman
Danke Darrel - Es war eine lustige, interessante Herausforderung. Wenn Sie weitere Antworten wünschen, können Sie eine Kopfgeldprämie darauf setzen.
Digital Trauma
Nein, ich habe nicht genug Repräsentanten auf dieser Seite, um alles für Kopfgelder auszugeben. (Ich kann dieses nicht mal testen, da ich kein Linux verwende. Ich gebe der Community nur den Vorteil des Zweifels.) Ich habe es irgendwie aus einer Laune heraus zusammengeschmissen, basierend auf einer anderen Frage.
Darrel Hoffman
3

Python 2, 155 Bytes

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]

Ersetze das durch ein DELZeichen (0x7F).

Der Aufruf f("12345", "123")druckt 12389.

Lynn
quelle
Es gibt drei Wertesätze, für die dieser %13Trick funktioniert. Natürlich haben Sie sich für den Satz entschieden, der keine Zeichen unter 40 hatte, aber für meine JavaScript-Übersetzung habe ich den kürzesten Satz gewählt. Der dritte Satz ist der längste in JavaScript, wäre es gewesen 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])

14 Bytes durch schamlosen Diebstahl von @ Lynns %13Trick gerettet .

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>

Neil
quelle
1

Java, 170 Bytes

Das ist furchtbar lang ... aber das ist trotzdem 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;}

Volles Programm mit ungolfed Code

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

Alle Ausgaben (alle einmal dupliziert)

12389
88888
23
a80
2q8
1234567890
Undichte Nonne
quelle
Ich verspreche, dass ich nicht Golflangs verwenden werde, um dieses Problem zu lösen (es würde wahrscheinlich nicht mehr als 50 Bytes kosten)
Undichte Nonne
Ich habe nie gesagt, dass die Leute keine Golfsprachen dafür verwenden könnten - ich bin ehrlich gesagt überrascht, dass es noch niemand gibt. Wie auch immer, auch ohne das könnten Sie wahrscheinlich einige Bytes mit einem Java 8 Lambda sparen?
Darrel Hoffman