Bonne façon d'ajouter des nombres pour obtenir beaucoup de 8

16

Inspiré par cette question qui a ensuite été inspirée par celle-ci , écrivez un programme qui prend deux entiers et les ajoute de manière unique, en effectuant une opération OU sur les segments utilisés pour les afficher dans un affichage à 7 segments. Pour référence, les chiffres sont représentés de la manière suivante:

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

Notez que le 1 utilise les deux segments à droite, pas à gauche. Il y a deux caractères spéciaux qui peuvent être produits de cette façon qui ne sont pas des nombres. Voir le tableau d'addition ci-dessous:

  | 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

Observations utiles:

  • Tout chiffre plus lui-même est égal à lui-même
  • 8 plus n'importe quel chiffre est égal à 8
  • 2 plus 1, 3 ou 7 est égal à la lettre 'a' (doit être en minuscule)
  • 4 plus 7 est égal à 'q' ou 'Q', votre choix
  • Les chiffres doivent être alignés à droite, de sorte que les chiffres doivent être ajoutés de droite à gauche. Si un numéro a plus de chiffres que l'autre, les chiffres supplémentaires au début doivent être inchangés. Il n'y a pas de 0 en tête, sauf si le nombre est exactement 0.
  • Tous les nombres seront 0 ou plus. Vous n'avez pas besoin de gérer un signe «-». (Principalement parce qu'il n'y a pas de bon ajustement pour la somme d'un «-» et d'un «1» ou «7».)

Votre programme doit accepter 2 entiers dans le format de votre choix et produire une chaîne contenant leur "somme" lorsqu'elle est calculée de cette manière. Il s'agit de code-golf, donc votre programme doit être aussi petit que possible.

Exemples:

  • Entrée: 12345, 123. Sortie: 12389
  • Entrée: 88888, 42. Sortie: 88888
  • Entrée: 0, 23. Sortie: 28
  • Entrée: 120, 240. Sortie: a80
  • Entrée: 270, 42. Sortie: 2Q8 (ou 2q8)
  • Entrée: 1234567890, 1234567890. Sortie: 1234567890
Darrel Hoffman
la source
4
Défi intéressant, mais cela pourrait utiliser certains cas de test afin que les gens puissent valider leurs réponses.
AdmBorkBork
3
Ne devrait-il pas Qêtre en minuscules? La forme réelle ressemble à un qplutôt qu'à unQ
Luis Mendo
Les entiers en entrée seront-ils à un chiffre, un nombre limité de chiffres ou illimités?
Digital Trauma
1
@LuisMendo - Je suppose que cela pourrait aller dans les deux sens. Je laisse cela à votre discrétion. Le adevrait certainement être en minuscules, car il Asemble complètement différent.
Darrel Hoffman
2
@ Adám - Oui, j'y ai pensé, mais je pensais que tout le monde n'avait pas accès aux personnages Unicode dans la langue de leur choix, il serait donc injuste de s'attendre à ce qu'ils gèrent cela.
Darrel Hoffman

Réponses:

7

Utilitaires Bash + Common 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

Notez que ^?dans la source doit être remplacé par un caractère ASCII 0x7f.

La chaîne s est chaque chiffre de 7 segments 0-9, a, Qcodé avec chaque segment correspondant à un bit d'un caractère ASCII.

le h() fonction translitère le nombre d'entrée de décimal au codage spécifié par s, puis sort le résultat sous la forme d'une chaîne hexadécimale brute.

Les deux chaînes hexadécimales résultantes sont OR éditées ensemble à l'aide de l'arithmétique bash régulière, puis sorties par dcla Pcommande de sous la forme d'un bytestream. Ce bytestream est ensuite translittéré en décimal + a + Q et en sortie.

Notez également que lorsque vous utilisez la <<<construction bash herestring dans h()une fonction, une nouvelle ligne est implicitement ajoutée à la chaîne redirigée. Cela n'a pas d'importance - il est simplement traduit en 0x0aà la fin de chaque chaîne hexadécimale; lorsque les deux nombres hexadécimaux sont ORed ensemble, le résultat est toujours0x0a dans le dernier caractère qui n'est pas translittéré et se traduit donc simplement par une nouvelle ligne qui est sortie après le résultat.

Sortie de test:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 
Traumatisme numérique
la source
1
Je vais aller de l'avant et attribuer cela car personne ne semble plus essayer celui-ci.
Darrel Hoffman
Merci Darrel - Ce fut un défi amusant et intéressant. Si vous voulez plus de réponses, vous pourriez envisager de mettre une prime dessus.
Traumatisme numérique
Non, je n'ai pas assez de représentants sur ce site pour dépenser tout en primes. (Je ne peux même pas tester celui-ci car je ne tourne pas sous Linux, je donne simplement à la communauté le bénéfice du doute.)
Darrel Hoffman
3

Python 2, 155 octets

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]

Remplacez le par unDEL caractère (0x7F).

Appel d' f("12345", "123")impressions 12389.

Lynn
la source
Il existe trois ensembles de valeurs pour lesquelles cette %13astuce fonctionne. Évidemment, vous avez opté pour l'ensemble qui n'avait pas de caractères inférieurs à 40, mais pour ma traduction JavaScript, j'ai choisi l'ensemble le plus court. Le troisième ensemble est le plus long en JavaScript, il l'aurait été 111,5,118,117,29,121,123,37,127,125.
Neil
2

JavaScript (ES6), 158 144 octets

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

Enregistré 14 octets en volant sans vergogne le %13tour de @ 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
la source
1

Java, 170 octets

C'est terriblement long ... mais c'est de toute façon 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;}

Programme complet, avec code non golfé

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

Toutes les sorties (toutes dupliquées une fois)

12389
88888
23
a80
2q8
1234567890
Leaky Nun
la source
Je promets de ne pas utiliser de golflangs pour résoudre ce problème (cela ne coûterait probablement pas plus de 50 octets)
Leaky Nun
Je n'ai jamais dit que les gens ne pouvaient pas utiliser les langages de golf pour cela - je suis honnêtement surpris que personne ne l'ait encore fait. Quoi qu'il en soit, même sans cela, vous pourriez probablement enregistrer quelques octets en utilisant un lambda Java 8?
Darrel Hoffman