Forma correcta de agregar números para obtener muchos 8

16

Inspirado por esta pregunta que se inspiró aún más en esta , escriba un programa que tome dos enteros y los agregue de una manera única, realizando una operación OR en los segmentos utilizados para mostrarlos en una pantalla de 7 segmentos. Como referencia, los dígitos se representan de la siguiente manera:

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

Tenga en cuenta que el 1 usa los dos segmentos a la derecha, no a la izquierda. Hay dos caracteres especiales que se pueden generar de esta manera que no son números. Vea la tabla de adición a continuación:

  | 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

Observaciones utiles:

  • Cualquier dígito más sí mismo es igual a sí mismo
  • 8 más cualquier dígito es igual a 8
  • 2 más 1, 3 o 7 es igual a la letra 'a' (debe estar en minúsculas)
  • 4 más 7 es igual a 'q' o 'Q', su elección
  • Los números deben estar alineados a la derecha, por lo que los dígitos deben agregarse de derecha a izquierda. Si un número tiene más dígitos que el otro, los dígitos adicionales al principio no deberían modificarse. No hay ceros a la izquierda, a menos que el número sea exactamente 0.
  • Todos los números serán 0 o mayores. No necesita manejar un signo '-'. (Principalmente porque no hay un buen ajuste para la suma de un '-' y un '1' o '7').

Su programa debe aceptar 2 enteros en cualquier formato que elija, y generar una cadena que contenga su "suma" cuando se calcula de esta manera. Este es el código de golf, por lo que su programa debe ser lo más pequeño posible.

Ejemplos:

  • Entrada: 12345, 123. Salida: 12389
  • Entrada: 88888, 42. Salida: 88888
  • Entrada: 0, 23. Salida: 28
  • Entrada: 120, 240. Salida: a80
  • Entrada: 270, 42. Salida: 2T8 (o 2q8)
  • Entrada: 1234567890, 1234567890. Salida: 1234567890
Darrel Hoffman
fuente
44
Desafío interesante, pero esto podría usar algunos casos de prueba para que las personas puedan validar sus respuestas.
AdmBorkBork
3
¿No debería Qser minúscula? La forma real se parece qmás bien a unaQ
Luis Mendo
¿Los enteros de entrada serán de un solo dígito, número limitado de dígitos o ilimitado?
Trauma digital
1
@LuisMendo: supongo que podría ir en cualquier dirección. Lo dejaré a tu discreción. Sin aembargo, definitivamente debería ser minúscula, ya que se Ave completamente diferente.
Darrel Hoffman
2
@ Adám: Sí, pensé en eso, pero pensé que no todos tenían acceso a los personajes de Unicode en sus idiomas de golf preferidos, por lo que sería injusto esperar que manejen eso.
Darrel Hoffman

Respuestas:

7

Bash + Utilidades comunes de 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

Tenga ^?en cuenta que en la fuente debe reemplazarse con un carácter ASCII 0x7f.

La cadena ses cada dígito de 7 segmentos 0-9, a, Qcodificado con cada segmento correspondiente a un bit de un carácter ASCII.

La h()función translitera el número de entrada de decimal a la codificación especificada por s, luego genera el resultado como una cadena hexadecimal sin procesar.

Las dos cadenas hexadecimales sin procesar resultantes se OReditan juntas usando la aritmética bash regular, luego se generan mediante dcel Pcomando 's como bytestream. Este bytestream se transcribe de nuevo a decimal + a + Q y se genera.

Tenga en cuenta también que cuando se utiliza la <<<construcción bash herestring en la función, h()se agrega implícitamente una nueva línea a la cadena redirigida. Esto no importa: simplemente se traduce al 0x0afinal de cada cadena hexadecimal; cuando los dos números hexadecimales se OReditan juntos, el resultado todavía está 0x0aen el último carácter que no se transcribe y, por lo tanto, simplemente se traduce de nuevo en una nueva línea que se genera después del resultado.

Prueba de salida:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 
Trauma digital
fuente
1
Seguiré adelante y otorgaré esto, ya que parece que ya nadie lo está intentando.
Darrel Hoffman
Gracias Darrel. Fue un desafío divertido e interesante. Si quieres más respuestas, podrías considerar darle una recompensa.
Trauma digital
No, no tengo suficiente representante en este sitio para gastarlo todo en recompensas. (Ni siquiera puedo probar este, ya que no estoy ejecutando Linux, solo estoy dando a la comunidad el beneficio de la duda). De alguna manera, simplemente lo combiné por capricho en base a otra pregunta.
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]

Reemplace el con un DELcarácter (0x7F).

Llamando f("12345", "123")impresiones 12389.

Lynn
fuente
Hay tres conjuntos de valores para los que funciona ese %13truco. Obviamente, eligió el conjunto que no tenía caracteres por debajo de 40, pero para mi traducción de JavaScript elegí el conjunto más corto. El tercer conjunto es el más largo en JavaScript, lo habría sido 111,5,118,117,29,121,123,37,127,125.
Neil
2

JavaScript (ES6), 158 144 bytes

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

Ahorró 14 bytes robando descaradamente el %13truco 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
fuente
1

Java, 170 bytes

Esto es terriblemente largo ... pero de todos modos esto es 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;}

Programa completo, con código sin 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]));
        }
    }
}

Toda la salida (todo duplicado una vez)

12389
88888
23
a80
2q8
1234567890
Monja permeable
fuente
Yo prometo que no voy a utilizar golflangs para resolver este problema (probablemente costaría no más de 50 bytes)
Leaky Nun
Nunca dije que la gente no pudiera usar idiomas de golf para esto, honestamente me sorprende que nadie lo haya hecho todavía. De todos modos, incluso sin eso, ¿probablemente podría guardar algunos bytes usando un lambda Java 8?
Darrel Hoffman