Правильний спосіб додавання чисел, щоб отримати багато восьми


16

Надихнувшись цим питанням, яке ще більше надихнуло це , напишіть програму, яка бере два цілих числа та додає їх унікальним чином, виконуючи операцію АБО на сегментах, які використовуються для їх відображення на 7-сегментному дисплеї. Для довідки, цифри представлені таким чином:

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

Зауважте, що 1 використовує два сегменти справа, а не ліворуч. Є два спеціальні символи, які можуть бути створені таким чином, які не є цифрами. Дивіться таблицю додавання нижче:

  | 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

Корисні спостереження:

  • Будь-яка цифра плюс сама по собі дорівнює
  • 8 плюс будь-яка цифра дорівнює 8
  • 2 плюс 1, 3 або 7 дорівнює букві "a" (має бути малою літерою)
  • 4 плюс 7 дорівнює "q" або "Q", ваш вибір
  • Числа повинні бути вирівняні справа, тому цифри слід додавати справа наліво. Якщо одне число має більше цифр, ніж інше, зайві цифри на початку повинні бути незмінними. Немає провідних 0, якщо тільки число не дорівнює 0.
  • Усі числа будуть 0 або більше. Вам не потрібно обробляти знак "-". (Головним чином через те, що немає суми "-" і "1" або "7".

Ваша програма повинна прийняти 2 цілих числа у будь-якому обраному вами форматі та вивести рядок, що містить їх "суму", коли вона обчислюється таким чином. Це код-гольф, тому ваша програма повинна бути якомога меншою.

Приклади:

  • Вхід: 12345, 123. Вихід: 12389
  • Вхід: 88888, 42. Вихід: 88888
  • Вхід: 0, 23. Вихід: 28
  • Вхід: 120, 240. Вихід: a80
  • Вхід: 270, 42. Вихід: 2Q8 (або 2q8)
  • Вхід: 1234567890, 1234567890. Вихід: 1234567890

4
Цікавий виклик, але це може використовувати деякі тестові випадки, щоб люди могли перевірити свої відповіді.
AdmBorkBork

3
Чи не повинна Qбути маленька літера? Фактична форма виглядає qскоріше, ніж аQ
Луїс Мендо

Чи будуть вхідні цілі числа одноцифровими, обмеженою кількістю цифр чи необмеженими?
Цифрова травма

1
@LuisMendo - я вважаю, що це може піти в будь-який бік. Я залишаю це на ваш розсуд. Очевидно, aмабуть, це малі регістри, оскільки Aвиглядає зовсім інакше.
Даррель Гофман

2
@ Adám - Так, я думав про це, але подумав, що не кожен має доступ до символів Unicode на своїх гольф-мовах, які вибирає, тому було б несправедливо очікувати, що вони з цим впораються.
Даррель Гофман

Відповіді:


7

Bash + Загальні утиліти 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

Зверніть увагу, що ^?в джерелі слід замінити символ ASCII 0x7f.

Рядок s- це кожна 7-ти сегментна цифра, 0-9, a, Qкодована кожним сегментом, що відповідає біту символу ASCII.

h()Функція транслітерує номер входу десяткових чисел в кодуванні , зазначеної s, потім виводить результат в якості вихідного шестнадцатеричной рядки.

Два результуючі шістнадцяткові рядки ORредагуються разом, використовуючи звичайну арифметику bash, а потім виводяться командою dc's Pяк бітестрім. Потім цей швидкий потік транслітерується назад у десятковий + a + Q та виводиться.

Зауважимо також, що при використанні <<<конструкції херестінгу в функції функція нової лінії h()неявно додається до перенаправленого рядка. Це не має значення - він просто переводиться 0x0aна кінець кожної шістнадцяткової рядки; коли два шістнадцяткових числа ORредагуються разом, результат все ще 0x0aзнаходиться в останньому знаку, який не стає транслітерованим і, таким чином, просто переводиться на новий рядок, який виводиться після результату.

Тестовий вихід:

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

1
Я продовжую цю нагороду, бо ніхто, здається, більше не пробує цього.
Даррел Гофман

Спасибі Даррель - Це було цікаве, цікаве завдання. Якщо ви хочете отримати більше відповідей, можете подумати про це.
Цифрова травма

Ні, у мене не вистачає представників на цьому сайті, щоб витратити його на щедрості. (Я навіть не можу перевірити цю, оскільки я не запускаю Linux, я просто надаю спільноті користь від сумнівів.) Я просто начебто зв'язав це разом на примху на основі іншого питання.
Даррель Гоффман

3

Python 2, 155 байт

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]

Замінити з DELхарактером (0x7F).

Виклик f("12345", "123")відбитків 12389.


Є три набори значень, для яких %13працює цей трюк. Очевидно, ви пішли на набір, який не мав символів нижче 40, але для мого перекладу JavaScript я вибрав найкоротший набір. Третій набір найдовший у JavaScript, це був би 111,5,118,117,29,121,123,37,127,125.
Ніл

2

JavaScript (ES6), 158 144 байт

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 байт безсоромно викравши %13хитрість @ Лінн .

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 байт

Це страшенно довго ... але це все одно 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;}

Повна програма, з кодом, що не має волі

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

Весь вихід (всі дублюються один раз)

12389
88888
23
a80
2q8
1234567890

Я обіцяю, що я не буду використовувати гольфланг для вирішення цієї проблеми (це, мабуть, коштуватиме не більше 50 байт)
Leaky Nun

Я ніколи не казав, що люди не можуть використовувати для цього мови для гольфу - я щиро здивований, що ще нікого не було. Як би там не було, навіть без цього ви могли б зберегти кілька байт за допомогою лямбда Java 8?
Даррель Гофман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.