닭은 어떻게 길을 건 did습니까?


16

뻐꾸기 닭이 왜 길을 건 why는지 아무도 모릅니다. 아마도 다른쪽에는 수탉이 좋았을 것입니다. 그러나 우리는 방법을 알아낼 수 있습니다. 왼쪽에서 오른쪽으로이 (또는 다른) "도로"를 가로 지르는 프로그램을 작성하십시오.

1356 | 1738
3822 | 1424
3527   3718
9809 | 5926
0261 | 1947
7188   4717
6624 | 9836
4055 | 9164
2636   4927
5926 | 1964
3144 | 8254

프로그램은 왼쪽에서 오른쪽으로 이동하면서 "교차"합니다. 가장 왼쪽 열에서 원하는 숫자로 시작합니다. 거기에서 오른쪽의 인접한 캐릭터로 이동할 수 있습니다. 왼쪽 상단에서 시작하면 1, 3 또는 8로 갈 수 있습니다. 시작 번호를 포함하여 이동하는 모든 숫자가 합계에 추가됩니다. 공백은 합계에 추가되지 않습니다. "|" 오른쪽 어딘가보다는 위 또는 아래로 이동하도록합니다. (이 캐릭터에서는 앞으로 나아갈 수 없습니다.) 당신의 목표는 가능한 한 작은 금액으로 상대방을 얻는 것입니다. 프로그램은 마지막에 합계를 인쇄해야하며 모든 도로를 해결할 수 있어야합니다. 도로에 대한 입력을 가질 수도 있지만 필수는 아닙니다. 프로그램은 경로와 합계를 모두 인쇄해야합니다. 가장 적은 바이트의 코드가 승리합니다.

명확히하기 위해 세로 막대에 있지 않으면 대각선으로 움직일 수 있습니다. 세로 막대에있을 때만 위아래로 이동할 수 있습니다.

더 명확한 도로 지정을 위해 기본적으로 문자의 규칙을 따르는 텍스트 문자열 (또는 열 또는 행의 배열, 그런 식으로 생각 해야하는 경우)이며 문자는 없습니다. 도로. 숫자, 공백, 막대 ( "|") 또는 줄 바꿈이있을 수 있습니다. ProgrammerDan의 답변과 같이 술 취한 사람이 도로를 포장 한 경우 여전히 유효한 도로이며 프로그램은 그러한 도로를 해결할 수 있어야합니다. 반대편에 도달 할 수없는 경우 도로로 간주되지 않습니다 (예를 들어 직선 막대를 벗어날 수있는 방법이 없음).

도로가 유효하지 않은지 확인하기 위해 프로그램이 필요하지 않습니다.

키 :
임의의 숫자-숫자를 합계에 추가하고 앞으로 이동합니다.
스페이스-앞으로 이동하면 합계에 아무것도 추가되지 않습니다.
"|" -위 또는 아래로 이동하면 합계에 아무것도 추가되지 않습니다.

편집 : 제안 된 솔루션 예. 나는 엄청나게 큰 것을 만들 수 없으며, ATM을 위해 그것을 해결하기 위해 IDE를 사용할 수 없습니다.

이 작은 길을 타십시오 :

9191 | 8282
1919 | 2727
5555   5555

솔루션은 1, 1, 1, 1, 공간, 분배기, 분배기, 공간, 공간, 2, 2, 2, 2의 경로가 총 12입니다.

편집 # 2 : Geobits와 사람들 프로그램에 의해 결정된이 질문의 첫 번째 길에 대한 해결책은 총 13에 대해 0,2,0,1,,,, 1,4,1,4입니다.


4
올바른 솔루션으로 하나 이상의 테스트 케이스를 포함시킬 수 있습니까? 또한 |연속으로 3 개 이상이있을 수 있습니까?
Martin Ender

1
@timmy 앞으로 나아가는 한 대각선으로 움직일 수 있습니다. 두 번의 대각선 움직임으로 만질 수 있습니다.
CaffeineToCode

3
@ mbomb007 상단 모서리에서 시작하는 경우. 왼쪽 열에서 시작할 수 있으므로 다음을 얻을 수 있습니다.0,2,0,1, , , ,1,4,1,4 -> 13
Geobits

1
그렇습니다. 막대에서 위 또는 아래로만 이동할 수 있으므로 공간을 통해서만 벗어날 수 있습니다.
CaffeineToCode

1
출력의 경우 비용이 충분하거나 전체 경로를 출력해야합니까?
ProgrammerDan

답변:


3

Pyth, 168 (143) 141 바이트 [지금 취한도 호환]

내 테스트 케이스는 작동하지만 내 오해로 인해 초기 예제에서는 제대로 작동하지 않습니다. 나는 그것을 고치기 위해 노력하고 있습니다.

이제 원래의 예와 취한 도로를 위해 일하고 있습니다.

일부 정말 약간 덜 추한 코드 :

=Z.dC,++\ `MUT\|++0UT=^T5Ltu+G]?&qeeG\|<heGhH+eGeHHtb,0hbKhohNum++hed@ZhhdtedC,H_y_y.b+N]YmhohNd.:++TGT3HCm.[d\ lh.MlZ.z.z*hl.z]]0j\,t.sK\ hK

여기에서 테스트

나는 10 + 9 x 40 도로에서 테스트했습니다.

6417443208|153287613
8540978161|726772300
7294922506 263609552
0341937695 498453099
9417989188 370992778
2952186385|750207767
7049868670 756968872
1961508589|379453595
0670474005 070712970
4817414691|670379248
0297779413|980515509
6637598208 090265179
6872950638 767270459
7375626432 439957105
1387683792|544956696
6974831376 545603884
0949220671|632555651
3952970630|379291361
0456363431|275612955
2973230054|830527885
5328382365|989887310
4034587060 614168216
4487052014|969272974
5015479667 744253705
5756698090|621187161
9444814561|169429694
7697999461|477558331
3822442188 206942845
2787118311|141642208
2669534759 308252645
6121516963|554616321
5509428225|681372307
6619817314|310054531
1759758306 453053985
9356970729|868811209
4208830142 806643228
0898841529|102183632
9692682718|103744380
5839709581|790845206
7264919369|982096148

제공된 테스트 스위트를 사용하여 실행할 때 "IndexError : list index out of range"가 표시됩니다.
ProgrammerDan

@ProgrammerDan도 마찬가지입니다.
CaffeineToCode

1
@CaffeineToCode true이지만 제출 한 후에 "취한 도로"라는 개념이 추가되었습니다. 무엇이 도로를 구성했는지 아는 것이 도움이되었을 것입니다. 예를 기반으로 분할 칼럼으로 2면을 가정했습니다
Brian Tuck

1
@CaffeineToCode 좋은 질문을 작성하는 가장 좋은 방법 중 하나는 솔루션 없이도 더 많은 예제를 작성하는 것입니다. 가변 폭 또는 다중 차선 도로가 유효한 경우, "미친"예를 하나 더 설명 할 텍스트없이 설명했습니다.
ProgrammerDan

1
@ProgrammerDan 요청했습니다. 광산은 이제 DR과 호환됩니다 (더 짧아요 ... 내가 잡는 것 같아요)
Brian Tuck

4

자바, 955 바이트

분명히 Java와 모든 상을 수상하지는 않지만이 문제를 좋아하고 내 입장을 던지기를 원했습니다.

특징과 한계 :

  • 다양한 폭, 복잡한 선 등을 포함하여 불규칙한 도로 (슈퍼 음주)를 지원할 수 있습니다.
  • 실행시 매개 변수로 도로가 입력 될 것으로 예상합니다. ungolfed 버전은 stdin에서의 읽기도 지원하지만 입력 방법이 지정되지 않았기 때문에 golfed 버전은 가장 작습니다!
  • 6 년 정도 동안 사용하지 않은 동적 프로그래밍 기술을 사용하여 O (n * m) 시간에서 효율적으로 해결합니다. 여기서 n은 행이고 m은 열입니다.
    • 최선의 방향을 표시 오른쪽에서 왼쪽으로 해결이 걸릴 에서 다음 인덱스는 현재 인덱스입니다.
    • "줄"은 열을 확인한 후 다음 열에 도달 할 수있는 경우 해당 열을 처리하여 처리됩니다. 그들은 도달 가능한 비 라인의 비용으로 방향을 위 또는 아래로 저장하여 해결합니다.
  • 최상의 솔루션 의 시작 색인 을 추적하지만 (골프 버전) 인쇄하지 않습니다 .

자, 충분한 jbba jabba. 골프 버전 :

class C{public static void main(String[]a){int n=a.length,m=0,i=0,j=0,h=0,p=0,q=0,s=0,t=0,b=-1,c=2147483647,x=0,y=0;char[][]r=new char[n][];char u;for(String k:a){j=k.length();m=(j>m)?j:m;}for(String k:a)r[i++]=java.util.Arrays.copyOf(k.toCharArray(),m);int[][][]d=new int[n][m][2];for(j=m-1;j>=0;j--){for(i=0;i<n;i++){u=r[i][j];p=(u=='\0'||u==' '||u=='|'?0:u-'0');if(j==m-1)d[i][j][1]=p;else{if(u=='|')d[i][j][0]=-1;else{for(h=-1;h<2;h++){x=i+h;y=j+1;if(x>=0&&x<n){if(d[x][y][0]==-1){s=x-1;while(s>=0&&r[s][y]=='|')s--;t=x+1;while(t<n&&r[t][y]=='|')t++;if((s>=0&&t<n&&d[s][y][1]<d[t][y][1])||(s>=0&&t>=n)){t=d[s][y][1];s=4;}else{s=6;t=d[t][y][1];}d[x][y][0]=s;d[x][y][1]=t;}q=d[x][y][1]+p;if(d[i][j][0]==0||q<d[i][j][1]){d[i][j][0]=h+2;d[i][j][1]=q;}}}}}if(j==0&&(b<0||d[i][j][1]<c)){b=i;c=d[i][j][1];}}}String o="";i=b;j=0;while(j<m){u=r[i][j];if(u=='\0')j=m;else{o+=u+",";h=d[i][j][0]-2;if(h>1)i+=h-3;else{i+=h;j++;}}}System.out.println(o+"\b:"+c);}}

내 습관에 따라 github with ungolfed code .

"첫 번째"도로 솔루션 :

$ java C "1356 | 1738" "3822 | 1424" "3527   3718" "9809 | 5926" "0261 | 1947" "7188   4717" "6624 | 9836" "4055 | 9164" "2636   4927" "5926 | 1964" "3144 | 8254"
0,2,0,1, , , ,1,4,1,4:13

두 번째 예 :

$ java C "9191 | 8282" "1919 | 2727" "5555   5555"
1,1,1,1, ,|,|, , ,2,2,2,2:12

브라이언 턱의 샘플 :

$ java C "6417443208|153287613" "8540978161|726772300" "7294922506 263609552" "0341937695 498453099" "9417989188 370992778" "2952186385|750207767" "7049868670 756968872" "1961508589|379453595" "0670474005 070712970" "4817414691|670379248" "0297779413|980515509" "6637598208 090265179" "6872950638 767270459" "7375626432 439957105" "1387683792|544956696" "6974831376 545603884" "0949220671|632555651" "3952970630|379291361" "0456363431|275612955" "2973230054|830527885" "5328382365|989887310" "4034587060 614168216" "4487052014|969272974" "5015479667 744253705" "5756698090|621187161" "9444814561|169429694" "7697999461|477558331" "3822442188 206942845" "2787118311|141642208" "2669534759 308252645" "6121516963|554616321" "5509428225|681372307" "6619817314|310054531" "1759758306 453053985" "9356970729|868811209" "4208830142 806643228" "0898841529|102183632" "9692682718|103744380" "5839709581|790845206" "7264919369|982096148"
2,1,0,1,5,1,2,1,1,1, ,1,0,1,2,1,2,3,0,1:26

"술취한"Brian의 예 :

6417443208 | 153287613
8540978161 | 726772300
7294922506 263609552
0341937695 498453099
9417989188 370992778
2952186385 | 750207767
7049868670 756968872
1961508589 | 379453595
0670474005 070712970
4817414691 | 670379248
0297779413 | 980515509
6637598208 090265179
6872950638 767270459
7375626432 439957105
1387683792 | 544956
697483176 5456034
09492201 | 6325551
395297030 | 3792913
 456363431 | 275612
  73230054 | 830527885
    8382365 | 989887310
    4587060 614168216
  87052014 | 96927297
 50479667 7442537
57566980 | 621187161
944481456 | 169429694
7697999461 | 477558331
3822442188 206942845
2787118311 | 141642208
2669534759 308252645
6121516963 | 554616321
5509428225 | 681372307
6619817314 | 310054531
1759758306 453053985
9356970729 | 868811209
4208830142 806643228
0898841529 | 102183632
9692682718 | 103744380
5839709581 | 790845206
7264919369 | 982096148
$ java C "6417443208|153287613" "8540978161|726772300" "7294922506 263609552" "0341937695 498453099" "9417989188 370992778" "2952186385|750207767" "7049868670 756968872" "1961508589|379453595" "0670474005 070712970" "4817414691|670379248" "0297779413|980515509" "6637598208 090265179" "6872950638 767270459" "7375626432 439957105" "1387683792|544956" "697483176 5456034" "09492201|6325551" "395297030|3792913" " 456363431|275612" "  73230054|830527885" "    8382365|989887310" "    4587060 614168216" "  87052014|96927297" " 50479667 7442537" "57566980 | 621187161" "944481456 | 169429694" "7697999461|477558331" "3822442188 206942845" "2787118311|141642208" "2669534759 308252645" "6121516963|554616321" "5509428225|681372307" "6619817314|310054531" "1759758306 453053985" "9356970729|868811209" "4208830142 806643228" "0898841529|102183632" "9692682718|103744380" "5839709581|790845206" "7264919369|982096148"
 , , , ,0,5,2,0,1, , , ,1,1,1,3,2:16

솔루션 시각화 :

09492201 | 6325551
395297030 | 3792913
\ 456363431 | 275612
 \ 73230054 | 830527885
  \ 8382365 | 989887310
   \ 4 \ 87060 614168216
  87/5-\ 4 | 96927 \ 97
 50479667 \ 74425/7
57566980 | \ 62- / 87161
944481456 | \ / 69429694
7697999461 | 477558331

즐겨!

편집 : 이제 나는 과시하고 있습니다 (두 도로가 합쳐집니다! 그가 만들 수 있습니까?)

948384 | 4288324 324324 | 121323
120390 | 1232133 598732 | 123844
 293009 | 2394023 432099 | 230943
 234882 | 2340909 843893 | 849728
  238984 | 328498984328 | 230949
  509093 | 904389823787 | 439898
   438989 | 3489889344 | 438984
   989789 | 7568945968 | 989455
    568956 | 56985869 | 568956
    988596 | 98569887 | 769865
     769879 | 769078 | 678977
     679856 | 568967 | 658957
      988798 | 8776 | 987979
      987878 | 9899 | 989899
       999889 | | 989899
       989999 | | 989999
        989898 | | 998999
        989999 | | 999999
         989998 || 899999
         989998 || 998999

해결책:

$ java C "948384 | 4288324   324324 | 121323" "120390 | 1232133   598732 | 123844" " 293009 | 2394023 432099 | 230943" " 234882 | 2340909 843893 | 849728" "  238984 | 328498984328 | 230949" "  509093 | 904389823787 | 439898" "   438989 | 3489889344 | 438984" "   989789 | 7568945968 | 989455" "    568956 | 56985869 | 568956" "    988596 | 98569887 | 769865" "     769879 | 769078 | 678977" "     679856 | 568967 | 658957" "      988798 | 8776 | 987979" "      987878 | 9899 | 989899" "       999889 |    | 989899" "       989999 |    | 989999" "        989898 |  | 998999" "        989999 |  | 999999" "         989998 || 899999" "         989998 || 998999"
 ,2,0,3,0,0, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, , , , , , , ,|, ,|, ,|, ,|, ,|, ,|, ,|,|, , ,1,0,7,2:15

(보너스 : ungolfed에서 경로) :

$ java Chicken < test5.txt
best start: 3 cost: 15
  -> 2 -> 0 -> 3 -> 0 -> 0 ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->
  -> | -> | ->   ->   ->   ->   ->   ->   ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | -> | ->
  ->   -> 1 -> 0 -> 7 -> 2 -> 15
/ -> - -> - -> \ -> / -> / -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , ->
- -> , -> , -> / -> \ -> - -> - -> - -> / -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> , -> , ->
/ -> - -> \ -> \ -> - -> \ -> across

알고리즘에 대한 세부 사항

내가 사용한 동적 프로그래밍 기술에 대한 자세한 설명이 요청되었으므로 다음과 같습니다.

mark-and-precompute 솔루션을 사용하고 있습니다. 이름은 적절하지만 잊어 버린 지 오래입니다. 다른 누군가가 그것을 제공 할 수 있습니까?

연산:

  • 가장 오른쪽 열에서 시작하여 왼쪽으로 진행하면서 열의 각 셀에 대해 다음을 계산하십시오.
    • 현재 셀 비용 + 다음 열에서 도달 할 수있는 가장 저렴한 셀로 정의 된 최저 비용 이동의 요약
    • 이 셀에서 다른 단일 셀로의 유효한 이동과 같이이 최저 비용을 달성하기 위해 수행하는 이동 조치.
  • 파이프가 연기됩니다. 파이프를 해결하려면 전체 열을 계산해야하므로 다음 열까지 파이프를 계산하지 않습니다.
    • 파이프 왼쪽에서 셀의 최저 비용을 결정할 때 먼저 파이프를 따라 이동하는 가장 좋은 방향을 계산합니다. 항상 위쪽 또는 아래쪽으로 해석되므로 한 번 계산합니다.
    • 그런 다음 다른 모든 셀과 마찬가지로 최상의 비용 (파이프에서 위 또는 아래로 이동하여 도달하는 셀의 비용으로 정의) 및 도달 방향을 저장합니다.

노트:

그게 다야. 위에서 아래로, 오른쪽에서 왼쪽으로 한 번 스캔합니다. 한 번만 접촉 한 셀은 파이프 일 뿐이지 만 각 파이프는 한 번만 "해결"되어 O (m * n) 창 내에 유지됩니다.

"홀수"맵 크기를 처리하기 위해 null 문자로 채워서 행 길이를 미리 스캔하고 정규화하기로했습니다. 널 문자는 파이프 및 공백과 동일하게 "제로 비용"이동으로 계산됩니다. 그런 다음 솔루션을 인쇄 할 때 표준화 도로의 가장자리에 도달하거나 null 문자에 도달하면 인쇄 비용을 중지하거나 이동합니다.

이 알고리즘의 장점은 매우 간단하고 모든 셀에 동일한 규칙을 적용하여 O (m * n) 하위 문제를 해결하여 완전한 솔루션을 생성하며 속도 측면에서 다소 빠릅니다. 그것은 메모리를 상쇄하여 도로지도의 메모리에 효과적으로 2 개의 사본을 생성하는데, 첫 번째는 "최고의 비용"데이터를 저장하고, 두 번째는 셀당 "최고의 이동"데이터를 저장하고; 이것은 동적 프로그래밍에 일반적입니다.


라인에 대한 접근 방식을 조금 더 설명해 주시겠습니까? 또한 (다소 다른) 다이나믹 프로그래밍 접근법을 시도했지만 그 점을 파악했습니다. 또한 너무 많은 메모리를 사용하지 않고 너무 넓지 않은 매우 긴 도로를 처리하기위한 증분 (행별) 접근 방식을 고려했습니다. O (m ^ 2 * n) 시간 내에 그렇게 할 수있는 방법이 있는지 아십니까?
dfeuer

@dfeuer 확실히 트레이드 오프에 관한 것입니다. 내가 고려한 행 단위 접근 방식 중 어느 것도 어떤 시점에서 O (m ^ n) 시간에 굴복하지 않고 입력의 모든 순열을 처리 할 수 ​​없었습니다. 이것은 구성에 의한 열별 문제입니다 (이동은 주로 왼쪽에서 오른쪽으로 이동합니다-효율적인 DP 솔루션은 오른쪽에서 왼쪽으로 이동합니다). 간단한 look-behind와 deferred look을 사용하여 행 단위로 O (m * n) 접근 방식을 수행 할 수 있지만 많은 메모리를 절약하지 않고도 복잡성을 크게 증가시키고 있습니다.
ProgrammerDan

내가 생각한 것은 내가 실수하지 않으면 지금까지 가장 좋은 경로를 추적하고 가장 최근에 처리 된 행의 각 사각형에 대해 왼쪽 가장자리에서 오른쪽 가장자리까지 가장 잘 알려진 경로를 추적해야한다는 것입니다. 같은 줄에서 오른쪽으로 각 사각형에. 그게 잘못이야?
dfeuer

1
감사! 당신은 정의하여 드롭 코드를 줄일 수 있습니다 c-1>>>1.
dfeuer

1
나는 Haskell을 목표로하고 있는데, 이는 오랫동안 경쟁하기 어렵지만, 내가 가장 잘 아는 것입니다.
dfeuer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.