Vấn đề giải mã


23

Cho N decanters (0 < N <10) có thể chứa C 0 ... C N-1 lít (0 < C <50) và mục tiêu G lít, vui lòng xác định xem có thể đạt được mục tiêu đó hay không chỉ bằng cách sử dụng hành động sau đây:

  • Điền vào một decanter
  • Làm trống một decanter
  • Đổ từ bình này sang bình khác cho đến khi một bình được đổ đầy hoặc một bình được đổ từ trống

Lượng mục tiêu G phải là lượng nước trong một trong các thùng chứa ở cuối. Bạn không thể có một 'decanter đầu ra'.

Ví dụ

N : 2
C 0 : 5
C 1 : 12
G : 1
Kết quả: Có

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Kết quả: Không

Gợi ý: Để tính toán nếu có thể, hãy kiểm tra xem G có chia hết cho GCD của công suất không. Ngoài ra, hãy chắc chắn rằng nó sẽ vừa trong một container.

Hãy nhớ rằng, đây là , vì vậy mã có số byte thấp nhất sẽ thắng.

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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



Có một "decanter đầu ra"? Aka, nếu tôi có một decanter cỡ 1, liệu có khả năng nào không?
Nathan Merrill

@MartinEnder Ahh. Đã sửa.
Oliver Ni

@NathanMerrill Không có "decanter đầu ra". Bạn cần có thể có được nó trong một trong những decanters đưa ra.
Oliver Ni

9
Thử thách tương tự này đã được Sandboxed .
xnor

Câu trả lời:


5

Thạch , 9 8 7 byte

-1 byte nhờ @Dennis (sử dụng phép chia số nguyên :, thay vì không nhỏ hơn, )

Ṁ:a⁸g/ḍ

Dùng thử

Làm sao?

Ṁ: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 byte

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

Bài viết này chứng minh một kết quả đơn giản hóa rất nhiều vấn đề. Dự luật 1 nói rằng

Bạn có thể đạt được mục tiêu chính xác khi cả hai:

  • Bội số của ước số chung lớn nhất (gcd) của các khả năng,
  • Tối đa công suất tối đa

Rõ ràng tại sao cả hai điều này đều cần thiết: tất cả số tiền vẫn là bội số của gcd và mục tiêu phải nằm gọn trong một thùng chứa. Chìa khóa của kết quả là một thuật toán để tạo ra bất kỳ số lượng mục tiêu nào phù hợp với các điều kiện này.

Gọi tổng đài %như thế nào [3,6,12]%9.

Một thay thế 37 byte:

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

Tôi tin rằng mục tiêu phải phù hợp với một trong những bộ giải mã, nó phải nhỏ hơn khối lượng của bộ giải mã lớn nhất (dựa trên nhận xét của @ Oliver "Bạn cần có thể nhận được nó trong một trong những bộ giải mã được đưa ra.").
m-chrzan

Thuận tiện, đó thực sự là định nghĩa được sử dụng trong bài báo và tôi đã đọc sai, vì vậy đó là một sửa chữa dễ dàng.
xnor

6

05AB1E , 9 8 9 byte

Sử dụng mã hóa CP-1252

ZU¿%²X>‹‹

Giải trình

          # 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

Hãy thử trực tuyến!

Đã lưu 1 byte sử dụng ít hơn mẹo từ câu trả lời MATL của Luis Mendo


1
sử dụng ít hơn mánh khóe ... mà tôi học được từ Dennis :-)
Luis Mendo

Câu trả lời thực tế vẫn là 9 byte ;-)
ETHproductions

@ETHproductions Rất tiếc! Có vẻ như tôi chỉ cập nhật giải thích và liên kết TIO, không phải mã thực tế. Cảm ơn :)
Emigna

5

MATL , 10 byte

&Zd\&G<~a<

Hãy thử trực tuyến!

Điều này sử dụng phương pháp của @ xnor .

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

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

Hãy thử trực tuyến !

Cách sử dụng:
Đặt công thức này ở bất cứ đâu, ngoại trừ A1-A10.
Sau đó, nhập khối lượng giữ Decant của bạn vào các ô A1: A9 (vì số lượng decant cố định) và mục tiêu trong A10. các ô không có phần tử nên được để trống. Bất cứ nơi nào bạn đặt công thức sẽ chứa kết quả. ĐÚNG nếu bạn có thể đạt được mục tiêu, SAI nếu bạn không thể.


5

JavaScript (ES6), 58 byte

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

Một cổng khác của câu trả lời của @ xnor. Vâng, tôi có thể sử dụng reducelại!


3
Chức năng phụ thay thế: e=>n<=elà một bảng màu trực quan;)
ETHproductions

4

Võng mạc , 39 byte

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

Đầu vào phải là một danh sách các decanters được phân tách bằng dấu phẩy, theo sau là dấu chấm phẩy, theo sau là âm lượng đích. Ví dụ:

6,9,21;5

Đầu ra là 0(giả) hoặc 1(trung thực).

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)

Giải trình

\d+
$*

Điều này chỉ chuyển đổi đầu vào thành unary. Sau đó, chúng tôi chỉ cần khớp các đầu vào hợp lệ với một biểu thức chính:

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

Phần bên trong (?>...)tìm thấy GCD. Chúng tôi thực hiện điều này bằng cách tìm chuỗi con lớn nhất 1+mà chúng tôi có thể khớp với tất cả các bộ giải mã (chỉ cho phép tùy chọn ,sau khi khớp hoàn toàn với GCD). Bản thân nhóm nguyên tử (?>...)để động cơ regex không quay lại các ước của GCD nếu khối lượng đích không thể khớp (nếu không, 1một lúc nào đó nhóm sẽ bị giảm xuống để khớp với một đơn 1và tất cả các đầu vào sẽ là sự thật) .

Khi chúng tôi đã tìm thấy GCD, chúng tôi cố gắng khớp khối lượng mục tiêu dưới dạng bội số của nó với đơn giản (\1+)$.

Cuối cùng, chúng tôi kiểm tra rằng âm lượng đích không lớn hơn dung lượng của bộ giải mã lớn nhất, bằng cách đảm bảo rằng âm lượng có thể được khớp với bên trong bất kỳ bộ giải mã nào (?<=\3.+).



2

PARI / GP , 31 byte

Khá nhiều đơn giản. Kiểm tra max ( vecmax) rất tốn kém, tôi tự hỏi liệu nó có thể được thực hiện tốt hơn không.

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

2

Perl, 47 byte

Bao gồm +2 cho -ap

Chạy với kích thước jar trên dòng đầu tiên của STDIN và jar mục tiêu trên dòng thứ hai:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Giải pháp này khác thường ở chỗ nó xử lý dòng đầu vào theo từng dòng và xuất ra thứ gì đó cho từng loại. Đầu ra cho dòng đầu tiên được thiết kế cẩn thận để trống trong khi dòng thứ hai in giải pháp. Hai byte bị mất ()<>được thiết kế để không liên kết trong perl.

Giải pháp regex cũng tốt nhưng 49 byte:

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

(một số phần bị đánh cắp từ giải pháp Retina)

Đối với điều này, cung cấp đầu vào trên STDIN dưới dạng các lọ được phân tách bằng dấu cách và đích sau ::

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

Khó đánh bại các ngôn ngữ có tích hợp gcd(21 byte) và max(7 byte) cho ngôn ngữ này ...


0

Scala, 90 53 byte

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

Về cơ bản hoạt động giống như các câu trả lời khác, nhưng scala không có chức năng gcd tích hợp. Scala có chức năng gcd dựng sẵn, nhưng chỉ dành cho BigInt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.