코드를 콤비네이션 자물쇠에 부수십시오.


22

그림과 같은 표준 조합 잠금 장치가 제공됩니다. 잠금을 해제하는 방법은 조합 라인의 코드에서 4 개의 숫자를 정렬하는 것입니다. 수년간의 충성스러운 서비스를받은 후에는 자물쇠 공장에서 해고되었으며 자물쇠를 보내기 전에 자물쇠를 움켜 쥐지 말고 콤비네이션 라인에서 자물쇠를 열기 위해 자물쇠가있는 모든 자물쇠를 남겨 두어 정확한 복수를 결정했습니다.

조합 잠금

또한 다른 줄의 숫자 순서를 보면 조합 줄에 어떤 숫자가 있어야하는지 알 수 있습니다 (따라서 잠금 해제 조합).

잠금의 모든 라인에 조합 라인 (잠금을 해제하는 라인)의 라인 0부터 시작하여 9 행까지의 숫자가 제공되는 경우, 예를 들어, 라인 4의 숫자가 5336이면 잠금 해제 조합은입니다 1992.

불행히도 자물쇠는 이미 포장되어 있으며 각 자물쇠에 대한 시야가 가려져 있으므로 자물쇠의 다른 줄에서만 숫자를 볼 수 있습니다.

도전

정수의 첫 번째 숫자는 행 번호를 나타내고 두 번째 숫자는 해당 행에 나타나는 숫자를 나타내는 4 쌍의 숫자가 주어지면 잠금 조합을 수행하십시오. 예를 들어 다음을 입력 한 경우 :

57 23 99 45

그런 다음 출력해야합니다.

2101

또는

25 78 63 15

3174

입력은 항상`25 64 72 18 형식의 4 개의 양의 정수라고 가정하십시오.

이것은 이므로 바이트 수에서 가장 짧은 프로그램이 승리합니다.

또한 이것은 나의 첫 번째 질문이므로 모든 의견을 부탁드립니다.


입력을 명확히해야한다고 생각합니다. " 4 쌍의 정수가 주어57 23 99 45 졌다 " 라고 말한 다음 예제를 제시하십시오 . 그것은 4 쌍의 정수가 아닙니다 : 4 개의 정수입니다. 그리고 어떤 대답은 문자열로 그것을 얻는다고 가정하지만 다른 대답은 4 int로 준비 파싱된다고 가정합니다.
피터 테일러

나는 4 쌍의 정수가 입력의 형식을 명확하게했다는 사실에 동의하지 않는다. 57은 정수 57이 아닌 정수 쌍 5와 7이다. 나의 첫 번째 가정은 라인이 57이고 조합은 23 이었다는 것이다.
Qwerty01

1
"숫자 쌍"은 어떻습니까? 그것은 훨씬 더 명확하고 정확할 것입니다 (그리고 선행과 함께 작동합니다 0).
솜털

기술적으로 올바른 용어는 순열 잠금 입니다. 숫자 순서에 따라 차이가 있으므로 대부분의 "조합 잠금"은 실제로 순열 잠금입니다.
nyuszika7 시간

기술적으로는 그렇습니다.하지만 제 생각에는 눈에 띄지 않습니다.
Rory McPerlroy

답변:


32

CJam, 9 8 바이트

ea9fbAf%

숫자 쌍을 명령 행 인수로 읽습니다. 하려면 온라인으로 코드를 시도 , 변화를 ea위해 lS/시뮬레이션 STDIN에서 읽을 수 있습니다.

예제 실행

$ cjam <(echo ea9fbAf%) 57 23 99 45; echo
2101
$ cjam <(echo ea9fbAf%) 25 78 63 15; echo
3174

작동 원리

숫자 d 의 문자 코드 는 48 + d 입니다. 따라서 두 자리 문자열 xy를 고려하면 기본 9 숫자는 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y-x ≡ y-x (mod 10) 입니다.

ea       " Push the array of command-line arguments.                                      ";
  9fb    " Mapped base 9 conversion; replace each string 'xy' with (9 * ord(x) + ord(y)). ";
     Af% " Take the results modulo 10.                                                    ";

젠장, 다른 사람이 이길 수 없어? : P
Optimizer

나는 우리가이보다 더 나은 CJam 응답거야 생각하지 않는다
로리 McPerlroy

1
무슨 일이 있었나요?
War

1
@DigitalTrauma : 물론입니다. 문자열 "99"은 실제로 다음과 같이 배열 [57 57]로 해석 됩니다 b. "xy"9b로 구현됩니다 9 * ord(x) + ord(y). 나는 그것을 내 대답에 추가해야합니다.
Dennis

4
가능한 솔루션을 인쇄 가능한 ASCII로 제한 하면 10,000은 모든 2 문자 프로그램을 거의 다루지 않습니다 .
Dennis

13

CJam, 13 12 11 자

user23013 덕분에 이제 11 자로 줄어 듭니다. :)

4{Ar:--A%}*

설명 :

4{       }*     "Run the code block 4 times";
   r            "Read the next input token (whitespace separated)";
    :-          "Subtract 2nd number from the first treating r as a 2 numbered string";
  A   -         "Subtract the result of above from 10";
       A%       "Take modulus of 10 and store it on stack";

온라인으로 사용해보십시오

골프를 더 많이 할 수 있다는 것을 알고 있습니다. 그러나 이것은 CJam에 대한 첫 번째 시도이며 경험에 의해 제한됩니다. :)


또는 1 개의 추가 문자에서 동일한 작업을 수행하는 다른 방법 :

l~]{_A/-A%}/     // My previous solution

또는

4{ri_A/-A%}*     // As pointed out by Ingo

또는

ea{i_A/-A%}/     // If input is passed through command line

나는 이것을 기다리고 있었다. 음, 다음주에 ...
Soham Chowdhury

처음 세 문자는 대안으로 가능 l~]합니다. 입력을 파싱하는 것이 3 미만으로 가능해야한다고 생각하지만, 전에 CJam을 사용한 적이 없습니다 : /
Ingo Bürk

4{ri_A/-A%}*1 바이트 더 짧습니다.
Ingo Bürk

1
아, 또는 당신이 내 이전 의견에서 만든 것. 이제 두 개의 12 바이트 솔루션이 있습니다! :)
Ingo Bürk

3
또는 4{Ar:--A%}*.
jimmy23013

6

골프 스크립트 (14 13 )

여기에서 온라인으로 사용해보십시오

최적화 프로그램의 솔루션 과 거의 동일 하지만 다른 언어로 제공됩니다. 문제가 매우 간단하기 때문에 다른 방식으로 접근하기가 어렵습니다 . 따라서 넥타이는 확실히 입문이 일찍 옵티 마이저에게 전달됩니다.

~]{.10:^/-^%}/

같은 바이트 수로 할 수 있습니다

~]{.10/- 10%}/

Golfscript에 값이 10 인 사전 정의 된 변수가 없습니까?
Optimizer

@Optimizer 불행히도, 아닙니다. 이미 스택에 입력이있는 것이 CJam보다 유리하기 때문에 너무 나쁩니다.
Ingo Bürk

예, CJam에서 10 자 (스택 입력) 또는 Golfscript에서 11 자 (사전 정의 된 변수)
Optimizer

에 공간을 남겨 두지 않아도 골프 스크립트에 12를 넣을 수도 있습니다 - 10.
Ingo Bürk

1
희박한 언어조차도 부족한 점이있다 . : P
옵티 마이저

6

GNU dc , 14 바이트

@Dennis 의 영리한 기본 9 트릭 대여 :

9i[?A%nd]dxxxx

STDIN에서 입력 정수를 한 줄에 하나씩 읽습니다.

설명:

9i                # Set input radix to 9
  [     ]         # push a macro, defined thus:
   ?              #   read number from STDIN and push
    A             #   push literal 10
     %            #   calculate number mod 10
      n           #   print, with no newline
       d          #   duplicate macro
         d        # duplicate macro
          xxxx    # execute the macro 4 times    

산출:

$ for i in 57 23 99 45; do echo $i; done | dc ./combolock.dc
2101$ 
$ for i in 25 78 63 15; do echo $i; done | dc ./combolock.dc
3174$ 
$ 

이전 답변, 18 바이트 :

나는 이것으로 "골프"언어에 더 가까워 질 수 있다고 생각했기 때문에 (그렇지 않았다) :

[A?A~--A%n]dddxxxx

1
바이트를 절약 할 수 있습니다.9i[?A%nd]dxxxx
Dennis

@ 데니스-환상적인! 지금 나는 golfscript와 APL을 가진 목입니다!
디지털 외상

6

C 64 63 56 또는 61

입력을 파일에서 파이프 할 수있는 경우

main(a){while(scanf("%d",&a)>0)putchar(48+(a-a/10)%10);}

입력을 stdin으로 입력해야하는 경우

i;main(a){for(;i++-4;putchar(48+(a-a/10)%10))scanf("%d",&a);}

루프에서 네 개의 숫자를 읽은 다음 값에서 첫 번째 숫자를 빼고 결과 모듈로 10을 인쇄하여 각 숫자를 처리합니다.

아래의 다양한 의견과 printf 대신 putchar를 사용하여 절약


시원한. 당신은 넣어 쉼표을 절약 할 수 있습니다 scanf외부를 for()같은a,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
레벨 강 세인트

다음 a*.9대신에 2 바이트를 절약 할 수도 있습니다.a-a/10
rev

@steveverrill 좋아요. 그래서 내가 놓친 for 루프에 모든 것을 넣는 데 집중했습니다
Alchymist

1
@AcidShout 죄송합니다-작동하지 않습니다. 예를 들어 78 * .9 = 70.2, 78-78/10 = 71입니다. 또한 .9를 사용하면 인수를 두 배로 승격하므로 mod를 사용할 수 없습니다.
Alchymist

while루프 를 사용하고 다음 과 a같은 인수로 선언 하면 몇 바이트를 절약 할 수 있습니다 main.main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Dennis

5

파이썬 3, 64

똑바로.

print(''.join([(i-i//10)%10 for i in map(int,input().split())]))

[2, 1, 0, 1]대신 인쇄를 허용하면 더 짧을 수 있습니다 ( 46 ).

print([i%10-i//10 for i in map(int,input().split())])

당신은 str((i-i//10)%10)초를 사용하는 대신 직접 복용 하여 일부를 저장할 수 있습니다 map(). 나는 또한 발전기를 사용하여 시작했지만 실제 for루프가 더 짧다는 것을 알았 습니다.
DLosc

응, 고마워!
Soham Chowdhury

왜 목록 이해력을 사용합니까? 이 개 문자를 저장 genexps을 사용합니다 print(''.join((i-i//10)%10for i in map(int,input().split()))). 또한 출력에 공백이 허용되면 join튜플 풀림 해제를 피하고 사용할 수 있습니다 print(*((i-i//10)%10for i in map(int,input().split()))).
Bakuriu

내 생각 엔 니가 맞아.
Soham Chowdhury

4

C, 92

#define a(n) ,(10+v[n][1]-*v[n])%10
main(int c,char**v){printf("%d%d%d%d"a(1)a(2)a(3)a(4));}

명령 줄에서 입력 두 번째 인수에서 각 인수의 첫 번째 ASCII 코드를 빼고 10을 더한 다음 모듈로 10을 가져옵니다.

이게 내가 처음 쓴 것 같아 printf 넷 개 %의없이 콤마 (쉼표가있는 #define.)


#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)그 뒤에 a,b;main(){f;f;f;f;}18 바이트가 더 짧습니다.
Dennis

@Dennis는 크게 개선되었지만 기본적으로 완전히 다른 프로그램입니다. 나는 누군가가 그것을 게시한다면 그것은 내가 아니라 당신이되어야한다고 생각합니다. 공백을 구분 기호로 구문 분석해야하기 때문에 공백 scanf이 필요한지 확실하지 않습니다 scanf. Alchymist는 C에서 더 나은 아이디어를 가지고 있지만 Cjam 답변으로 이미 얻은 것처럼 보입니다.
Level River St

그래, 나는 그 이후의 공간을 알아 차려 시작했다 a(n) 생략 할 수 있다는 것을 알았 printf("%d%,...)으므로 매크로 주위 에 넣으면 몇 바이트가 절약되고 마침내 조금 옮겨졌습니다 ...- %c문자를 읽은 이후에 공백이 필요 합니다. 두 번째 실행에서 32를에 저장 a합니다. -C로 CJam을 때리는 것이 어려울 것입니다. printf()내 대답만큼 오래되었습니다 ...
Dennis

4

자바-203 바이트

이해서 자바 항목으로, 나는 기회 (사상 최초의 제출) 골프이 코드를 제공 할 수있는 좋은 기회를 보았다.

class M{public static void main(String[] a){String r="";for(int i=0;i<4;i++){int l=Byte.valueOf(a[i].substring(1));int f=Byte.valueOf(a[i].substring(0,1));r+=(l-f<0)?l-f+10:l-f;}System.out.print(r);}}

개선의 여지가 있다면 그들에 대해 알게되어 기쁩니다. ;-)


[팁]을 검색하고 골프를 시작하기 위해 다양한 팁을 얻을 수 있습니다. :)
Optimizer

감사합니다! 몇 가지 팁을 확인하면 13 바이트를 줄이는 데 도움이되었습니다.
Sander

3

루아-46 자

while''do a,b=io.read(1,1,1)print((b-a)%10)end

한 번에 세 문자를 읽습니다 (마지막에 공백을 입력하는 작은 자비를주었습니다). 인쇄 중 랩 어라운드를 확인합니다.

How I run it:


1
당신은 예를 들어 데이터 입력 / 출력을 제공 할 수있다, 그것은 실행 얻을 수없는 것 Ideone
로리 McPerlroy

@ Harry12345 아, 죄송합니다. Anarchy Golf는 내가 stdinput을 구현하는 방법에 대해 생각하고 있습니다. 아마 더 잘 코딩 할 수는 있지만 meh, lua는 끔찍합니다. 프로그램을 실행하는 예를 게시했습니다.
AndoDaan

3

자바 스크립트 ES6 – 53 43 바이트

f=n=>n.replace(/.. ?/g,a=>(1+a[1]-a[0])%10)

상당히 간단한 기능으로 정규 표현식을 사용하여 숫자를 얻습니다. 에서 사용해보십시오http://jsfiddle.net/efc93986/1/ . 기능이 허용되지 않으면 52 바이트의 독립형 프로그램 :

alert(prompt().replace(/.. ?/g,a=>(1+a[1]-a[0])%10))

ES6은 현재 Firefox에서만 작동하므로 다음 코드는 최신 브라우저에서 70 바이트로 작동합니다.

alert(prompt().replace(/.. ?/g,function(a){return(1+a[1]-a[0])%10}))

나는 당신을 사랑합니다 1+.

1
이 질문은 유효한 입력을 가정하여 ...?대신 사용할 수 있습니다 /\d+ ?. 반환 후의 공백은 생략 할 수 있습니다. 또한 특정 I / O가 지정되지 않았으므로 기능을 사용할 수 있어야합니다.
Dennis

1
a-a[0]대신 1+a[1]-a[0]작동해야합니다.
Dennis

2

파이썬 2-33 바이트

for i in input():print(i-i/10)%10

쉼표로 구분 된 사용자 입력을 승인합니다. 예 : 입력 :

29,26, 31, 88

산출:

7
4
8
0

출력이 예제와 정확히 일치해야하는 경우 훨씬 길어집니다. 47 바이트 :

print"%d"*4%tuple((i-i/10)%10 for i in input())

input()Python 2 인터프리터에서 작동하지 않습니다.
Soham Chowdhury

@SohamChowdhury 쉼표를 사용 했습니까?
feersum

2
아뇨. 지금 작동합니다. 참고로, 스펙마다 공백으로 구분 된 입력을해야 한다고 생각 합니다.
Soham Chowdhury

3
나는 공간이 제한되어 있어야한다는 것에 동의한다
Rory McPerlroy

2

APL, 14

10|{--/⍎¨⍕⍵}¨⎕


화면에서 설명 이 입력됩니다. 공백으로 구분 된 값은 배열로 구문 분석됩니다.
{...}¨각 번호에 대해 기능에 공급하십시오.
⍎¨⍕⍵인수를 받아서 숫자의 배열을 만듭니다.
--/단위에서 10을 뺀 값을 계산합니다.
10|모드 10.


1
14 자일 수 있지만 24 바이트 입니다.
Ingo Bürk


그러나 코드 골프의 경우 특수 문자 세트가 아닌 UTF-8로 계산됩니다. 그것은 허점 일 뿐이며 매우 쉽게 남용 될 수 있습니다.
Ingo Bürk

1
@ 당 IngoBürk으로 meta.codegolf.stackexchange.com/a/961/6972 답은 그렇지 않으면 OP 상태하지 않는 한 어떤 인코딩으로 인코딩 할 수 있습니다. 실제로 1 바이트 맵핑 인 APL 문자에 대한 IBM 코드 페이지가 있으며 이는 Dyalog가 유니 코드 3.0 이전에 사용했던 것과 정확히 일치합니다. 유니 코드를 고집한다면 유니 코드가 아닌 문자를 사용하는 새로운 언어를 발명하면 어떻게됩니까? 어떻게 바이트를 계산합니까?
TwiNight

나는 기본값이 UTF-8이라고 맹세 할 수 있었다. 그러면 14 바이트입니다.
Ingo Bürk

2

J- 20 15

동사가 아닌 형식 (함수 정의 대신 명령문으로)은 5 자 짧습니다.

10|-~/|:10#.inv

멋진 기차 인 동사 형태 :

10|[:-~/[:|:10#.inv]

이 동사는 예제 입력에 사용되었습니다.

   10|-~/|:10#.inv 57 23 99 45
2 1 0 1
   10|-~/|:10#.inv 25 78 63 15
3 1 7 4

rotd =: 10|[:-~/[:|:10#.inv] NB. verb form

   rotd 25 78 63 15
3 1 7 4
   rotd 57 23 99 45
2 1 0 1

2

하스켈 60 58

main=interact$show.map((\x->mod(x-x`div`10)10).read).words

단일 문자 숫자, Haskell 골프의 진정한 의미.


2

펄 : 38 40

print abs($_-int$_/10)%10for split" ",<>

산출:

% perl code.pl
57 23 99 45
2101

25 78 63 15                                     
3174

1
1. 밑줄은 마크 다운 구문이므로 코드가 약간 엉망이되었습니다. 이를 방지하려면 공백이 4 개인 코드를 들여 쓰기하십시오. 2. abs필요하지 않다; x - x/10부정적 일 수 없습니다. 3. -040pe공백으로 구분 된 입력을 반복 하기 위해 플래그 (일반적으로 5 바이트로 계산)를 사용하는 경우 코드를로 줄일 수 있습니다 $_=($_-int$_/10)%10. 4. 명령 행 플래그를 피 $/=$;하려면 호출을 로 설정 하고 제거하여 몇 바이트를 절약 할 수 있습니다 split.
Dennis

1

루비, 35 바이트

$*.map{|n|a,b=n.bytes;$><<(b-a)%10}

설명

입력은 명령 행 인수로 사용됩니다. String#bytes정수 배열 (ASCII 문자 코드)을 반환합니다. 마지막 문자 코드와 첫 문자 코드의 차이점 만 중요하며 정수 자체는 아닙니다.


1

C # 및 LinqPad : 104

Util.ReadLine<string>("").Split(' ').Select(s =>(s[1]-s[0])).Aggregate("",(r,a)=>r+(a<0?10+a:a)).Dump();

1

C ++ 118

int main()
{
int a,b,c;
for(int i=0; i<4; i++)
{
cin>>a;
b=a/10;
a=a%10;
c=a-b;
if(c<0)c+=10;
cout<<c;
}
}

1. 다른 컴파일러에 대해서는 확실하지 않지만 GCC에는 #include<iostream>std::이전 cin과 가 필요합니다 cout. 2. 생략하면 조건부가 필요하지 않습니다 a=a%10. 3. for 루프 주위에 변수 bc, 줄 바꿈 및 (몇 가지 수정 사항) 대괄호 가 필요하지 않습니다 .
Dennis

1
@SeanD : 코드를 수정하는 수정 사항을 승인하지 마십시오. 이 특별한 경우에, 편집은 답변을 무효로 만들었습니다. 또한 모든 답변에 있어야하는 첫 번째 줄을 제거했습니다.
Dennis

1
(CC @TeunPronk)
Dennis

@Dennis는 일반적으로이 사이트의 답변에 전 처리기 라인을 포함하지 않습니다. 줄을 생략 #include<iostream>하고using namespace std;
bacchusbeale

나는 일반적으로 바이트 수에 포함되지 않는다는 것을 알고 있지만 대답에 있어야한다고 생각합니다.
Dennis

1

PHP-90 자

코드 골프를 시도해 보겠다고 생각했습니다. 여기서는 첫 시도입니다. 아마 더 골프를 칠 수 있습니다.

<?php $a=array(57,23,99,45);foreach($a as$b){echo abs(substr($b,0,1)-substr($b,1,1)%10);}

58 자 (이즈마 엘 미겔 제공)

for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);

를 사용하여 파일에 액세스

file.php?n=57239945

이 코드를 사용해보십시오 : <? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);44 자 길이입니다. 을 사용하여 브라우저에서 액세스하십시오 file.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx. (unested code)
Ismael Miguel

좋은 아이디어를 사용 $_GET하지만 57 % 10을 표시하고 (5-7) % 10이
필요함

이것을 시도하십시오 : <? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);. 안타깝게도 길이는 65 바이트입니다. ( $i마지막 증분을 잊어 버렸습니다 ) 또는 61 바이트 길이의을 <? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);사용하여 브라우저에 액세스 하려고 시도 할 수 file.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y있습니다.
Ismael Miguel

네, 두 번째 작품은 효과가 $_GET['n']있습니다. 내 답변을 수정했습니다.
Rory McPerlroy

글쎄, 필요하지 않습니다. 단순히 경고를 발행합니다. 이 웹 사이트에 적합합니다. 그러나 이것을 시도하십시오 : <? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);. 는 %10쓸모가이 사람은 단순히 더 나은 보인다. 또한을 사용하여 액세스 할 수 있습니다 file.php?n[]=xyxyxyxy. 이 솔루션의 길이는 58 바이트입니다.
Ismael Miguel

0

파이썬 3, 60

for x in input().split():print(-eval('-'.join(x))%10,end='')

후행 줄 바꿈을 인쇄하지는 않지만 지정된대로 정확하게 입력 및 출력합니다. 여기에 두 가지 흥미로운 트릭이 있습니다 .1) 두 번의 호출을 int()한 번의 호출로 교체 eval()하고 2)를 사용 join()하여 get을 사용한 a-b다음 b-a필요 에 따라 무시 합니다. 다행히 파이썬의 모듈로 연산자는 첫 번째 인수가 음수 일지라도 양수 값을 제공합니다!


이것이 왜 하향 조정 되었습니까? 완벽하게 작동합니다. (Btw, eval('-'.join(x))트릭은 훌륭합니다.)
flornquake

@flornquake 감사합니다!
DLosc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.