방 번호 찾기 입력 한다고

방 번호 찾기

나는 동료에게 회의를 위해 잘못된 방 번호를 주었을 때 직장에서 흥미로운 문제 해결 기술을 접하게되었습니다. 때때로 모임에가는 동안 팀원이 잘못된 방 번호를 보내 게됩니다. 일반적으로 책상에서 서두르고 굵은 손가락으로 잘못된 열쇠가 있기 때문입니다.

흥미롭게도 잘못된 방에 도착하면 일반적으로 숫자 키패드 를 상상하여 실제로 어떤 방을 의미했는지 추측 할 수 있습니다 .

그리고 인접한 숫자를 추측함으로써 그들은 눌러야했습니다.

도전

동료가 한 자리 만 잘못 입력 한다고 가정하면 건물 사무실 번호 (000-999)를 사용하고 가능한 오타 솔루션을 출력하는 기능을 작성해야합니다 .

다음 표는 숫자 키패드에서 서로 인접한 숫자를 보여줍니다.

0 -> 1,2
1 -> 0,2,4
2 -> 0,1,3,5
3 -> 2,6
4 -> 1,5,7
5 -> 2,4,6,8
6 -> 3,5,9
7 -> 4,8
8 -> 5,7,9
9 -> 6,8

입력

3 자리 숫자 : 000-999. 정확히 3 자리의 입력을 가정하십시오. 숫자가 100보다 작거나 10보다 작 으면 앞에 0이 표시됩니다. (즉, 004 & 028).

산출

가능한 방 목록. 객실 번호 사이에 구분자가있는 한 원하는 형식이 될 수 있습니다. (예 : 공백, 쉼표, 줄 바꿈 등) 숫자가 100보다 작거나 10보다 작 으면 앞에 오는 0을 출력으로 설정할 수 있습니다. (즉, 004는 004 04 4, 028은 가능 028 28)

테스트 사례 (선행 0은 선택 사항 임) :

008 -> 108, 208, 018, 028, 005, 007, 009
123 -> 023, 223, 423, 103, 113, 133, 153, 122, 126
585 -> 285, 485, 685, 885, 555, 575, 595, 582, 584, 586, 588
777 -> 477, 877, 747, 787, 774, 778
963 -> 663, 863, 933, 953, 993, 962, 966
555 -> 255, 455, 655, 855, 525, 545, 565, 585, 552, 554, 556, 558

이것은 이므로 각 언어에 대한 가장 짧은 바이트 단위의 코드가 이깁니다.



답변

볼프람 언어 (티카) , 112 (106) 바이트

숫자 키패드가 기본적으로 GridGraph0에 가장자리가 추가 된 3×3이라는 것을 인식하면을 사용하여 각 입력 숫자에 대해 인접한 숫자를 얻습니다 AdjacencyList.

아래에서 볼 수 있습니다.

EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}] 수율 :

그럼 난 사용 Tuples가능한 모든 실수를 알아낼와 함께 정확히 하나의 오류가있는 사람을 선택하는 SelectEditDistance. 그건 그렇고, 이것은 더 긴 방 번호에서 작동 EditDistance하며 둘 이상의 오류를 허용하도록 매개 변수를 늘릴 수도 있습니다 . 좀 더 아래로 골프를 칠 수는 있지만 내 접근 방식을 보여주고 싶었습니다.

h@u_:=Select[Tuples[AdjacencyList[EdgeAdd[GridGraph[{3,3}],{0<->1,0<->2}],#]~Join~{#}&/@u],#~EditDistance~u==1&]

길이가 3 개의 방 번호 (106 바이트)로 하드 코딩 된 약간 더 골프화 된 버전. 각 숫자에 해당하는 순위 3 목록으로 출력됩니다.

Thread/@ReplacePart[#~Table~3,{i_,i_}:>(AdjacencyList[GridGraph@{3,3}~EdgeAdd~{0<->1,0<->2},#]&/@#)[[i]]]&

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


답변

파이썬 2 , 89 바이트

lambda r:[r[:i]+[c]+r[i+1:]for i,n in enumerate(r)for c in`ord(u'ÌЋ>তŧ0ɃD'[n])`]

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

1 번째 와 5 번째 문자는 여기에 표시되지 않을 수 있지만 (브라우저에 따라 다름) 전체 문자열은 다음과 같습니다.[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]


답변

05AB1E , 29 바이트

v•4TË\ªye-³—Ïʒ••Ćδn¼•S£yèʒNǝ,

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


답변

R , 190 바이트

function(x){l=list(c(1,2),c(0,2,4),c(0,1,3,5),c(2,6),c(1,5,7),c(2,4,6,8),c(3,5,9),c(4,8),c(5,7,9),c(6,8))
a=do.call(expand.grid, mapply(c,l[x+1],x))
a[apply(a,1,function(y){sum(x==y)==2}),]}

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


CodeGolf에서의 두 번째 시도! 꽤 길지만 190 바이트이지만 R로 관리 할 수있는 최선의 방법입니다. 다른 사람들이 피드백을 받거나 더 잘할 수 있는지 궁금합니다.


답변

자바 스크립트 (파이어 폭스 30-57) 115 109 바이트

f=([c,...a],p=``)=>c?[...(for(n of``+[12,240,1350,26,157,2468,359,48,579,68][c])p+n+a.join``),...f(a,p+c)]:[]

편집 : @ edc65 덕분에 6 바이트가 절약되었습니다 (제안 된 제안은 0다른 제안 후에 나타납니다). ES6 버전 118 112 바이트 :

f=([c,...a],p=``)=>c?[...[...``+[12,240,1350,26,157,2468,359,48,579,68][c]].map(n=>p+n+a.join``),...f(a,p+c)]:[]
<input oninput=o.textContent=f(this.value).join`\n`><pre id=o>

답변

자바, 205 177 바이트

b->{for(int c=0;c<3;c++){char[]d=b.toCharArray();for(char e:"12,024,0135,26,157,2468,359,48,579,68".split(",")[new Byte(""+d[c])].toCharArray()){d[c]=e;System.out.println(d);}}}

나는 그것이 다른 답변과 비교하여 오래 걸렸다는 것을 알고 있습니다. 내 변명 : 그것은 자바에 있습니다.
Oracle은 toCharArray다음과 같이 이름 을 바꿔야 합니다 getCrs.

크레딧

-28 자 Kevin Cruijssen의


답변

루비 97 바이트

->i{c=0;i.map{|j|[12,204,1035,26,157,2468,359,48,579,68][j].digits.map{|k|f=*i;f[c]=k;p f};c+=1}}

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

또는 94 자이지만 100 바이트

->i{c=0;i.map{|j|"\fÌЋ\u001A\u009Dতŧ0ɃD".unpack("U*")[j].digits.map{|k|f=*i;f[c]=k;p f};c+=1}}

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