ภัณฑารักษ์ของภัณฑารักษ์


9

บทนำ

คุณเป็นเพื่อนของภัณฑารักษ์พิพิธภัณฑ์ศิลปะการที่ได้มีความสุขที่ผ่านมาของการได้รับงานศิลปะสมัยใหม่จากสี่ศิลปิน ( ซึ่งบางส่วนอาจจะให้ผู้ดูแลศูนย์ชิ้นงานศิลปะ, วายร้ายหนุ่ม ) เนื่องจากนี่คือศิลปะสมัยใหม่ชิ้นส่วนของศิลปินที่ได้รับจึงมีลักษณะเหมือนกันทุกประการ เพื่อนของคุณต้องการใช้คอมพิวเตอร์เพื่อช่วยตัดสินใจว่าจะสั่งซื้อชิ้นส่วนเหล่านี้ได้อย่างไร

ข้อกำหนดของโปรแกรม

โปรแกรมของคุณต้องใช้จำนวนเต็มห้าจำนวน (ส่งผ่านไปยังฟังก์ชันหรือป้อนผ่าน stdin (หรืออีกวิธีหนึ่ง)) สี่คนแรกคือจำนวนภาพวาดที่จัดทำโดยศิลปินสี่คนแต่ละคน ค่าสุดท้ายคือดัชนีการเปลี่ยนแปลงi(นับจาก 1 ไม่ใช่ 0) ภัณฑารักษ์มีความประสงค์ที่จะเห็นการiเรียงสับเปลี่ยนลำดับตามคำสั่งของภาพเขียน

โปรแกรมต้องออกของคุณเปลี่ยนแปลงนี้ในรูปแบบใด ๆ ที่เหมาะสม: เช่นหรือabbccd [0 1 1 2 2 3]รันไทม์สำหรับการป้อนข้อมูลที่รวมจำนวนภาพน้อยกว่าสิบภาพต้องใช้เวลาน้อยกว่าหนึ่งชั่วโมง (หวังว่าจะไม่มีปัญหา)

คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นใด ๆ ที่สร้างขึ้นเพื่อเปลี่ยนวิธีเรียงสับเปลี่ยน

ตัวอย่าง

อินพุต: 0 1 2 0 2

เนื่องจากเรามีหนึ่งภาพวาดโดยศิลปิน B และสองโดยศิลปิน C (และพวกเขาทั้งหมดเหมือนกัน), เรียงลำดับตามลำดับคำศัพท์คือ:

[ 'สำเนาลับ', ' CBC ', 'CCB']

การเรียงสับเปลี่ยนที่ไฮไลต์จะเป็นผลลัพธ์ที่ถูกต้องเพราะเป็นลำดับที่สองตามลำดับพจนานุกรม

อินพุต: 1 2 0 1 5

['abbd', 'abdb', 'adbb', 'babd', ' badb ', 'bbad', 'bbda', 'bdab', 'bdba', 'dab', 'dbab', 'dbba']

การทดสอบ

นี่คือการทดสอบบางอย่างที่ควรถูกต้อง

1 2 4 1 5    - ABBDCCCC
2 2 3 1 86   - ABBCACDC
4 1 2 0 24   - AACACBA
1 4 3 2 65   - ABBCBBDCDC

โค้ดสั้น ๆ ใน Python3 ที่ควรสร้างอินพุตและเอาต์พุตแบบสุ่มมีอยู่ที่นี่ (ไม่ถูกต้องสำหรับการเข้าใช้สิ่งนี้ใช้ Python ในการนำเข้าพีชคณิต):

from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))

ป้ายบอกคะแนน

Optimizer - CJam       - 39  - Confirmed - Bruteforce
EDC65     - JavaScript - 120 - Confirmed - Bruteforce
Jakube    - Python2    - 175 - Confirmed - Algorithmic

1
คุณพูดว่า "ทุกชิ้นมีลักษณะเหมือนกันทุกประการ" คุณหมายถึง "ชิ้นส่วนทั้งหมดจากศิลปินที่ให้มามีลักษณะเหมือนกันทุกประการ แต่ชิ้นส่วนจากศิลปินที่แตกต่างกันมีลักษณะแตกต่างกัน"
DavidC

นี่ไม่ใช่รายการที่ถูกต้อง แต่ฉันคิดว่ามันอาจจะมีประโยชน์สำหรับใครบางคน: {:A.a.{~97+[:I.}:เป็น J ที่ถูกต้องและทำงานได้ แต่ใช้A.สำหรับงานส่วนใหญ่ดังนั้นจึงไม่ถูกต้อง หากคุณสามารถเขียนฟังก์ชั่นที่แทนที่A.และรองรับในฟังก์ชันนี้คุณจะได้คำตอบที่ถูกต้อง
Janıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs - คุณไม่จำเป็นต้องใช้ "ABCD" คุณสามารถใช้ระบบอักขระ / ตัวเลข / สัญลักษณ์ใด ๆ ได้เลย ฉันเกรงว่าฉันจะไม่รู้จัก J ดังนั้นจึงไม่สามารถบอกปัญหาที่แน่นอนได้ แต่หวังว่านี่จะช่วยได้ =)
Alexander Craggs

@PopeyGilbert อืมรุ่นที่แยกตัวเลขออกมาเป็น{:A.[:I.}:... สิ่งนี้คือสิ่งนั้น แต่ฉันก็ยังคิดว่าไม่A.ถูกต้อง: jsoftware.com/help/dictionary/dacapdot.htm
Janıʇǝɥʇuʎs

เกิดอะไรขึ้นถ้าการเปลี่ยนแปลงที่จำเป็นไม่มีอยู่? 1 0 0 0 100?
edc65

คำตอบ:


5

Python 2: 175 163 ตัวอักษร

นี่ไม่ใช่คำตอบที่กอล์ฟอย่างจริงจัง ด้วยอัลกอริทึมที่แตกต่างกันฉันถึง 138 ไบต์ แค่ต้องการโพสต์สิ่งนี้ที่นี่เพราะมันไม่ได้ใช้กำลังดุร้าย ความซับซ้อนคือ Theta (#pictures)

f=lambda x:0**x or x*f(x-1)
def g(Q,n):
 while sum(Q):
  for j in 0,1,2,3:
   p=f(sum(Q)-1)*Q[j]
   for k in Q:p/=f(k)
   if p<n:n-=p
   else:print j;Q[j]-=1;break

การใช้งาน:

g([1, 4, 3, 2], 65)

แก้ไข:

อัลกอริทึมแบบเดียวกันเพียงแค่การเล่นกอล์ฟ: อย่านำเข้าวิธีแฟคทอเรียลและการเปลี่ยนแปลงเล็กน้อยในลำดับการคำนวณ

การแปล Pyth: 61 ตัวอักษร

Lu*GhHUb1WsPQV4J*@QNytsPQFZPQ=J/JyZ)I<JeQ XQ4-eQJ)EN XQNt@QNB

ไม่มีอะไรพิเศษที่นี่แปลรหัสหลามของฉันอย่างแน่นอน ทางยาวเกินไปแม้ว่า ฉันใช้สิ่งที่น่าเกลียด (ยาว) น้อยเกินไป ตัวอักษร 9 ตัวแรกเท่านั้นที่เป็นคำจำกัดความของแฟคทอเรียล

Lu*GhHUb1    def y(b): G=1; for H in range(b): G*= H+1; return G

สิ่งที่ชอบQ[j]-=1ก็ยาวเกินไป: XQNt@QN(1 ตัวอักษรมากกว่า Python !!!)

การใช้งาน:

ลองได้ที่นี่: Pyth คอมไพเลอร์ ปิดใช้งานโหมดดีบักและใช้[2, 2, 3, 1, 86]เป็นอินพุต


มันได้ผล! ขอแสดงความยินดีที่มากับโซลูชัน Python แรก! อย่างไรก็ตามฉันพบว่าในสภาพแวดล้อมของฉันฉันต้องย้ายfrom math import*ออกไปข้างนอกฟังก์ชั่น เพิ่มคุณในกระดานผู้นำ!
Alexander Craggs

ว้าว ... ทางออกของคุณมีประสิทธิภาพอย่างไม่น่าเชื่อ - สำหรับ 32 ภาพวาดใช้เวลาเพียง 0.034 วินาที o.0
Alexander Craggs

3

CJam, 50 43 39 ไบต์

q~(])\{W):Wa*}%s:X{Xm*:s_&}X,(*{$X=},$=

นี้สามารถเล่นกอล์ฟได้มาก

รับอินพุตจาก STDIN ในรูปแบบต่อไปนี้:

4 1 2 0 24

เอาท์พุทภาพวาด ตัวอย่างเช่นอินพุตด้านบน:

0020210

ลองออนไลน์ได้ที่นี่

โปรดทราบว่าคอมไพเลอร์ออนไลน์ยอมแพ้สำหรับภาพวาดที่ใหญ่ขึ้น คุณจะต้องลองอินพุตที่มีขนาดใหญ่กว่าในเวอร์ชัน Java


ขอแสดงความยินดีกับการเป็นนักแก้ปัญหาคนแรก! 50 ไบต์เป็นค่าที่ยากที่จะเอาชนะ ฉันจะเพิ่มคุณเป็นอันดับต้น ๆ ของกระดานแต้มนำ!
Alexander Craggs

@PopeyGilbert อย่างน้อยคุณควรรอเป็นเวลา 1 สัปดาห์หรือมากกว่านั้นก่อนที่จะยอมรับคำตอบ
เครื่องมือเพิ่มประสิทธิภาพ

อ่าโอเคฉันขอโทษมาก! ในการท้าทายครั้งก่อนของฉันฉันเพิ่งเปลี่ยนคำตอบที่ยอมรับได้เมื่อมีคนพ่ายแพ้ ความผิดฉันเอง.
Alexander Craggs

1
@PopeyGilbert มันยอดเยี่ยมมากสำหรับคุณ (และฉันต้องการให้ผู้เขียนท้าทุกคน) และโดยหลักการแล้วไม่มีอะไรผิดถ้าคุณยอมรับ แต่เช้า แต่บางคนดูเหมือนจะรู้สึกขุ่นเคืองหากความท้าทายรอบ ๆ ที่นี่ยอมรับคำตอบเร็ว (เพราะฉัน คาดเดาไม่มีใครคาดว่าผู้แต่งจะเปลี่ยนคำตอบที่ยอมรับ)
Martin Ender

โดยส่วนตัวฉันคิดว่าควรมีคำตอบให้เลือกอย่างน้อย 2 คำตอบก่อนที่จะยอมรับแม้ว่ามันจะเสร็จเร็ว แน่นอนถ้ามีเพียง 1 คำตอบจนถึงหนึ่งสัปดาห์ให้ยอมรับมัน
เครื่องมือเพิ่มประสิทธิภาพ

3

JavaScript (ES6) 120 138 147

ในฐานะที่เป็นฟังก์ชั่นที่มีพารามิเตอร์ห้าตัวที่ต้องส่งออกผ่านทางคอนโซล
ใช้สัญลักษณ์ 0,1,2,3 ฉันคำนวณจำนวนรวมของสัญลักษณ์จากนั้นสร้างและตรวจสอบทุกหมายเลข 4 ฐานที่มีจำนวนหลักที่ต้องการ ตัวเลขที่มีตัวเลขผิดหลัก ๆ จะถูกยกเลิก
หมายเหตุ: ด้วยจำนวนเต็ม JavaScript 32 บิตสิ่งนี้ใช้ได้กับภาพวาดสูงสุด 15 ภาพ

แก้ไขตัวย่อ (หลีกเลี่ยง. toString) และวิธีที่เร็วกว่า (เงื่อนไขการออกจากการแก้ไข) เวลาสำหรับการทดสอบแต่ละครั้งต่ำกว่า 1 วินาที

Edit2ไม่มีการเปลี่ยนแปลงอัลกอริทึม golfed เพิ่มเติม (เพิ่มการเยื้องเพื่อให้อ่านง่าย)

F=(w,x,y,z,n)=>{
  for(a=0;n;n-=l=='0,0,0,0')
    for(l=[w,x,y,z],t=w+x+y+z,v='',b=a++;t--;b/=4)--l[d=b&3],v=d+v;
  console.log(v)
}

Ungolfedและไม่จำเป็นต้องใช้ FireFox

F=function(w,x,y,z,n) {
  for(a=0; n; a++) // exit when solution found (if wrong parameters, run forever)
  {
    l=[w,x,y,z]; // required number of each symbol
    t=w+x+y+z; // total of digits
    v=''; // init output string
    for(b=a;
      t--; // digit count down
      b >>= 2) // shift for next digit
    {
        d = b & 3; //get digit
        --l[d]; // decrement for the current digit
        v = d + v; // add to output string         
    }
    l[0]|l[1]|l[2]|l[3] // if digits ok
    ||--n // decrement counter
  }
  console.log(v) // when found, exit for and print the answer
}

ทดสอบในคอนโซล FireBug / FireFox

F(1, 2, 4, 1, 5) 
F(2, 2, 3, 1, 86)
F(4, 1, 2, 0, 24)
F(1, 4, 3, 2, 65)

เอาท์พุต

01132222
01120232
0020210
0112113232

สวัสดี! มีปัญหาเล็กน้อยในการใช้งาน ฉันกำลังดาวน์โหลด FireFox เพื่อดูว่าจะช่วยได้หรือไม่ ฉันจะเพิ่มคุณในกระดานผู้นำ!
Alexander Craggs

ฉันพบว่าเป็นตารางที่ดีที่นี่ - ฉันจะถือว่า Firefox เป็นสิ่งจำเป็น ผ่านการทดสอบและใช้งานได้! เปลี่ยนลีดเดอร์บอร์ดเพื่อยืนยัน
Alexander Craggs

กระดานผู้นำ แต่ไม่มีการโหวต ... คุณไม่ชอบมันจริงๆ! :(
edc65

Agh! ฉันขอโทษ = (ตอนนี้ upvoted ตอนนี้ =)
Alexander Craggs

ฉันสงสัยว่าอัลกอริทึมนี้จะใช้เวลานานเท่าใดใน CJam แต่ ณ ตอนนี้ฉันไม่รู้ว่ามันทำงานอย่างไร: P
เครื่องมือเพิ่มประสิทธิภาพ

2

Pyth , 20

@fqPQm/TdU4^U4sPQteQ

ลองที่นี่

อินพุตอยู่ในรูปแบบรายการ Python เช่น [1, 2, 4, 1, 5]

เอาต์พุตยังอยู่ในรูปแบบรายการ Python เช่น[0, 1, 1, 3, 2, 2, 2, 2]สำหรับอินพุตด้านบน

วิธีการแก้ปัญหาคือกำลังดุร้ายและใช้เวลาประมาณ 10 วินาทีกรณีที่เลวร้ายที่สุดในเครื่องของฉัน

มันทำงานอย่างไร:

@fqPQm/TdU4^U4sPQteQ
           ^U4sPQ         All permutations of [0, 1, 2, 3] with length equal to the number
                          of paintings.
     m/TdU4               Find the count (/) of paintings by painter in the input list.
 fqPQ                     Filter the permutations on the counts being the desired counts
                          in the input.
                          This gives all possible orderings of the paintings.
@                teQ      Index into this list at the given location - 1. (0-indexing)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.