Modo corretto per aggiungere numeri per ottenere un sacco di 8


16

Ispirato da questa domanda che è stata ulteriormente ispirata da questa , scrivere un programma che prende due numeri interi e li aggiunge in un modo unico, eseguendo un'operazione OR sui segmenti utilizzati per visualizzarli in un display a 7 segmenti. Per riferimento, le cifre sono rappresentate nel modo seguente:

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

Si noti che 1 utilizza i due segmenti a destra, non a sinistra. Esistono due caratteri speciali che possono essere prodotti in questo modo e non sono numeri. Vedi la tabella delle aggiunte di seguito:

  | 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

Osservazioni utili:

  • Qualsiasi cifra più se stessa equivale a se stessa
  • 8 più qualsiasi cifra è uguale a 8
  • 2 più 1, 3 o 7 è uguale alla lettera "a" (deve essere minuscola)
  • 4 più 7 equivalgono a 'q' o 'Q', a scelta
  • I numeri devono essere allineati a destra, quindi le cifre devono essere aggiunte da destra a sinistra. Se un numero ha più cifre dell'altro, le cifre extra all'inizio devono rimanere invariate. Non ci sono 0 iniziali, a meno che il numero non sia esattamente 0.
  • Tutti i numeri saranno 0 o superiori. Non è necessario gestire un segno "-". (Principalmente perché non c'è una buona misura per la somma di un '-' e un '1' o '7'.)

Il tuo programma dovrebbe accettare 2 numeri interi in qualsiasi formato tu scelga e produrre una stringa contenente la loro "somma" quando calcolata in questo modo. Questo è code-golf, quindi il tuo programma dovrebbe essere il più piccolo possibile.

Esempi:

  • Ingresso: 12345, 123. Uscita: 12389
  • Ingresso: 88888, 42. Uscita: 88888
  • Ingresso: 0, 23. Uscita: 28
  • Ingresso: 120, 240. Uscita: a80
  • Ingresso: 270, 42. Uscita: 2Q8 (o 2q8)
  • Ingresso: 1234567890, 1234567890. Uscita: 1234567890

4
Sfida interessante, ma questo potrebbe utilizzare alcuni casi di test in modo che le persone possano validare le loro risposte.
AdmBorkBork,

3
Non dovrebbe Qessere minuscolo? La forma attuale sembra qpiuttosto che unaQ
Luis Mendo,

Gli interi di input saranno a cifra singola, numero limitato di cifre o illimitato?
Trauma digitale,

1
@LuisMendo - Suppongo che potrebbe andare in entrambi i modi. Lo lascerò a tua discrezione. La adeve assolutamente essere inferiore caso, però, dal momento che Asembra completamente diverso.
Darrel Hoffman,

2
@Adám - Sì, ci ho pensato, ma ho pensato che non tutti abbiano accesso ai personaggi Unicode nelle loro lingue di golf preferite, quindi sarebbe ingiusto aspettarsi che li gestiscano.
Darrel Hoffman,

Risposte:


7

Utilità 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

Notare la ^? nella sorgente deve essere sostituito con un carattere ASCII 0x7f.

La stringa sè ogni cifra di 7 segmenti0-9, a, Q codificata con ogni segmento corrispondente a un bit di un carattere ASCII.

La h()funzione traduce il numero di input da decimale alla codifica specificata das , quindi genera il risultato come una stringa esadecimale non elaborata.

Le due stringhe esadecimali non elaborate risultanti vengono ORedite insieme usando l'aritmetica bash regolare, quindi emesse da dc'sP comando come bytestream. Questo bytestream viene quindi traslitterato in decimale + a + Q e output.

Si noti inoltre che quando si utilizza il <<<costrutto bash herestring in funzione, h()una nuova riga viene implicitamente aggiunta alla stringa reindirizzata. Questo non importa - è semplicemente tradotto alla 0x0afine di ogni stringa esadecimale; quando i due numeri esadecimali vengono ORmessi insieme, il risultato è fermo0x0a nell'ultimo carattere che non viene traslitterato e quindi si traduce semplicemente in una nuova riga che viene emessa dopo il risultato.

Uscita di prova:

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

1
Vado avanti e premerò questo dato che nessuno sembra più provare questo.
Darrel Hoffman,

Grazie Darrel - È stata una sfida divertente e interessante. Se vuoi più risposte, potresti prendere in considerazione l'idea di dargli una taglia.
Trauma digitale

No, non ho abbastanza rappresentante su questo sito per andare a spendere tutto per le taglie. (Non riesco nemmeno a testare questo dato che non eseguo Linux, sto solo dando alla comunità il beneficio del dubbio.) In qualche modo ho semplicemente messo insieme un capriccio basato su un'altra domanda.
Darrel Hoffman,

3

Python 2, 155 byte

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]

Sostituisci con aDEL carattere (0x7F).

Chiamata di f("12345", "123")stampe 12389.


Esistono tre serie di valori per i quali funziona quel %13trucco. Ovviamente hai scelto il set che non aveva caratteri inferiori a 40, ma per la mia traduzione JavaScript ho scelto il set più breve. Il terzo set è il più lungo in JavaScript, sarebbe stato 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])

Hai salvato 14 byte rubando spudoratamente il %13trucco di @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>


1

Java, 170 byte

È terribilmente lungo ... ma comunque è 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;}

Programma completo, con codice ungolfed

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

Tutti gli output (tutti duplicati una volta)

12389
88888
23
a80
2q8
1234567890

Io prometto che non userò golflangs per risolvere questo problema (che sarebbe probabilmente costato non più di 50 byte)
Leaky Nun

Non ho mai detto che la gente non potesse usare le lingue del golf per questo - sono sinceramente sorpresa che nessuno lo abbia ancora fatto. Ad ogni modo, anche senza quello potresti probabilmente salvare alcuni byte usando un lambda Java 8?
Darrel Hoffman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.