Số trên một chuỗi


15

Một số số nguyên dương có thể được hiển thị để có một thuộc tính được gọi là Phân chia chuỗi. Để một số có thể chia hết chuỗi cho  n , nó phải đáp ứng ba yêu cầu:

  1. Mỗi chữ số chia số được hình thành bởi n  chữ số theo sau nó.

    Ví dụ, số 7143 chia hết cho 2 vì 7 chia 14 và 1 chia 43. Nó không chia hết cho 3 vì 7 không chia 143.

  2. Mỗi phần tiếp theo được tính đến khả năng chia hết phải không có số 0 đứng đầu.

    Chẳng hạn, số 14208 không chia hết cho 2 vì 08 có số 0 đứng đầu. Tuy nhiên, nó chia hết cho 3, vì 208 không có số 0 đứng đầu.

  3. Tất cả các chữ số trong số phải là duy nhất.

Chẳng hạn, số 14280 chia hết cho 2, 3 và 4. Nếu giải thích về tính phân chia chuỗi của tôi không rõ ràng, vui lòng đặt câu hỏi trong các nhận xét.

Đầu vào

Đầu vào của chương trình bao gồm một số nguyên duy nhất n, theo sau là khoảng trắng, sau đó một số có các chữ số nhất định được thay thế bằng dấu gạch dưới. Ví dụ: sau đây là một đầu vào có thể:

3 6__2__4508

n sẽ lớn hơn 1. Số sẽ không bao giờ hoàn toàn là dấu gạch dưới. Bạn không được đảm bảo rằng chữ số đầu tiên không phải là dấu gạch dưới. Chữ số đầu tiên sẽ không bao giờ bằng 0. n sẽ không bao giờ lớn hơn hoặc bằng số chữ số trong số đó.

Đầu ra

Xuất ra số, với các chữ số được thay thế bằng số nguyên sao cho số kết quả chia hết cho n . Nếu có nhiều cách để hoàn thành số chia hết chuỗi, bất kỳ cách nào cũng có thể được sử dụng làm đầu ra. Nếu không có số có thể hoàn thành nó, đầu ra no answer. Ví dụ, đầu ra của đầu vào ví dụ có thể là:

6132794508

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.


Tôi giả sử rằng nếu nlớn hơn hoặc bằng số chữ số trong số đó thì số đó có chia hết chuỗi không?
John Dvorak

@Jan Dvorak n sẽ không bao giờ bằng hoặc lớn hơn số chữ số trong đầu vào. Nó sẽ luôn nhỏ hơn. Tôi sẽ chỉnh sửa để phản ánh điều đó.
absinthe

Chúng tôi có bắt buộc phải viết một chương trình đầy đủ không, hay một chức năng có đủ không?
John Dvorak

@Martin Vâng. Nhân vật giới hạn đệm.
absinthe

@Jan Dvorak Một chương trình đầy đủ.
absinthe

Câu trả lời:


5

Bash + coreutils, 197 byte

for i in $(eval printf '%s\\n' ${2//_/{0..9\}}|grep -vP '(\d).*\1');{
for((f=d=0;d<${#i}-$1;d++));{
((${i:d+1:1}==0||10#${i:d+1:$1}%${i:d:1}))&&f=
}
[ $f ]&&echo $i&&((c++))
}
((c))||echo no answer

Đầu ra:

$ ./chain.sh 3 714_
7140
$ ./chain.sh 2 7141
no answer
$ ./chain.sh 2 14208
no answer
$ ./chain.sh 3 14208
14208
$ ./chain.sh 2 1_208
no answer
$ ./chain.sh 3 1_208
14208
$ ./chain.sh 2 6__2__4508
no answer
$ ./chain.sh 3 6__2__4508
6132794508
$

Giải trình

  • Việc mở rộng tham số ${2//_/{0..9\}}thay thế tất cả các dấu gạch dưới bằng {0..9}.
  • Chuỗi kết quả là evaled để mở rộng tất cả các biểu thức dấu ngoặc.
  • Loại grepbỏ tất cả các khả năng có bất kỳ chữ số lặp lại.
  • Sau đó, mỗi số còn lại được kiểm tra, từng chữ số cho các điều kiện 1 và 2.

2

Con trăn - 239 267

from itertools import*
T=raw_input()
n=int(T[0])
N=len(T)-2
J=''.join
for i in permutations('0123456789',N):
 if all([S in[I,'_']for S,I in zip(T[2:],i)])*all([i[j]>'0'<i[j+1]and int(J(i[j+1:j+n+1]))%int(i[j])<1for j in range(N-n)]):print J(i);exit()
print'no answer'

Chậm, nhưng ngắn. Đơn giản chỉ cần so sánh mọi hoán vị chữ số N có thể với mẫu đã cho và kiểm tra tất cả các yêu cầu. Tôi đã thử nghiệm nó chỉ với 7 hoặc 8 chữ số. Nên làm việc cho 9 hoặc 10 là tốt, nhưng sẽ mất khá nhiều thời gian.

Chỉnh sửa: Tôi đã thêm đầu ra mặc định bị thiếu "không trả lời".


2

Toán học Ruby, 349 224 229 byte

n=$*[0].to_i
r='no answer'
(?0..?9).to_a.permutation($*[1].count'_'){|q|s=$*[1]
q.map{|d|s=s.sub'_',d}
c=s.chars
(t=1
c.each_cons(n+1){|c|e=c.shift.to_i
(t=!t
break)if e<1||c[0]==?0||c.join.to_i%e>0}
(r=s)if t)if c==c.uniq}
$><<r

Đây là một thực hiện rất ngây thơ. Tôi đếm số lượng dấu gạch dưới, và sau đó chỉ cần tạo một danh sách tất cả các hoán vị chữ số có độ dài đó, để tạo ra mọi sự kết hợp có thể. Điều này sẽ thực hiện khủng khiếp đối với số lượng lớn hơn của dấu gạch dưới, nhưng đây là mã golf và không phải mã nhanh nhất. :)

Chỉnh sửa: Chuyển cái này từ Mathicala. Xem lịch sử chỉnh sửa cho phiên bản gốc.

Chỉnh sửa: Đã sửa các trường hợp gạch dưới hàng đầu.


Không nên sử dụng Hoán vị thay cho Tuples (nhìn vào số lượng ký tự)?
DavidC

@DavidCarraher Tại sao? Tôi sẽ thiếu rất nhiều kết hợp ở đó, phải không?
Martin Ender

Mỗi chữ số trong số phải là duy nhất. Tupleskhông áp đặt ràng buộc đó. Permutationssẽ, miễn là không có chữ số lặp lại trong bộ đầu vào. Và bạn chỉ có thể hoán vị các chữ số chưa được sử dụng. (Mặc dù, một lần nữa, điều này có thể kéo dài mã của bạn.)
DavidC

@DavidCarraher Ohhh, tôi đã bỏ qua yêu cầu duy nhất. Tôi cần thêm nó vào vòng lặp bên trong, trong trường hợp đó tôi cũng có thể gắn bó Tuplesvì nó ngắn hơn.
Martin Ender

@DavidCarraher cố định.
Martin Ender

1

Java, 421

class C{static int n;public static void main(String[]a){n=new Short(a[0]);f(a[1]);System.out.print("no answer");}static void f(String s){if(s.contains("_"))for(int i=0;i<=9;i++)f(s.replaceFirst("_",i+""));else{for(int i=1;i<s.length()-n+1;){String t=s.substring(i,i+n);if(t.charAt(0)<49||new Long(t)%new Long(s.substring(i-1,i++))>0||s.chars().distinct().count()<s.length())return;}System.out.print(s);System.exit(0);}}}

Ít chơi gôn hơn, với lời giải thích:

class C {

    static int n;

    public static void main(String[] a) {
        n = new Short(a[0]);
        f(a[1]);
        System.out.print("no answer");
    }

    /**
     * This method is called recursively, each time with
     * another underscore replaced by a digit, for all possible digits.
     * If there is a solution, the method prints it and exits the program.
     * Otherwise, it returns.
     */
    static void f(String s) {
        if (s.contains("_")) {
            for (int i = 0; i <= 9; i++) {
                f(s.replaceFirst("_", i + ""));
            }
        } else {
            for (int i = 1; i < s.length() - n + 1;) {
                String t = s.substring(i, i + n);       // on each substring...
                if (                                    // test for the three rules
                    t.charAt(0) < 49 ||
                    new Long(t) % new Long(s.substring(i - 1, i++)) > 0 ||
                    s.chars().distinct().count() < s.length()
                ) {
                    return;            // a rule was broken
                }
            }
            System.out.print(s);       // if we made it this far, it's a success!
            System.exit(0);
        }
    }
}
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.