การบ้านคณิตศาสตร์ชั้นประถมศึกษาปีที่สี่สำหรับสัปดาห์: พนักงานขายการเดินทางที่ไม่มีประสิทธิภาพมากที่สุด


10

ลูกสาวของฉันมีการบ้านคณิตศาสตร์ต่อไปนี้ ลองนึกภาพเพื่อนหกคนที่อาศัยอยู่บนเส้นหนึ่งชื่อ E, F, G, H, J และ K ตำแหน่งของพวกเขาในบรรทัดดังที่ระบุไว้ (ไม่ขยาย) ด้านล่าง:

ดังนั้น F มีชีวิตอยู่ห้าหน่วยจาก E และอีกสองหน่วยจาก G และอื่น ๆ

การมอบหมายของคุณ: จัดทำโปรแกรมที่ระบุเส้นทางที่เข้าเยี่ยมเพื่อนแต่ละคนโดยมีความยาวทั้งหมด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)"ตกลงหรือไม่?
Logic Knight

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 ไบต์

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)

การส่งกลับอาร์เรย์ของสตริงนั้นยุ่งยากกว่านี้อีกเล็กน้อย:

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

คุณสามารถปรับเพื่อให้มันตอบสนองด้วยตัวอักษรมากกว่าเพียงแค่สถานที่?
Michael Stern

@MichaelStern มันไม่ชัดเจนจริงๆจากคำถามเท่าไหร่ควร hardcoded และเท่าไหร่ควรเป็นส่วนหนึ่งของพารามิเตอร์? อินพุตควรเป็นสิ่งที่เหมือนกับการแมปจากตัวอักษรไปยังตำแหน่งหรือไม่
Martin Ender

สมมติว่าตัวอักษรอยู่ในลำดับที่ให้ในบรรทัดหมายเลขด้านบน (E, F, G, H, J, K) เสมอ ระยะทางระหว่างพวกเขาควรจะถูกส่งผ่านไปยังฟังก์ชั่นที่คุณทำในการแก้ปัญหาของคุณ
Michael Stern

@MichaelStern ฉันเพิ่มเวอร์ชันที่ส่งกลับอาร์เรย์ของสตริง รองรับจำนวนตำแหน่งใด ๆ ในรายการ แต่หลังจากนั้นZจะดำเนินการต่อด้วยอักขระ ASCII ถัดไป (ไม่ใช่ว่าคุณต้องการเรียกใช้รหัสของฉันสำหรับ n> 20 อย่างไรก็ตาม: D)
Martin Ender

5

Python 2, 154 148 bytes

(หรือ 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

ขอบคุณสำหรับเคล็ดลับการนำเข้า ฉันต่อต้านการติดตั้ง py3 และการแปลงรหัสฐานของฉัน ฉันรอจนกว่าทุกพรรคใช้โมดูล 3 ฉันสามารถใช้ได้และมีเสถียรภาพภายใต้ py3 (ผมใช้คนเก่าและปิดบังอีกมากมาย)
Logic Knight อัศวิน

คุณสามารถปรับเพื่อให้มันตอบสนองด้วยตัวอักษรมากกว่าเพียงแค่สถานที่?
Michael Stern

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

การเพิ่มประสิทธิภาพที่ดี แต่ฉันคิดว่า @MichaelStern ต้องการเห็น 'EFGHJK' จริงๆและมันก็ง่ายพอดังนั้นฉันจึงเขียนรหัสในลักษณะนั้น
Logic Knight อัศวิน

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 แย่มากกับสตริง) ฉันจะลองตอนนี้เพื่อดูว่าเกิดความเสียหายอะไร
19ıʇǝɥʇ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()ใน Octave 3.6.2 บน ideone.com กำลังมีปัญหากับเวกเตอร์ของสตริง
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

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.