Prawidłowy sposób dodawania liczb, aby uzyskać dużo 8

16

Zainspirowany tym pytaniem, które zostało dalej zainspirowane tym , napisz program, który bierze dwie liczby całkowite i dodaje je w unikalny sposób, wykonując operację LUB na segmentach używanych do wyświetlania ich na wyświetlaczu 7-segmentowym. Dla odniesienia cyfry są reprezentowane w następujący sposób:

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

Zauważ, że 1 używa dwóch segmentów po prawej, a nie po lewej. W ten sposób można utworzyć dwa znaki specjalne, które nie są liczbami. Zobacz tabelę dodatków poniżej:

  | 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

Przydatne obserwacje:

  • Każda cyfra plus sama się równa
  • 8 plus dowolna cyfra równa się 8
  • 2 plus 1, 3 lub 7 to litera „a” (musi być pisana małymi literami)
  • 4 plus 7 równa się „q” lub „Q”, twój wybór
  • Liczby powinny być wyrównane do prawej, więc cyfry należy dodawać od prawej do lewej. Jeśli jedna liczba ma więcej cyfr niż druga, dodatkowe cyfry na początku powinny pozostać niezmienione. Nie ma wiodących zer, chyba że liczba wynosi dokładnie 0.
  • Wszystkie liczby będą wynosić 0 lub więcej. Nie musisz obsługiwać znaku „-”. (Głównie dlatego, że nie ma dobrego dopasowania do sumy „-” i „1” lub „7”.)

Twój program powinien zaakceptować 2 liczby całkowite w dowolnym wybranym formacie i wyprowadzić ciąg zawierający ich „sumę”, jeśli zostanie obliczony w ten sposób. To jest golf golfowy, więc twój program powinien być jak najmniejszy.

Przykłady:

  • Wejście: 12345, 123. Wyjście: 12389
  • Wejście: 88888, 42. Wyjście: 88888
  • Wejście: 0, 23. Wyjście: 28
  • Wejście: 120, 240. Wyjście: a80
  • Wejście: 270, 42. Wyjście: 2Q8 (lub 2q8)
  • Wejście: 1234567890, 1234567890. Wyjście: 1234567890
Darrel Hoffman
źródło
4
Ciekawe wyzwanie, ale przydałoby się kilka przypadków testowych, aby ludzie mogli zweryfikować swoje odpowiedzi.
AdmBorkBork
3
Czy nie powinno Qbyć małe litery? Rzeczywisty kształt wygląda qraczej niżQ
Luis Mendo
Czy wejściowe liczby całkowite będą jednocyfrowe, z ograniczoną liczbą cyfr czy bez ograniczeń?
Cyfrowa trauma
1
@LuisMendo - przypuszczam, że może pójść w obie strony. Pozostawiam to do uznania. aZdecydowanie powinien być niższy przypadek chociaż, ponieważ Awygląda zupełnie inaczej.
Darrel Hoffman
2
@ Adám - Tak, pomyślałem o tym, ale pomyślałem, że nie wszyscy mają dostęp do znaków Unicode w wybranych przez siebie językach golfowych, więc niesprawiedliwie byłoby oczekiwać, że sobie z tym poradzą.
Darrel Hoffman

Odpowiedzi:

7

Bash + Wspólne narzędzia 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

Uwaga: ^?w źródle należy zastąpić znakiem 0x7f ASCII.

Ciąg sskłada się z 7 cyfr segmentu 0-9, a, Qzakodowanych przy użyciu każdego segmentu odpowiadającego bitowi znaku ASCII.

h()Funkcja transliterates numer wejściowy z dziesiętnej z kodowaniem określony przez s, a następnie przesyła wynik jako surowego łańcucha sześciokątnym.

Dwa uzyskane łańcuchy surowy heksowej ORed ze sobą za pomocą zwykłego działania arytmetyczne Basha, następnie produkcję o dc„s Ppolecenia jako bytestream. Ten bajt jest następnie transliterowany z powrotem do postaci dziesiętnej + a + Q i wyjścia.

Zauważ też, że podczas korzystania z <<<konstruktora bash w funkcji h()nowa linia jest domyślnie dołączana do przekierowanego łańcucha. To nie ma znaczenia - jest po prostu tłumaczone 0x0ana końcu każdego ciągu szesnastkowego; gdy dwie liczby szesnastkowe są ORedytowane razem, wynik jest nadal 0x0aw ostatnim znaku, który nie podlega transliteracji, a zatem po prostu tłumaczy z powrotem do nowej linii, która jest wyprowadzana po wyniku.

Wyjście testowe:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 
Cyfrowa trauma
źródło
1
Pójdę naprzód i nagrodzę to, ponieważ wydaje się, że nikt już tego nie próbuje.
Darrel Hoffman
Dzięki Darrel - To było zabawne, interesujące wyzwanie. Jeśli chcesz uzyskać więcej odpowiedzi, możesz rozważyć przyznanie nagrody.
Digital Trauma
Nie, nie mam wystarczającej liczby przedstawicieli na tej stronie, aby wydać to wszystko na nagrody. (Nie mogę nawet przetestować tego, ponieważ nie używam Linuksa, po prostu daję społeczności wątpliwości). Po prostu rzuciłem to razem na kaprys oparty na innym pytaniu.
Darrel Hoffman
3

Python 2, 155 bajtów

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]

Wymienić z DELcharakterem (0x7F).

Wywoływanie f("12345", "123")wydruków 12389.

Lynn
źródło
Istnieją trzy zestawy wartości, dla których ta %13sztuczka działa. Oczywiście wybrałeś zestaw, który nie miał znaków poniżej 40, ale dla mojego tłumaczenia JavaScript wybrałem najkrótszy zestaw. Trzeci zestaw jest najdłuższy w JavaScript 111,5,118,117,29,121,123,37,127,125.
Neil
2

JavaScript (ES6), 158 144 bajtów

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

Oszczędność 14 bajtów przez bezwstydne kradzież %13sztuczki @ 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>

Neil
źródło
1

Java, 170 bajtów

To jest strasznie długie ... ale to i tak 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;}

Pełny program z niekluczonym kodem

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

Wszystkie dane wyjściowe (wszystkie zduplikowane raz)

12389
88888
23
a80
2q8
1234567890
Leaky Nun
źródło
I obiecuję , że nie będę używać golflangs rozwiązać ten problem (to prawdopodobnie kosztować nie więcej niż 50 bajty)
Dziurawy Nun
Nigdy nie mówiłem, że ludzie nie mogą używać do tego języków golfowych - jestem szczerze zaskoczony, że nikt jeszcze tego nie zrobił. W każdym razie, nawet bez tego prawdopodobnie można by zaoszczędzić trochę bajtów przy użyciu lambda Java 8?
Darrel Hoffman