Cara yang benar untuk menambahkan angka untuk mendapatkan banyak angka 8


16

Terinspirasi oleh pertanyaan ini yang kemudian terinspirasi oleh pertanyaan ini , tulis sebuah program yang mengambil dua bilangan bulat dan menambahkannya dengan cara yang unik, dengan melakukan operasi ATAU pada segmen yang digunakan untuk menampilkannya dalam tampilan 7-segmen. Untuk referensi, digit diwakili dengan cara berikut:

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

Perhatikan bahwa angka 1 menggunakan dua segmen di kanan, bukan kiri. Ada dua karakter khusus yang dapat diproduksi dengan cara ini yang bukan angka. Lihat tabel tambahan di bawah ini:

  | 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

Pengamatan yang berguna:

  • Setiap digit plus itu sendiri sama dengan dirinya sendiri
  • 8 ditambah angka sama dengan 8
  • 2 ditambah 1, 3, atau 7 sama dengan huruf 'a' (harus huruf kecil)
  • 4 plus 7 sama dengan 'q' atau 'Q', pilihan Anda
  • Angka harus disejajarkan dengan benar, sehingga angka harus ditambahkan dari kanan ke kiri. Jika satu angka memiliki lebih banyak digit daripada yang lain, digit tambahan di awal harus tidak berubah. Tidak ada 0 di awal, kecuali angkanya persis 0.
  • Semua angka akan 0 atau lebih besar. Anda tidak perlu menangani tanda '-'. (Terutama karena tidak ada yang cocok untuk penjumlahan dari '-' dan '1' atau '7'.)

Program Anda harus menerima 2 bilangan bulat dalam format apa pun yang Anda pilih, dan menghasilkan string yang berisi "jumlah" mereka ketika dihitung dengan cara ini. Ini adalah kode-golf, jadi program Anda harus sekecil mungkin.

Contoh:

  • Input: 12345, 123. Output: 12389
  • Input: 88888, 42. Output: 88888
  • Input: 0, 23. Output: 28
  • Input: 120, 240. Output: a80
  • Input: 270, 42. Output: 2Q8 (atau 2q8)
  • Input: 1234567890, 1234567890. Output: 1234567890

4
Tantangan yang menarik, tetapi ini bisa menggunakan beberapa kasus uji sehingga orang dapat memvalidasi jawaban mereka.
AdmBorkBork

3
Bukankah Qseharusnya huruf kecil? Bentuk sebenarnya lebih terlihat qdaripadaQ
Luis Mendo

Apakah bilangan bulat input menjadi satu digit, jumlah digit terbatas atau tidak terbatas?
Digital Trauma

1
@LuisMendo - Saya kira itu bisa jalan baik. Saya akan menyerahkannya sesuai dengan kebijaksanaan Anda. Yang apasti harus huruf kecil, karena Aterlihat sangat berbeda.
Darrel Hoffman

2
@ Adám - Ya, saya memikirkan hal itu, tetapi saya pikir tidak semua orang memiliki akses ke karakter Unicode dalam bahasa pilihan golf mereka, jadi tidak adil untuk mengharapkan mereka mengatasinya.
Darrel Hoffman

Jawaban:


7

Bash + Utilitas Linux Umum, 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

Perhatikan bahwa ^?sumbernya harus diganti dengan karakter ASCII 0x7f.

String sadalah setiap digit 7 segmen yang 0-9, a, Qdikodekan dengan masing-masing segmen sesuai dengan sedikit karakter ASCII.

The h()Fungsi transliterates jumlah masukan dari desimal ke pengkodean yang ditentukan oleh s, maka output hasil sebagai hex string mentah.

Kedua dihasilkan string hex baku ORed bersama-sama menggunakan aritmatika pesta teratur, maka output dengan dc's Pperintah sebagai bytestream a. Bytestream ini kemudian ditransliterasikan kembali ke desimal + a + Q dan output.

Perhatikan juga bahwa ketika menggunakan fungsi <<<herestring bash dalam fungsi, h()baris baru secara implisit ditambahkan ke string yang dialihkan. Ini tidak masalah - itu hanya diterjemahkan 0x0apada akhir setiap string hex; ketika dua angka hex ORdisatukan, hasilnya masih 0x0adalam karakter terakhir yang tidak diterjemahkan dan dengan demikian hanya diterjemahkan kembali ke baris baru yang merupakan output setelah hasilnya.

Output tes:

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

1
Saya akan maju dan memberikan penghargaan ini karena sepertinya tidak ada yang mencoba yang ini lagi.
Darrel Hoffman

Terima kasih Darrel - Itu adalah tantangan yang menyenangkan dan menarik. Jika Anda menginginkan lebih banyak jawaban, Anda mungkin mempertimbangkan untuk memberi hadiah.
Trauma Digital

Nah, saya tidak punya cukup perwakilan di situs ini untuk menghabiskan semuanya pada hadiah. (Saya bahkan tidak bisa menguji yang ini karena saya tidak menjalankan Linux, saya hanya memberi masyarakat manfaat dari keraguan.) Saya hanya semacam melemparkan ini bersama pada kemauan berdasarkan pertanyaan lain bagaimanapun.
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]

Ganti dengan DELkarakter (0x7F).

Memanggil f("12345", "123")cetakan 12389.


Ada tiga set nilai yang %13triknya berfungsi. Jelas Anda memilih himpunan yang tidak memiliki karakter di bawah 40, tetapi untuk terjemahan JavaScript saya, saya memilih himpunan terpendek. Set ketiga adalah yang terpanjang dalam JavaScript, seharusnya 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])

Disimpan 14 byte dengan mencuri %13trik Lynn tanpa malu-malu .

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

Ini sangat panjang ... tapi ini 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;}

Program penuh, dengan kode 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]));
        }
    }
}

Semua output (semua digandakan sekali)

12389
88888
23
a80
2q8
1234567890

Saya berjanji bahwa saya tidak akan menggunakan golf untuk memecahkan masalah ini (mungkin biayanya tidak lebih dari 50 byte)
Leaky Nun

Saya tidak pernah mengatakan orang tidak bisa menggunakan bahasa golf untuk ini - saya benar-benar terkejut tidak ada yang belum. Bagaimanapun, bahkan tanpa itu Anda mungkin bisa menghemat beberapa byte menggunakan Java 8 lambda?
Darrel Hoffman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.