วิธีที่ถูกต้องในการเพิ่มตัวเลขเพื่อรับ 8 จำนวนมาก


16

ได้รับแรงบันดาลใจจากคำถามนี้ซึ่งได้รับแรงบันดาลใจเพิ่มเติมจากข้อนี้เขียนโปรแกรมที่ใช้จำนวนเต็มสองจำนวนและเพิ่มพวกมันในแบบที่ไม่เหมือนใคร สำหรับการอ้างอิงตัวเลขจะถูกแสดงด้วยวิธีต่อไปนี้:

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

โปรดทราบว่า 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
Luis Mendo

จำนวนเต็มอินพุตจะเป็นตัวเลขหลักเดียวจำนวน จำกัด หรือไม่ จำกัด หรือไม่
Digital Trauma

1
@ LuisMendo - ฉันคิดว่ามันจะไปทางใดทางหนึ่ง ฉันจะปล่อยให้มันขึ้นอยู่กับดุลยพินิจของคุณ aแน่นอนควรจะเป็นกรณีที่ต่ำกว่า แต่เนื่องจากAรูปลักษณ์ที่แตกต่างอย่างสิ้นเชิง
Darrel Hoffman

2
@ Adám - ใช่ฉันคิดเกี่ยวกับเรื่องนั้น แต่คิดว่าไม่ใช่ทุกคนที่สามารถเข้าถึงตัวละคร Unicode ในภาษากอล์ฟที่พวกเขาเลือกได้ดังนั้นจึงไม่ยุติธรรมที่จะคาดหวังให้พวกเขาจัดการ
Darrel Hoffman

คำตอบ:


7

ยูทิลิตี 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

โปรดสังเกตว่า^?ในแหล่งที่มาควรถูกแทนที่ด้วยอักขระ ASCII 0x7f

สตริงsคือตัวเลขแต่ละเซกเมนต์ 7 ส่วนที่0-9, a, Qเข้ารหัสด้วยแต่ละเซกเมนต์ที่สอดคล้องกับบิตของอักขระ ASCII

h()ฟังก์ชั่น transliterates จำนวนการป้อนข้อมูลจากทศนิยมเพื่อการเข้ารหัสที่ระบุโดยsแล้ว outputs ผลเป็นสตริง hex ดิบ

สตริง hex ดิบทั้งสองที่เกิดขึ้นนั้นถูกORรวมเข้าด้วยกันโดยใช้ bash arithmetic ปกติแล้วส่งออกโดยคำสั่งdc's Pเป็น bytestream Bytestream นี้จะถูกถอดเสียงกลับเป็นทศนิยม + a + Q และเอาท์พุท

โปรดทราบว่าเมื่อใช้การสร้าง<<<bash herestring ในฟังก์ชั่นh()บรรทัดใหม่จะถูกผนวกเข้ากับสตริงที่เปลี่ยนเส้นทางโดยนัย สิ่งนี้ไม่สำคัญ - มันถูกแปลเป็นเพียงแค่0x0aตอนท้ายของสตริง hex แต่ละตัว เมื่อตัวเลขฐานสองทั้งสองถูก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
ฉันจะไปข้างหน้าและให้รางวัลนี้เพราะดูเหมือนว่าจะไม่มีใครลองอีกต่อไป
Darrel Hoffman

Thanks Darrel - มันเป็นความท้าทายที่น่าสนใจ หากคุณต้องการคำตอบเพิ่มเติมคุณอาจลองใส่ความโปรดปรานลงไป
Digital Trauma

ไม่ฉันมีตัวแทนไม่เพียงพอในไซต์นี้เพื่อใช้จ่ายทั้งหมดเป็นเงินรางวัล (ฉันไม่สามารถทดสอบสิ่งนี้ได้เนื่องจากฉันไม่ได้ใช้งาน Linux ฉันแค่ให้ชุมชนได้รับประโยชน์จากข้อสงสัย) ฉันแค่โยนมันลงไปด้วยกันโดยไม่ต้องถามคำถามอื่น
Darrel Hoffman

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ก็จะได้รับ
Neil

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เล่ห์เหลี่ยมของ @ 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 ไบต์

มันยาวมาก ... แต่นี่มันเป็นจาวาอยู่ดี

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

ฉันสัญญาว่าฉันจะไม่ใช้ golflangs เพื่อแก้ปัญหานี้ (อาจจะมีค่าใช้จ่ายไม่เกิน 50 ไบต์)
Leaky Nun

ฉันไม่เคยพูดว่าผู้คนไม่สามารถใช้ภาษากอล์ฟได้ - ฉันแปลกใจจริง ๆ ที่ไม่มีใครเลย อย่างไรก็ตามถึงแม้ว่าคุณจะไม่สามารถบันทึกไบต์ด้วย Java 8 แลมบ์ดาได้บ้าง
Darrel Hoffman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.