일주일의 4 학년 수학 숙제 : 가장 비효율적 인 여행 판매원


10

제 딸은 수학 숙제를 위해 다음과 같은 임무를 수행했습니다. E, F, G, H, J 및 K라는 이름의 한 줄에 살고있는 여섯 명의 친구를 상상해보십시오.

따라서 F는 E에서 5 단위, G에서 2 단위 등이 산다.

과제 : 친구 의 위치 와 입력을 n 으로 하여 총 n 단위 길이로 각 친구를 한 번만 방문하는 경로를 식별하는 프로그램을 만드십시오. 경로를 찾은 경우 경로를보고해야합니다 (예 : 길이 17의 경우 "E, F, G, H, J, K"를보고 할 수 있으며 솔루션이없는 경우 정상적으로 종료해야합니다.) Mathematica에서 271 바이트로 풀리지 않은 솔루션입니다.


3
이것은 입력 (예 : [0, 5, 7, 13, 16, 17]62) 을 취하는 프로그램으로 더 좋을 수 있으므로이 경우에 특별히 하드 코딩되지 않았는지 확인할 수 있습니다.
Doorknob

@Doorknob, 좋은 지적입니다. 그에 따라 과제를 조정했습니다.
Michael Stern

1
친구로부터 길을 시작합니까?
xnor

1
입력 및 출력 문자열의 형식을 정의 할 수 있습니까? 입력이 비슷 "[0, 5, 7, 13, 16, 17], 62"하고 출력이 "(7, 16, 0, 17, 5, 13)"양호합니까?
논리 기사

1
@Geobits는 내 입장에서 멍청합니다. 수정했습니다.
Michael Stern

답변:


1

J, 54 바이트

하나의 올바른 경로를 출력합니다. 경로가 없으면 아무것도 출력하지 않습니다.

   f=.4 :'{.(x=+/|:2|@-/\"#.s A.y)#(s=.i.!6)A.''EFGHJK'''

   62 f 0 5 7 13 16 17
GJEKFH

모든 경로를 출력하는 52 바이트 코드 (한 줄에 하나씩) :

f=.4 :'(x=+/|:2|@-/\"#.s A.y)#(s=.i.!6)A.''EFGHJK'''

문자 대신 위치를 출력하는 38 바이트 코드 :

f=.4 :'p#~x=+/|:2|@-/\"#.p=.(i.!6)A.y'

코드를 조사 할 수는 없지만 요약하면 문제가 필요한 모든 것을 수행하는 가장 짧은 항목 인 것 같습니다.
Michael Stern

6

Mathematica, 55 또는 90 바이트

매스 매 티카 말했어? ;)

FirstCase[Permutations@#,p_/;Tr@Abs@Differences@p==#2]&

이것은 익명의 함수로, 우선 친구의 위치를 ​​임의의 순서로 취한 다음 대상 길이를 가져옵니다. Missing[NotFound]그러한 경로가 존재하지 않으면를 반환 합니다.

FirstCase[Permutations@#,p_/;Tr@Abs@Differences@p==#2]&[{0, 5, 7, 13, 16, 17}, 62]
(* {7, 16, 0, 17, 5, 13} *)

유효한 모든 경로를 반환하는 것이 허용되면 ( FirstCase-> Cases) 4 바이트를 절약 할 수 있습니다 .

문자열 배열을 반환하는 것은 조금 더 번거 롭습니다.

FromCharacterCode[68+#]&/@Ordering@FirstCase[Permutations@#,p_/;Tr@Abs@Differences@p==#2]&

위치가 아닌 문자로 응답하도록 조정할 수 있습니까?
Michael Stern

@MichaelStern 하드 코딩해야하는 양과 매개 변수의 일부를 얼마로 포함해야하는지에 대한 질문에서 실제로 명확하지 않습니까? 입력은 글자에서 위치로의 매핑과 같은 것이어야합니까?
Martin Ender 2019

문자가 항상 위의 숫자 줄에 주어진 순서 (E, F, G, H, J, K)라고 가정하십시오. 솔루션에서와 같이 거리를 함수에 전달해야합니다.
Michael Stern

@MichaelStern 문자열 배열을 반환하는 버전을 추가했습니다. 목록에서 임의의 수의 위치를 ​​지원하지만 이후 Z에는 다음 ASCII 문자로 계속됩니다 (어쨌든 n> 20에 대한 코드를 실행하지 않으려면 : D).
Martin Ender 2019

5

파이썬 2 154 148 바이트

(또는 일반적인 솔루션의 경우 118 바이트)

이 프로그램은 stdin에서 '[0, 5, 7, 13, 16, 17], n'과 같은 목록과 정수를 가진 행을 허용하며 길이 n의 출력에 경로를 인쇄하거나 불가능한 경우 아무것도 인쇄하지 않습니다.

# echo "[0, 5, 7, 13, 16, 17], 62" | python soln.py 
['G', 'J', 'E', 'K', 'F', 'H']

순열이 필요한 작은 프로그램을 파이썬으로 작성하는 것은 어렵습니다. 그 수입과 사용은 매우 비싸다.

from itertools import*
a,c=input()
for b in permutations(a):
 if sum(abs(p-q)for p,q in zip(b[1:],b))==c:print['EFGHJK'[a.index(n)]for n in b];break

축소 기 이전의 OP 요구 사항 소스 :

from itertools import*

puzzle, goal = input()
for option in permutations(puzzle):
    if sum(abs(p-q) for p,q in zip(option[1:], option)) == goal :
        print ['EFGHJK'[puzzle.index(n)] for n in option];
        break

일반 솔루션 (축소되지 않음) :

from itertools import*

puzzle, goal = input()
for option in permutations(puzzle):
    if sum(abs(p-q) for p,q in zip(option[1:], option)) == goal :
        print option;
        break

간단한 알고리즘과 수많은 조합으로 인해 20 개가 넘는 초기 위치의 실행이 매우 느립니다.


으로 몇 바이트를 절약 할 수 있습니다 from itertools import*. 또한, 파이썬 3으로 짧아 질 수도 input()*a,c=map(...)이 프로그램의 나머지 작업을 할 수 있습니다.
grc

수입 팁 감사합니다. py3 설치 및 코드베이스 변환에 저항합니다. py3에서 사용하는 모든 타사 모듈이 사용 가능하고 안정적 일 때까지 기다리고 있습니다 (오래되고 모호한 모듈을 많이 사용합니다).
논리 기사

위치가 아닌 문자로 응답하도록 조정할 수 있습니까?
Michael Stern

chr(a.index(n)+69)?
Martin Ender 2019

좋은 최적화. 그러나 @MichaelStern은 실제로 'EFGHJK'를보고 싶어한다고 생각합니다. 쉽게 쉽게 코드를 작성했습니다.
논리 기사

4

J (48 또는 65)

나는 이것이 훨씬 더 많은 골퍼가 될 수 있다고 가정한다. 골프를 치기위한 이탈 지점으로 자유롭게 사용하십시오

]A.~[:I.(=([:([:+/}:([:|-)}.)"1(A.~([:i.[:!#))))

또는 글자로 :

([:I.(=([:([:+/}:([:|-)}.)"1(A.~([:i.[:!#)))))A.[:(a.{~65+[:i.#)]

그것이하는 일 :

   62 (]A.~[:I.(=([:([:+/}:([:|-)}.)"1(A.~([:i.[:!#))))) 0 5 7 13 16 17
 7 16  0 17  5 13
 7 16  5 17  0 13
 7 17  0 16  5 13
 7 17  5 16  0 13
13  0 16  5 17  7
13  0 17  5 16  7
13  5 16  0 17  7
13  5 17  0 16  7

(이 I / O 형식이 괜찮기를 바랍니다 ...)

그것을하는 방법 :

(A.~([:i.[:!#))

입력의 모든 순열을 생성합니다

([:+/}:([:|-)}.)"1

거리를 계산

(]A.~[: I. (= ([:distance perms)))

어떤 결과가 입력과 동일한 지 확인하고 이러한 순열을 다시 생성합니다 (여기에서 일부 문자가 잘릴 수 있다고 생각합니다)

편지와 함께 :

((a.{~65+[:i.#))

첫 n 개의 문자 목록을 작성하십시오. 여기서 n은 입력 목록의 길이입니다.

indices A. [: letters ]

위와 동일


답을 문자로보고하도록 조정할 수 있습니까?
Michael Stern

@MichaelStern 할 수는 있지만 문자 수에 약간 추가됩니다 (J는 문자열이 끔찍합니다). 손상이 무엇인지 확인하기 위해 지금 시도해 보겠습니다.
ɐɔıʇǝɥʇuʎs

3

옥타브, 73

function r=t(l,d,s)r=perms(l)(find(sum(abs(diff(perms(d)')))==s,1),:);end

실제로 골프를 풀지 않습니다. 그래서 설명하겠습니다. 내부에서 바깥으로, 우리는 모든 거리를 순열하고 각 순열에 대해 주택 간의 차이를 취하고 절대 값을 거리로 가져 와서 추가합니다 원하는 거리로 첫 번째 순열의 인덱스를 찾은 다음 문자를 순열하고 해당 문자의 특정 순열을 찾으십시오.

octave:15> t(["E" "F" "G" "H" "J" "K"],[0 5 7 13 16 17],62)
ans = HEJFKG

13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62입니다.

octave:16> t(["E" "F" "G" "H" "J" "K"],[0 5 7 13 16 17],2)
ans = 

(불가능한 입력의 경우 공백)


거래가 무엇인지 모르지만 perms()ideone.com의 Octave 3.6.2에서 문자열 벡터에 문제가 있습니다.
Alex A.

흥미 롭군 로컬로 3.8.1이 있습니다.
dcsohl

2

MATLAB (86)

x=input('');X=perms(1:6);disp(char(X(find(sum(abs(diff(x(X).')))==input(''),1),:)+64))

솔루션이 존재하는 예 :

>> x=input('');X=perms(1:6);disp(char(X(find(sum(abs(diff(x(X).')))==input(''),1),:)+64))
[0, 5, 7, 13, 16, 17]
62
DBFAEC
>>

솔루션이 존재하지 않는 예 :

>> x=input('');X=perms(1:6);disp(char(X(find(sum(abs(diff(x(X).')))==input(''),1),:)+64))
[0, 5, 7, 13, 16, 17]
100
>> 

MATLAB (62)

문자 대신 위치를 생성하고 솔루션이없는 경우 빈 행렬을 생성 하여 출력 형식을 완화 할 수있는 경우 :

X=perms(input(''));X(find(sum(abs(diff(X.')))==input(''),1),:)

솔루션이 존재하는 예 :

>> X=perms(input(''));X(find(sum(abs(diff(X.')))==input(''),1),:)
[0, 5, 7, 13, 16, 17]
62
ans =
    13     5    17     0    16     7

솔루션이 존재하지 않는 예 :

>> X=perms(input(''));X(find(sum(abs(diff(X.')))==input(''),1),:)
[0, 5, 7, 13, 16, 17]
62
ans =
   Empty matrix: 0-by-6

MATLAB (54)

프로그램이 유효한 모든 경로 를 제공 할 수있는 경우 :

X=perms(input(''));X(sum(abs(diff(X.')))==input(''),:)

솔루션이 존재하는 예 :

>> X=perms(input(''));X(sum(abs(diff(X.')))==input(''),:)
[0, 5, 7, 13, 16, 17]
62
ans =
    13     5    17     0    16     7
    13     5    16     0    17     7
    13     0    17     5    16     7
    13     0    16     5    17     7
     7    16     5    17     0    13
     7    16     0    17     5    13
     7    17     5    16     0    13
     7    17     0    16     5    13

1

하스켈, 109 바이트

import Data.List
a%b=abs$snd a-snd b
n#l=[map(fst)p|p<-permutations(zip['E'..]l),n==sum(zipWith(%)p(tail p))]

사용 예 : 17 # [0, 5, 7, 13, 16, 17]유효한 모든 경로를 출력합니다 (예 :) ["EFGHIJ","JIHGFE"]. 유효한 경로가 없으면 빈 목록 []이 반환됩니다.

편지 목록에는 다음이 포함됩니다 I.

작동 방식 : (name, position)쌍 의 목록을 만들고 , 경로 길이가 같은 위치를 바꾸거나 위치를 바꾸고 n위치 부분을 제거하십시오.

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