8을 많이 얻기 위해 숫자를 추가하는 올바른 방법


16

으로 영감 이 질문 상기 의해 영감 이 한 개의 정수를 취하고 7- 세그먼트 디스플레이에이를 표시하기 위해 사용되는 세그먼트에 대해 OR 동작을 수행하여, 고유 한 방식으로 추가 프로그램을 작성. 참고로 숫자는 다음과 같이 표시됩니다.

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

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 개를 허용해야하며이 방식으로 계산할 때 "sum"을 포함하는 문자열을 출력해야합니다. 이것은 코드 골프이므로 프로그램은 가능한 한 작아야합니다.

예 :

  • 입력 : 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-그래, 나는 그것에 대해 생각했지만 모든 사람들이 선택한 골프 언어로 유니 코드 문자에 액세스 할 수있는 것은 아니라고 생각했기 때문에 처리 할 것으로 기대하는 것은 불공평합니다.
Darrel Hoffman

답변:


7

배쉬 + 일반적인 리눅스 유틸리티, 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 문자로 교체해야합니다.

문자열 s0-9, a, QASCII 문자 비트에 해당하는 각 세그먼트로 인코딩 된 각 7 세그먼트 숫자 입니다.

h()함수는 입력 숫자를 10 진수에서로 지정된 인코딩으로 음역 s한 다음 결과를 원시 16 진 문자열로 출력합니다.

결과로 생성 된 두 개의 원시 16 진 문자열은 OR일반 bash 산술을 사용하여 함께 연결 되고 바이트 스트림으로 dcP명령에 의해 출력됩니다 . 그런 다음이 바이트 스트림은 10 진수 + a + Q로 음역되고 출력됩니다.

사용시 것이 주 <<<기능에 배시 herestring 구조를 h()바꿈 암시 리디렉트 문자열에 추가된다. 이것은 중요하지 않습니다-단순히 0x0a각 16 진 문자열의 끝에서 번역됩니다 . 두 개의 16 진 숫자가 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

감사합니다 Darrel-재미 있고 흥미로운 도전이었습니다. 더 많은 답변을 원하면 바운티를 적용하는 것이 좋습니다.
디지털 외상

아냐, 나는이 사이트에서 바운티에 모든 것을 쓸만한 담당자가 없다. (리눅스를 실행하지 않기 때문에 이것을 테스트조차 할 수 없으며, 커뮤니티에 의심의 혜택을주는 것뿐입니다.) 어쨌든 다른 질문을 바탕으로 변덕스럽게 이것을 던졌습니다.
Darrel Hoffman

3

파이썬 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

자바 스크립트 (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])

@Lynn의 %13트릭 을 부끄럽게 훔쳐서 14 바이트를 절약했습니다 .

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

자바, 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 람다를 사용하여 바이트를 절약 할 수 있습니까?
대럴 호프만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.