今週の4年生の数学の宿題:最も非効率的な出張セールスマン


10

私の娘は数学の宿題のために次のような割り当てがありました。E、F、G、H、J、Kという名前のラインに住んでいる6人の友人を想像してください。ライン上の彼らの位置は、以下に示すとおりです(縮尺どおりではありません)。

したがって、FはEから5ユニット、Gから2ユニットというように住んでいます。

あなたの課題:友達の位置とnを入力として、合計nユニットで各友達を1回だけ訪問するパスを特定するプログラムを作成します。見つかった場合はパスを報告する必要があります(たとえば、長さが17の場合は「E、F、G、H、J、K」を報告する可能性があり、解決策が存在しない場合は正常に終了する必要があります。 Mathematicaでの非推奨のソリューションであり、271バイトです。それよりもずっと簡潔に実行できると思います。


3
これは、入力を受け取るプログラム(例:[0, 5, 7, 13, 16, 17]62)としてより優れている可能性があるため、このケースにハードコードされていないことを確認できます。
ドアノブ

@ドアノブ、良い点。それに応じて割り当てを調整しました。
Michael Stern

1
道は友達から始まりますか?
xnor

1
入力文字列と出力文字列の形式を定義できますか?のような入力"[0, 5, 7, 13, 16, 17], 62"と出力は"(7, 16, 0, 17, 5, 13)"大丈夫ですか?
ロジックナイト

1
@Geobitsは私の側のだらしのなさです。修正。
マイケル・スターン

回答:


1

J、54バイト

正しい経路を1つ出力します。ルートが存在しない場合は何も出力しません。

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

   62 f 0 5 7 13 16 17
GJEKFH

すべてのルートを出力する52バイトのコード(1行に1つ):

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バイト

あなたが言ったMathematica?;)

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]&

場所だけでなく、文字で応答するように調整できますか?
マイケルスターン

@MichaelSternハードコーディングする必要がある量とパラメータの一部にする必要があるかどうかの質問からは本当に明確ではありませんか?入力は、文字から位置へのマッピングのようなものでなければなりませんか?
マーティンエンダー2015

文字は常に上記の数直線で与えられた順序であると仮定します(E、F、G、H、J、K)。それらの間の距離は、ソリューションで行うように関数に渡す必要があります。
マイケル・スターン

@MichaelStern文字列の配列を返すバージョンを追加しました。リスト内の任意の数の位置をサポートしますが、後Zは次のASCII文字で続行します(とにかく、n> 20のコードを実行する必要はありません:D)。
マーティンエンダー2015

5

Python 2、154 148バイト

(または一般的なソリューションでは118バイト)

このプログラムは、リストと「[0、5、7、13、16、17]、n」のような整数を含む行をstdinに受け入れ、長さnの出力にパスを出力するか、不可能であれば何も出力しません。

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

順列を必要とする小さなプログラムをPythonで書くのは困難です。そのインポートと使用は非常にコストがかかります。

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*。また、Python 3 は、プログラムの残りの部分で機能する場合、input()および*a,c=map(...)それが機能する場合は、より短い可能性があります。
grc '19

インポートのヒントをありがとう。私はpy3のインストールとコードベースの変換に抵抗しています。私が使用するすべてのサードパーティのモジュールがpy3で利用可能で安定するまで待機しています(私は多くの古くてわかりにくいものを使用しています)。
ロジックナイト

場所だけでなく、文字で応答するように調整できますか?
マイケル・スターン

chr(a.index(n)+69)
マーティンエンダー

最適化。しかし、@ 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 2015

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

Haskell、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.