Çok sayıda 8 almak için sayı eklemenin doğru yolu


16

Esinlenen bu soruya daha da esinlenerek bu bir , iki tamsayılar alır ve 7 parçalı göstergede bunları görüntülemek için kullanılan kesimleri üzerinde OR işlemi gerçekleştirerek, benzersiz bir şekilde bunları toplayan bir program yazalım. Referans olarak, rakamlar aşağıdaki şekilde temsil edilir:

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

1 öğesinin solda değil sağda iki segmenti kullandığını unutmayın. Bu şekilde üretilebilen, sayı olmayan iki özel karakter vardır. Aşağıdaki ekleme tablosuna bakı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

Yararlı gözlemler:

  • Herhangi bir rakam artı kendisi eşittir
  • 8 artı herhangi bir rakam 8'e eşittir
  • 2 artı 1, 3 veya 7, 'a' harfine eşittir (küçük harf olmalıdır)
  • 4 artı 7 'q' veya 'Q' ya eşittir, seçiminiz
  • Sayılar sağa hizalanmalıdır, bu nedenle rakamlar sağdan sola eklenmelidir. Bir sayının diğerinden daha fazla basamağı varsa, başlangıçtaki fazladan basamaklar değiştirilmemelidir. Sayı tam olarak 0 olmadığı sürece önde gelen 0 yoktur.
  • Tüm sayılar 0 veya daha büyük olacaktır. '-' işaretini kullanmanıza gerek yoktur. (Temelde bir '-' ve '1' veya '7' toplamına uygun olmadığı için.)

Programınız seçtiğiniz herhangi bir biçimde 2 tamsayıyı kabul etmeli ve bu şekilde hesaplandığında "toplamlarını" içeren bir dize çıkarmalıdır. Bu kod golf, bu nedenle programınız mümkün olduğunca küçük olmalıdır.

Örnekler:

  • Giriş: 12345, 123. Çıktı: 12389
  • Giriş: 88888, 42. Çıktı: 88888
  • Giriş: 0, 23. Çıkış: 28
  • Giriş: 120, 240. Çıkış: a80
  • Giriş: 270, 42. Çıkış: 2Q8 (veya 2q8)
  • Giriş: 1234567890, 1234567890. Çıktı: 1234567890

4
İlginç bir meydan okuma, ancak bu bazı test senaryolarını kullanabilir, böylece insanlar cevaplarını doğrulayabilir.
AdmBorkBork

3
QKüçük harf olmamalı mı ? Gerçek şekil bir qyerine çok benziyorQ
Luis Mendo

Giriş tam sayıları tek haneli, sınırlı sayıda veya sınırsız olacak mı?
Dijital Travma

1
@LuisMendo - Sanırım her iki şekilde de gidebilir. Bunu kendi takdirine bırakacağım. aKesinlikle beri, küçük harf olsa olmalıdır Atamamen farklı görünüyor.
Darrel Hoffman

2
@ Adám - Evet, bunu düşündüm, ancak herkesin golf tercih dillerinde Unicode karakterlere erişimi olmadığını düşündüm, bu yüzden onlarla başa çıkmalarını beklemek haksızlık olur.
Darrel Hoffman

Yanıtlar:


7

Bash + Ortak Linux yardımcı programları, 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

Not ^?kaynağındaki bir ASCII 0x7f karakteri ile değiştirilmelidir.

Dize s, her bir segment 0-9, a, Qbir ASCII karakterinin bitine karşılık gelen her 7 segmentli rakamdır .

h()Fonksiyonu ile belirtilen kodlama ondalık giriş numarası çevirisi şu ssonra ham bir altıgen dize olarak oluşturur.

Elde edilen iki işlenmemiş heks şeritleri vardır ORdüzenli deneme daha sonra aritmetik, çıkış kullanılarak birbirine ed dcbireyin Pbir byte akışını olarak komut. Bu bytestream daha sonra ondalık + a + Q'ya ve çıkışa dönüştürülür.

Ayrıca <<<bash herestring yapısını işlevde h()kullanırken, yönlendirilen dizeye örtük olarak bir yeni satır eklendiğini unutmayın. Bu önemli değil - 0x0aher hex dizesinin sonunda çevrilir ; iki onaltılık sayı bir ORaraya getirildiğinde, sonuç hala 0x0aharf çevirisi yapılmayan son karakterde olur ve bu nedenle sonuçtan sonra çıkan yeni bir satıra dönüşür.

Test çıktısı:

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

1
Kimse bunu denemiyor gibi görünüyor çünkü ben devam edip bunu ödüllendireceğim.
Darrel Hoffman

Teşekkürler Darrel - Eğlenceli, ilginç bir meydan okumaydı. Daha fazla cevap istiyorsanız, üzerine bir ödül vermeyi düşünebilirsiniz.
Dijital Travma

Hayır, bu sitede her şeyi ödül için harcayacak kadar temsilcim yok. (Bunu Linux çalıştırmadığım için bile test edemiyorum, sadece topluma şüphenin yararını veriyorum.) Bunu bir şekilde başka bir soruya dayanan bir hevesle attım.
Darrel Hoffman

3

Python 2, 155 bayt

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]

Değiştir bir ile DELkarakteri (0x7F).

Aramaları f("12345", "123")yazdırır 12389.


Bu %13hile için üç değer kümesi vardır . Açıkçası 40'ın altında karakteri olmayan sete gittiniz, ancak JavaScript çevirim için en kısa seti seçtim. Üçüncü küme JavaScript'teki en uzun küme olurdu 111,5,118,117,29,121,123,37,127,125.
Neil

2

JavaScript (ES6), 158 144 bayt

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

Utanmadan @ Lynn'in %13hile çalarak 14 bayt kurtardı .

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 bayt

Bu çok uzun ... ama yine de 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;}

Kodlanmamış kod ile tam program

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

Tüm çıktılar (tümü bir kez kopyalanır)

12389
88888
23
a80
2q8
1234567890

Ben bu sorunu çözmek için golflangs kullanmayacağım söz veriyorum (muhtemelen en fazla 50 bayt mal olacak)
Leaky Nun

İnsanların bunun için golf dillerini kullanamayacağını hiç söylemedim - dürüst olmak gerekirse henüz kimsenin şaşırmadığıma şaşırdım. Her neyse, bu olmadan bile bir Java 8 lambda kullanarak bazı baytlar kaydedebilirsiniz?
Darrel Hoffman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.