체인의 숫자


15

일부 양의 정수에는 연쇄 분할 이라는 속성이있는 것으로 표시 될 수 있습니다 . 숫자를 n 으로 나눌 수  있으려면 세 가지 요구 사항을 충족해야합니다.

  1. 각 숫자는  그 뒤에 오는 n 숫자로 형성된 숫자를 나눕니다 .

    예를 들어, 숫자 7143는 사슬 나누어 2~7 때문에 14 분할하고 분할 43. 1입니다 하지 사슬 나누어 143을 분할하지 않는 3 내지 7에 의한 때문에.

  2. 분할 성을 고려한 각 하위 시퀀스에는 선행 0이 없어야합니다.

    예를 들어 08은 앞에 0이 있으므로 숫자 14208은 2로 나눌 수 없습니다. 그러나 208은 앞에 0이 없기 때문에 3으로 체인으로 나눌 수 있습니다.

  3. 숫자의 모든 숫자는 고유해야합니다.

예를 들어, 숫자 14280은 2, 3, 4로 사슬로 나눌 수 있습니다. 사슬 나누기에 대한 설명이 명확하지 않은 경우 의견에 질문하십시오.

입력

프로그램에 대한 입력은 단일 integer n뒤에 공백과 특정 숫자가 밑줄로 바뀐 숫자로 구성됩니다. 예를 들어, 다음은 가능한 입력입니다.

3 6__2__4508

n 은 1보다 큽니다. 숫자는 완전히 밑줄이되지 않습니다. 첫 번째 숫자가 밑줄이 아니라고 보장 할 수 없습니다. 첫 번째 숫자는 0 이 아닙니다. n 은 숫자의 자릿수보다 크거나 같습니다.

산출

결과 숫자가 n으로 체인으로 나눌 수 있도록 숫자를 정수로 대체하여 숫자를 출력하십시오 . 사슬-분할 수를 완성하는 여러 방법이 존재하는 경우, 어떤 것도 출력으로 사용될 수 있습니다. 완료 할 수있는 숫자가 없으면을 출력하십시오 no answer. 예를 들어, 입력 예의 출력은 다음과 같습니다.

6132794508

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.


I는 경우 가정 n이상의 해당 번호의 자릿수와 동일하고, 숫자는 체인 나눌?
John Dvorak

@Jan Dvorak n은 입력 된 자릿수보다 크거나 같지 않습니다. 항상 더 작을 것입니다. 이를 반영하여 편집하겠습니다.
absinthe

전체 프로그램을 작성해야합니까, 아니면 기능이 충분합니까?
John Dvorak

@ 마틴 네. 글자 수 제한 패딩.
absinthe

@Jan Dvorak 전체 프로그램.
absinthe

답변:


5

Bash + coreutils, 197 바이트

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

산출:

$ ./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
$

설명

  • 매개 변수 확장 ${2//_/{0..9\}}은 모든 밑줄을로 바꿉니다 {0..9}.
  • 결과 문자열은 eval이 중괄호 표현식을 모두 확장합니다.
  • grep어떤 반복 숫자가 모든 가능성을 잡초.
  • 그런 다음 조건 1과 조건 2에 대해 나머지 숫자가 하나씩 확인됩니다.

2

파이썬 -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'

느리지 만 짧습니다. 주어진 패턴과 가능한 모든 N 자리 순열을 비교하고 모든 요구 사항을 확인하십시오. 7 자리 또는 8 자리 숫자로만 테스트했습니다. 9 또는 10에도 작동하지만 꽤 오래 걸릴 것입니다.

편집 : 누락 된 기본 출력 "응답 없음"을 추가했습니다.


2

매스 매 티카 루비, 349 224 229 바이트

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

이것은 매우 순진한 구현입니다. 나는 밑줄의 수를 세고, 가능한 한 모든 조합을 무력화하기 위해 해당 길이의 모든 숫자 순열 목록을 작성합니다. 이것은 많은 수의 밑줄에 끔찍하게 수행되지만 코드 골프이며 가장 빠른 코드는 아닙니다. :)

편집 : Mathematica에서 이것을 포팅했습니다. 원본 버전의 편집 내역을 참조하십시오.

편집 : 밑줄이 수정되었습니다.


튜플 대신 (문자 수를 내려다 보는) 순열을 사용해서는 안됩니까?
DavidC

@DavidCarraher 왜? 나는 거기에 많은 조합이 빠져있을 것입니다.
Martin Ender

숫자의 각 숫자는 고유해야합니다. Tuples그 제약을 강요하지 않습니다. Permutations입력 세트에 반복 숫자가없는 경우 그리고 아직 사용되지 않은 숫자 만 치환 할 수 있습니다. (여전히 코드가 길어질 수 있습니다.)
DavidC

@DavidCarraher Ohhh, 나는 고유성 요구 사항을 간과했다. 그런 다음 내부 루프에 추가해야합니다.이 경우 Tuples더 짧기 때문에 붙어있을 수도 있습니다 .
Martin Ender

@DavidCarraher가 수정되었습니다.
Martin Ender

1

자바, 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);}}}

덜 골프, 설명 :

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);
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.