ปัญหาที่เกิดขึ้น


23

ได้รับNขวด (0 < N <10) ด้วยที่สามารถถือC 0 ... C N-1ลิตร (0 < C <50) และเป้าหมายGลิตรโปรดตรวจสอบว่ามันเป็นไปได้ที่จะไปให้ถึงเป้าหมายที่ใช้เพียง การกระทำดังต่อไปนี้:

  • เติมขวดเหล้า
  • ล้างขวดเหล้า
  • เทจากขวดหนึ่งไปอีกขวดหนึ่งจนเทเต็มหรือขวดที่ว่างเปล่าหมด

จำนวนเป้าหมายGต้องเป็นปริมาณน้ำในตู้คอนเทนเนอร์หนึ่งตู้ในตอนท้าย คุณไม่สามารถมี

ตัวอย่าง

N : 2
C 0 : 5
C 1 : 12
G : 1
ผลลัพธ์: ใช่

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
ผลลัพท์: หมายเลข

คำแนะนำ:หากต้องการคำนวณว่าเป็นไปได้หรือไม่ให้ตรวจสอบเพื่อดูว่าGสามารถหารด้วย GCD ของความจุได้หรือไม่ นอกจากนี้ตรวจสอบให้แน่ใจว่ามันจะพอดีกับภาชนะ

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์ต่ำสุดจะเป็นผู้ชนะ

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes



มี "ขวดเหล้าเอาท์พุท" หรือไม่? Aka, ถ้าฉันมีขวดขนาด 1, ความจุใด ๆ ที่เป็นไปได้หรือไม่?
Nathan Merrill

@MartinEnder Ahh คงที่
Oliver Ni

@NathanMerrill ไม่มี "ขวดเหล้าเอาท์พุท" คุณต้องสามารถรับหนึ่งในขวดที่ได้รับ
Oliver Ni

9
ความท้าทายเดียวกันถูก Sandboxed
xnor

คำตอบ:


5

เยลลี่ , 9 8 7 ไบต์

-1 ไบต์ต้องขอบคุณ @Dennis (ใช้การหารจำนวนเต็ม:มากกว่าไม่น้อยกว่า)

Ṁ:a⁸g/ḍ

TryItOnline

อย่างไร?

Ṁ:a⁸g/ḍ - Main link: capacities, goal
Ṁ       - maximum capacity
 :      - integer division with goal (effectively not less than goal since non-0 is True)
  a     - and
   ⁸    - left argument (capacities)
    g/  - gcd reduce over list (gcd of capacities)
      ḍ - divides

17

Haskell, 35 ไบต์

l%n=n`mod`foldr1 gcd l<1&&any(>=n)l

บทความนี้พิสูจน์ผลลัพธ์ที่ทำให้ปัญหาง่ายขึ้นอย่างมากมาย ข้อเสนอที่ 1 บอกว่า

คุณสามารถบรรลุเป้าหมายได้อย่างแน่นอนเมื่อมันทั้งคู่:

  • ตัวคูณสามัญที่ยิ่งใหญ่ที่สุดจำนวนหนึ่ง (gcd) ของความสามารถ
  • สูงสุดความจุสูงสุด

ชัดเจนว่าทำไมทั้งสองสิ่งนี้จึงจำเป็น: จำนวนทั้งหมดยังคงเป็นทวีคูณของ gcd และเป้าหมายต้องอยู่ในคอนเทนเนอร์ กุญแจสำคัญของผลลัพธ์คืออัลกอริทึมในการสร้างจำนวนเป้าหมายใด ๆ ที่เหมาะสมกับเงื่อนไขเหล่านี้

เรียกผู้ประกอบการเช่น%[3,6,12]%9

ทางเลือก 37 ไบต์:

l%n=elem n[0,foldr1 gcd l..maximum l]

ผมเชื่อว่าเป้าหมายมีให้พอดีกับหนึ่งของขวดก็ควรจะน้อยกว่าระดับเสียงขวดเหล้าที่ใหญ่ที่สุด (ขึ้นอยู่กับโอลิเวอร์ @ ความคิดเห็น "คุณจะต้องสามารถที่จะได้รับมันในหนึ่งในขวดที่กำหนด.")
m-chrzan

สะดวกจริง ๆ แล้วนั่นเป็นคำจำกัดความที่ใช้ในกระดาษและฉันอ่านผิดดังนั้นนั่นจึงเป็นวิธีแก้ไขที่ง่าย
xnor

6

05AB1E , 9 8 9 ไบต์

ใช้การเข้ารหัสCP-1252

ZU¿%²X>‹‹

คำอธิบาย

          # true if
   %      # target size modulo
ZU¿       # gcd of decanter sizes
        ‹ # is smaller than
    ²X>‹  # target size is less than or equal to max decanter size

ลองออนไลน์!

บันทึก 1 ไบต์โดยใช้เคล็ดลับน้อยกว่าจากคำตอบ MATL ของ Luis Mendo


1
ใช้เคล็ดลับที่น้อยกว่า ... ซึ่งฉันเรียนรู้จากเดนนิส :-)
Luis Mendo

คำตอบที่แท้จริงคือ 9 ไบต์ ;-)
ETHproductions

@ETHproductions อ๊ะ! ดูเหมือนว่าฉันจะอัปเดตคำอธิบายและลิงก์ TIO เท่านั้นไม่ใช่รหัสจริง ขอบคุณ :)
Emigna

5

MATL 10 ไบต์

&Zd\&G<~a<

ลองออนไลน์!

การใช้งานนี้@ วิธี

&Zd    % Take array C as input. Compute the gcd of its elements
\      % Take number G as input. Compute that number modulo the above. Call this A
&G     % Push the two inputs again: C, then G
<~a    % Gives 1 if some element of C is at least G; 0 otherwise. Call this B
<      % Gives true if A is 0 and B is 1; otherwise gives false

5

Excel: 43 ไบต์

=AND(MOD(A10,GCD(A1:A9))=0,A10<=MAX(A1:A9))

ลองออนไลน์ !

วิธีใช้:
ใส่สูตรนี้ทุกที่ยกเว้น A1-A10
จากนั้นป้อนปริมาณการถือครอง Decant ของคุณในเซลล์ A1: A9 (เนื่องจากจำนวน decants ได้รับการแก้ไข) และเป้าหมายใน A10 เซลล์ที่ไม่มี decants ควรเว้นว่างไว้ ทุกที่ที่คุณใส่สูตรจะมีผลลัพธ์ จริงถ้าคุณสามารถบรรลุเป้าหมายเป็นเท็จถ้าคุณไม่สามารถ


5

JavaScript (ES6), 58 ไบต์

(n,a)=>a.some(e=>n<=e)&n%a.reduce(g=(d,e)=>d?g(e%d,d):e)<1

คำตอบของ @xnor อีกพอร์ต ใช่ฉันจะใช้reduceอีกครั้ง!


3
ฟังก์ชั่นย่อยอื่น: e=>n<=eเป็น palindrome ที่มองเห็น;)
ETHproductions

4

เรติน่า 39 ไบต์

\d+
$*
^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

อินพุตควรเป็นรายการของตัวคั่นที่คั่นด้วยเครื่องหมายจุลภาคตามด้วยเครื่องหมายอัฒภาคตามด้วยปริมาณเป้าหมาย เช่น:

6,9,21;5

ผลลัพธ์คือ0(เท็จ) หรือ1(จริง)

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

\d+
$*

นี่แค่แปลงอินพุตเป็นเอก หลังจากนั้นเราก็จับคู่อินพุตที่ถูกต้องกับ regex เดียว:

^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

ส่วนด้านใน(?>...)พบ GCD เราทำสิ่งนี้โดยการค้นหาซับสตริงที่ใหญ่ที่สุด1+ซึ่งเราสามารถจับคู่ขวดเหล้าทั้งหมด,ได้ กลุ่มอะตอม ( (?>...)ตัว) เองเพื่อให้เอนจิ้นregex ไม่ย้อนกลับไปยังตัวหารของ GCD หากไม่สามารถจับคู่ปริมาณเป้าหมายได้ (มิฉะนั้นกลุ่ม1จะลดลงเพื่อจับคู่เดียว1และอินพุตทั้งหมดจะเป็นจริง) .

เมื่อเราได้พบ GCD (\1+)$เราพยายามให้ตรงกับปริมาณเป้าหมายเป็นหลายของมันด้วยความเรียบง่ายที่

สุดท้ายเราตรวจสอบว่าปริมาณเป้าหมายไม่เกินกำลังการผลิตขวดเหล้าที่ใหญ่ที่สุดโดยมั่นใจว่าปริมาณที่สามารถจับคู่ภายในขวดเหล้าใด ๆ (?<=\3.+)กับ



2

PARI / GP , 31 ไบต์

ค่อนข้างตรงไปตรงมา การตรวจสอบค่าสูงสุด ( vecmax) นั้นแพงมากฉันสงสัยว่ามันทำได้ดีกว่านี้หรือไม่

f(c,g)=g%gcd(c)<1&&vecmax(c)>=g

2

Perl, 47 ไบต์

รวมถึง +2 สำหรับ -ap

รันด้วยขนาด jar บนบรรทัดแรกของ STDIN และ jar เป้าหมายบนบรรทัดที่สอง:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

#!/usr/bin/perl -p
$_=($_<@G)>$_%$=;$=--while@G[@F]=grep$_%$=,@F

วิธีการแก้ปัญหานี้ผิดปกติในการที่จะประมวลผลบรรทัดต่อบรรทัดและส่งออกบางสิ่งบางอย่างสำหรับพวกเขาแต่ละคน เอาต์พุตสำหรับบรรทัดแรกได้รับการออกแบบอย่างระมัดระวังให้ว่างเปล่าในขณะที่บรรทัดที่สองพิมพ์โซลูชัน สองไบต์หายไป()เพราะ<และ>ได้รับการออกแบบให้ไม่เชื่อมโยงกันใน Perl

โซลูชัน regex นั้นก็ดี แต่ 49 ไบท์:

#!/usr/bin/perl -p
s/\d+/1x$&/eg;$_=/^(?>(1+)( |\1)*:)(\1+)$/&/$3./

(บางส่วนถูกขโมยจากโซลูชัน Retina)

สำหรับสิ่งนี้ให้อินพุตบน STDIN เป็น jars ที่คั่นด้วยช่องว่างและเป้าหมายหลังจาก::

decanter.pl <<< "2 5 12:1"

ยากที่จะเอาชนะภาษาที่มี builtin gcd(21 bytes) และmax(7 bytes) สำหรับอันนี้ ...


0

สกาลา, 90 53 ไบต์

def h(g:Int,a:BigInt*)=a.max>g&&a.reduce(_ gcd _)%g<1

ทำงานโดยทั่วไปเหมือนกับคำตอบอื่น ๆแต่ scala ไม่มีฟังก์ชัน gcd ในตัว Scala มีฟังก์ชั่น g.type ในตัว แต่สำหรับ BigInt เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.