일주일의 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.