Bài toán 9 chữ số


8

Viết chương trình tìm một số gồm 9 chữ số trong đó mỗi chữ số từ 1 đến 9 chỉ xuất hiện một lần. Con số này cũng phải đáp ứng các yêu cầu chia hết này:

  1. Số phải chia hết cho 9.
  2. Nếu chữ số ngoài cùng bên phải bị xóa, số còn lại sẽ chia hết cho 8.
  3. Nếu chữ số ngoài cùng bên phải của số mới bị xóa, số còn lại sẽ chia hết cho 7.
  4. Và cứ như vậy, cho đến khi chỉ còn một chữ số (sẽ nhất thiết phải chia hết cho 1).

Tín dụng Dávid Németh


28
Quy tắc đầu tiên có vẻ không cần thiết. Bất kỳ số nào bao gồm các chữ số 1-9 một lần, mỗi số sẽ luôn chia hết cho 9.
Geobits

6
Các khía cạnh mã ở đây là gì? Điều này nghe có vẻ như có thể được đăng trên Puzzling
Simon Forsberg

11
Ngay cả khi chúng ta sẽ gọi nó là một lỗ hổng tiêu chuẩn của Google, các thử thách chơi gôn mã tạo ra một đầu ra cố định thường ngắn hơn bất kỳ mã nào có thể xây dựng nó thường không đặc biệt thú vị.
Ry-

9
Vấn đề tôi gặp phải với những thách thức như thế này là ranh giới giữa mã hóa cứng và áp dụng các thuộc tính toán học là mơ hồ. Ví dụ, quy tắc chia hết cho 5 là số phải kết thúc bằng 0 hoặc 5. Có giới hạn các lựa chọn cho chữ số đó thành 0 và 5 phần mã hóa của đầu ra không? Sẽ còn tệ hơn nữa nếu chúng ta xử lý các số có 10 chữ số.
user2357112 hỗ trợ Monica

4
@Sylwester Những gì bạn đã làm được cho là chỉ có 1 cách để giải quyết vấn đề, bởi vì bạn sợ phá vỡ kẽ hở. "Lặp lại yêu cầu kiểm tra số". Điều này hoàn toàn loại trừ bất kỳ ví dụ thú vị. Và câu hỏi là: "Ngôn ngữ nào có thể kiểm tra những điều này và lặp lại trong một vài ký tự".
Cruncher

Câu trả lời:


9

CJam - 26

1{;9,:)_mrs0@{_3$<i\%+}/}g

Nó ngẫu nhiên nhưng hoạt động khá nhanh với trình thông dịch java . Có thể mất vài phút với thông dịch viên trực tuyến .

Giải trình:

1đẩy 1 (sẽ được giải thích sau)
{…}glà một vòng lặp do-while
;loại bỏ một giá trị khỏi ngăn xếp (ban đầu là 1 chúng ta đã bắt đầu)
9,làm cho mảng [0 ... 8]
:)tăng các phần tử mảng, dẫn đến [1 ... 9]
_sao chép mảng
mrxáo trộn mảng
schuyển đổi thành chuỗi
0@đẩy 0 sau đó đưa bản sao khác của mảng lên trên
{…}/là một vòng lặp for (mỗi số 1 ... 9)
_sao chép số hiện tại (hãy gọi nó là "k" )
3$sao chép chuỗi số từ ngăn xếp
<ilấy chuỗi con với k ký tự đầu tiên sau đó chuyển đổi thành
\%hoán đổi số nguyên với bản sao khác của k sau đó lấy phần còn lại (% k)
+thêm phần còn lại vào giá trị trước đó trên ngăn xếp (ban đầu là 0 từ trên )
Tại thời điểm này, chúng ta có chuỗi số trên ngăn xếp, theo sau là 0 nếu số đó khớp với tất cả các yêu cầu (tức là tất cả các phần còn lại là 0) hoặc giá trị khác 0.
Đỉnh của ngăn xếp trở thành điều kiện vòng lặp do-while. Nó được bật lên và vòng lặp tiếp tục nếu điều kiện là đúng.
Nếu chúng tôi tìm thấy giải pháp, điều kiện là 0 (sai), vòng lặp kết thúc và phần còn lại của ngăn xếp (chuỗi số) được in.
Nếu đó không phải là giải pháp, điều kiện là giá trị khác 0 (đúng) và vòng lặp tiếp tục với chuỗi trên ngăn xếp. Chuỗi được bật lên khi bắt đầu lần lặp tiếp theo (vì vậy vòng lặp mong đợi một giá trị trên ngăn xếp và đó là lý do cho 1 ban đầu).

Cảm ơn Dennis vì đã làm cho mã ngắn hơn và phức tạp hơn: p


Đẹp! Bạn có thể lưu thêm một byte bằng cách sử dụng giá trị giả:0{;9,:)_mrsT@{_3$<i\%+}/}g
Dennis

7

Javascript (E6) 105 125 134

Xây dựng đệ quy của số, mỗi bước kiểm tra tính phân chia.
Thời gian chạy gần 0 giây
Không có I / O lần này, vì OP đã yêu cầu chương trình tìm số và số được tìm thấy và tự động đăng nhập vào bảng điều khiển

Chơi golf lịch sự hơn với MT0

(Q=(n,d,b)=>([(m=n+(s=[...b]).splice(i,1))%d||Q(m,d+1,s)for(i in b)],d>9&&(Q.z=n),Q.z))('',1,'123456789')

Chơi gôn

(Q=(n='',d=1,b=[...'123456789'],i)=>{
for(i=0;s=[...b],m=n+s.splice(i,1),b[i];i++)m%d||Q(m,d+1,s);d>9&&(Q.z=n);return Q.z;
})()

Xấu xí

(Q=(n='', d=1, b=[...'123456789'], i) => {
   for(i=0; s=[...b], m=n+s.splice(i,1), b[i]; i++)
     m % d || Q(m,d+1,s);
   d > 9 && (Q.z=n);
   return Q.z;
})()

Tặng kem

Với 3 thay đổi nhỏ, bạn có thể sử dụng cùng một hàm để tìm các số dài hơn bằng cách sử dụng cơ sở> 10. Ví dụ trong cơ sở 14 ...

(Q=(n='',d=1,b=[...'123456789ABCD'],i)=>{
  for(i=0; s=[...b], m = n+s.splice(i,1), b[i]; i++)
    parseInt(m,14)%d || Q(m,d+1,s);
  d>13 && (Q.z=n);
  return Q.z;
})()

9C3A5476B812D

Ung dung

Q=(n,d,b,i,c,z)=>{ // i,c,z fake parameters instead of vars.
  for (i=0; b[i]; i++)
  {
    s=[...b];
    m = n + s.splice(i,1);
    if (m % d == 0)
      if (z = d<9 ? Q(m, d+1, s) : m) return z;
  }
}
Q('',1,[...'123456789'])

1
105 Nhân vật:(Q=(n,d,b)=>([(m=n+(s=[...b]).splice(i,1))%d||Q(m,d+1,s)for(i in b)],d>9&&(Q.z=n),Q.z))('',1,'123456789')
MT0

101 nhân vật:(Q=(n,d,b)=>Math.max(...[(m=n+(s=[...b]).splice(i,1))%d||Q(m,d+1,s)for(i in b)],n))('',1,'123456789')
MT0

@ MT0 wow! Sự hiểu biết mảng đình công trở lại. Tôi sẽ lấy số thứ nhất, vì người khác có thể tìm thấy một số sai nếu không đúng (IE đếm tối đa 7 thay vì 9).
edc65

5

Perl, 56

Sử dụng: perl -E '...'

{$s++;redo if grep{$s!~$_||substr($s,0,$_)%$_}1..9}say$s

Đầu ra: 381654729

Chương trình này thực sự chậm . Như trong hơn 3,5 giờ.

Như một bài tập thú vị hơn, tôi quyết định phát triển một thuật toán cực kỳ nhanh:

my $set = [1..9];
for my $divisor (2..9) {
    my $newset = [];
    for my $element (@$set) {
        my $num = $element * 10;
        for (my $digit = $divisor - ($num % $divisor); $digit < 10; $digit += $divisor) {
            if (index($element, $digit) == -1) {
                push @$newset, $num + $digit;
            }
        }
    }
    $set = $newset;
}

print "@$set\n";

Ở trên chạy trong 0,00095 giây và xác nhận rằng chỉ có một giải pháp cho vấn đề này.


5

Python3, 214, 199, 184, 176, 174, 171, 165, 150, 146

from itertools import*
g=lambda i,d:d==1!=print(i)or int(i[9:])%d==0!=g(i[:-1],d-1)
for x in permutations("123456789"):g("".join(map(str,x))*2,9)

đầu ra:

381654729

Đây là kịch bản golf đầu tiên của tôi. Hy vọng bạn thích nó :)


4

Pyth , 33 ký tự

=Y]kFkY~Yf>ql{TlT%vTlTm+k`dr1T)pk

Để kiểm tra nó, đặt mã ở trên làm đầu vào tiêu chuẩn trong liên kết trong tiêu đề.

Sau khi biên dịch thành Python 3.4:

k=''
T=10
Y=[k]
for k in Y:
 Y+=list(filter(lambda T:(len(set(T))==len(T))>(eval(T)%len(T)),
                map(lambda d:k+repr(d),range(1,T))))
print(k)

Giải trình:

=Y]k:Y=['']

FkY: cho k trong F:

~Y: Thêm vào Y

f: Lọc bởi

>ql{TlT: Tất cả các yếu tố độc đáo và

%vTlT: eval (phần tử)% len (phần tử) = 0

m+k` d Trong danh sách k + repr (d)

r1T: cho d từ 1 đến 9.

): Kết thúc vòng lặp

pk: in k


4

Ruby, 66 78 ký tự

[*r=1..9].permutation{|i|r.all?{|x|eval(i[0,x]*"")%x<1}&&$><<i*""}

Thời gian chạy là ~ 8 giây (đầu ra được in sau 3 giây).

Điều này không dừng lại sau khi tìm thấy số đầu tiên, vì vậy về mặt kỹ thuật, nó in tất cả các số đáp ứng các tiêu chí - nhưng vì chỉ có một số như vậy, nên nó không tạo ra sự khác biệt.

Hồng ngọc 1.8, 63

[*r=1..9].permutation{|i|r.all?{|x|eval(i[0,x]*"")%x<1}&&$><<i}

Thực chất là giải pháp tương tự như trên. Trong Ruby 1.8, các mảng được chuyển đổi thành các chuỗi bằng cách gọi ngầm Array#joinchúng, vì vậy chúng ta có thể lưu cuộc gọi đến đó. Điều thú vị là mã cũng chạy nhanh hơn nhiều trong Ruby 1.8 so với 2.0 (tổng thời gian chạy 4,5 giây, đầu ra được in sau 1,6 giây).


3

GolfScript (35 ký tự)

1,{{10*){.)}8*}%{`..&=},{.`,%!},}9*

Bản demo trực tuyến

Điều này xây dựng các tiền tố thỏa mãn điều kiện.

# Initial prefixes: [0]
1,
# Loop 9 times
{
    # Extend each prefix by digits 1 to 9
    {10*){.)}8*}%
    # Filter out ones which repeat a digit
    {`..&=},
    # Filter down to ones which are divisible by their length
    {.`,%!},
}9*

3

Haskell 129 121

Đây là nỗ lực Haskell nghiệp dư của tôi (đề xuất / cải tiến sẽ được đánh giá rất cao). Nó có thể không phải là ngắn nhất, nhưng nó chỉ thực hiện trong.19 0,65 giây sau khi Flonk thay đổi hệ thống của tôi.

import Data.List;f=foldl1$(+).(*10);main=print$[f x|x<-permutations[1..9],f[mod(read.take y.show$f x)y|y<-[9,8..1]]<1]!!0

Chào mừng đến với PPCG.SE! Hãy thử thêm <!-- language: lang-haskell -->hai dòng trước mã của bạn để làm nổi bật cú pháp!
Flonk

Và tôi thực sự đã tìm ra cách để cứu thêm 8 nhân vật! Thay vì kiểm tra xem mỗi phần còn lại == 0, bạn có thể tổng hợp tất cả chúng và kiểm tra xem đó có phải là == 0 hay không. foldl1Tuy nhiên, bằng cách tách biệt thành một hàm, bạn có thể sử dụng hàm đó thay vì sumhoặc any. import Data.List;f=foldl1$(+).(*10);main=print$[f x|x<-permutations[1..9],f[mod(read.take y.show$f x)y|y<-[9,8..1]]<1]!!0
Flonk

Có vẻ như bạn đã đếm các ký tự của mình bao gồm cả dòng mới: chỉ có 128 ký tự trong mã của bạn.
Peter Taylor

@Flonk Tôi hoàn toàn thích việc sử dụng fhàm trên modvị ngữ để tránh viết Foldl1, mặc dù các chu trình bổ sung làm cản trở hiệu suất nghiêm trọng.
DrJPepper

@DrJPepper 0,65 giây? Meh. Hãy làm cho điều đó tồi tệ hơn! Bạn cũng có thể thay thế !!0bằng một cuộc gọi đến f, hoạt động vì chỉ có một mục trong danh sách. Danh sách [9,8..1]cũng có thể được thay thế bởi xvì thứ tự không quan trọng. Nói về việc tái sử dụng mã!
Flonk

2

Javascript 75 (chấm dứt)

Dung dịch Bruteforce (siêu chậm)

for(a=c=1;b=c&&++a;)for(c=9;~(a+'').search(c)&&b%c<1;)--c?b=b/10|0:alert(a)

Nếu bạn muốn xem kết quả trong đời này, hãy cập nhật giá trị ban đầu thành một cái gì đó như a=c=38e7

Javascript 70 (không kết thúc)

for(a=1;b=++a;)for(c=9;~(a+'').search(c)&&b%c<1;)--c?b=b/10|0:alert(a)

Và chỉ để cho vui, một bruteforce ngẫu nhiên chạy nhanh hơn nhiều: (chỉ ES6)

for(a=i=[..."123456789"];b=c=i&&a.sort(x=>Math.random()*9-5|0).join('');)for(i=9;c%i<1;)--i?c=c/10|0:alert(b)

2

Con trăn 142, 139, 125, 124

Về cơ bản giống như giải pháp của @ Ventero nếu tôi hiểu chính xác mã của anh ấy, nhưng bằng Python. (Phần lớn tín dụng được chuyển đến @Greg Hewgill.)

from itertools import*;print[s for s in map(''.join,permutations('123456789'))if all(t(s[:i])%i==0 for i in range(1,9))][0]

Bạn sẽ có thể thay thế r(9,1,-1)bằng r(9), vì thứ tự lặp không thực sự quan trọng.
Ventero

Bạn sẽ phải sử dụng r(1,9)%0có lỗi.
Greg Hewgill

@GregHewgill Ah, tất nhiên là bạn đúng, đã không nhận ra nó bắt đầu bằng 0. Đoán xem rõ ràng tôi không phải là chuyên gia Python. :)
Ventero

@Ventero Cảm ơn vì tiền boa, Greg đúng tôi sẽ phải sử dụng r(1, 9)Python.
Ashwini Chaudhary

1
Sử dụng permutations("123456789")''.join(s[:i])có thể ngắn hơn những gì bạn có (và sau đó bạn có thể loại bỏ r=range)
Greg Hewgill

2

Scala (128 ký tự)

Cú đâm của tôi vào đây ...

Seq(1,2,3,4,5,6,7,8,9).permutations.filter(p=>(2 to 8)forall{n=>(p.take(n).mkString.toLong%n==0)}).map(_.mkString.toLong).toList

Bạn có thể lưu một ký tự bằng cách loại bỏ khoảng trắng giữa (2 to 8)forall.
Chương trìnhFOX

@ProgramFOX Tôi không có ý tưởng. Tôi đã luôn nghĩ rằng một dấu chấm hoặc một không gian được yêu cầu ở đó. Cảm ơn, tôi đã chỉnh sửa xuống 128 ký tự.
Keith Pinson

2

Perl, 72

Sử dụng: perl -M5.010 find-9-digits.pl

{$s=join'',sort{4-rand 8}1..9;redo if grep{substr($s,0,$_)%$_}2..9}say$s

Đầu ra: 381654729

Chương trình này chậm . Có thể mất hơn 10 giây, vì nó xáo trộn các chữ số "123456789", nhưng việc xáo trộn có một lỗ hổng.

Ung dung:

# Enter a block.
{
     # Shuffle the characters "123456789".
     $s = join('', sort({2 - rand(4)} 1..9));

     # Redo block if any divisiblity test fails; grep returns the
     # number of failing tests.
     redo if grep({
        # For each divisor $_ in 2..9, test if the first $_ digits of
        # of $s are divisible by $_.  The test fails if the remainder
        # is a true value (not zero).
        substr($s, 0, $_) % $_
     } 2..9);
}
say $s;

Tôi đánh gôn mã xáo trộn mảng các chữ số 1..9:

  • use List'Util shuffle;shuffle 1..9 (34 ký tự)
  • sort{(-1,1)[rand 2]}1..9 (24 ký tự)
  • sort{.5<=>rand}1..9 (19 ký tự)
  • sort(2-rand 4}1..9 (18 ký tự)
  • sort{4-rand 8}1..9 (18 ký tự)

Perl mong muốn khối sắp xếp so sánh $ a$ b một cách nhất quán. Các khối sắp xếp của tôi không bao giờ nhìn vào $ a$ b . Họ trả lại một thứ tự ngẫu nhiên để sắp xếp trở thành một shuffle.

Nếu tôi sử dụng sort{.5<=>rand}1..9, chương trình của tôi sẽ chạy nhanh hơn. Cái đó so sánh 0,5 với số float ngẫu nhiên từ 0,0 đến 1,0, ngoại trừ 1,0, với cơ hội 1/2 là $ a <$ b và gần 1/2 cơ hội là $ a> $ b . ( Coi chừng: Đây là một "Microsoft shuffle" , đây không phải là một sự xáo trộn công bằng. Điều này có sự thiên vị vì .5<=>randkhông cung cấp một trật tự nhất quán.)

Giả sử rằng tôi chơi golf một nhân vật và sử dụng tồi tệ hơn nhiều sort(2-rand 4}1..9. Perl hy vọng khối sắp xếp trả về một số nguyên, nhưng 2-rand 4là một số float. Nó là một float ngẫu nhiên từ -2.0 đến 2.0, không bao gồm -2.0. Perl cắt ngắn số float này về 0, với các kết quả sau:

  • 1/4 cơ hội $ a <$ b , số nguyên -1 từ -2.0 <float <= -1.0
  • gần 1/2 cơ hội $ a == $ b , số nguyên 0 từ -1.0 <float <1.0
  • gần 1/4 cơ hội $ a> $ b , số nguyên 1 hoặc 2 từ 1.0 <= float <= 2.0

Khi $ a == $ b , Perl không xáo trộn tốt. Vì vậy, chương trình của tôi sẽ thực hiện nhiều lần xáo trộn hơn, cho đến khi nó nhận được đủ số lần xáo trộn mà 2-rand 4không trả về 0 quá thường xuyên. Chương trình của tôi sẽ chạy rất chậm, có thể mất hơn một phút.

Tôi sử dụng sort{4-rand 8}1..9, vì vậy chỉ có 1/4 cơ hội $ a == $ b và chương trình của tôi sử dụng ít lần xáo trộn hơn.


Shuffle cuộn tay đẹp
Miller

1

CJam, 35 byte

0{)_`$A,1>s=!1$9,{9\m1$\%@+\A/}/;}g

Sau khoảng 27 phút, điều này tạo ra đầu ra sau:

381654729

Làm thế nào nó hoạt động

0         " Push 0 (“n”).                                                      ";
{         "                                                                    ";
  )_`$    " Increment “N”, duplicate, stringify and sort the resulting string. ";
  A,1>s   " Push '123456789'.                                                  ";
  =!      " Push 0 if the strings are equal and 1 otherwise (“a”).             ";
  1$      " Copy “n”.                                                          ";
  9,{     " For each i in [ 0 1 2 3 4 5 6 7 8 ].                               ";
    9\m   " Calculate “9 - i”.                                                 ";
    1$\%  " Calculate “n % (9 - i)”.                                           ";
    @+    " Add the result to “a”.                                             ";
    \A/   " Swap “a” with “n” and calculate “n / 10”.                          ";
  }/      "                                                                    ";
  ;       " Discard “n”.                                                       ";
}g        " If “a > 0”, repeat the loop.                                       ";

Kích thước ấn tượng, nhưng dường như còn chậm hơn cả tôi và tôi nghi ngờ điều đó không đúng
aditsu đã bỏ cuộc vì SE là EVIL

Tôi không hoàn toàn hiểu nó, nhưng dường như chấp nhận 0 là một chữ số? Ngoài ra, khi nào nó dừng lại?
aditsu nghỉ việc vì SE là EVIL

1

Con trăn 2 (78)

x=1
while len(set(`10*x`))<=9+sum(x/10**i%(9-i)for i in range(9)):x+=1
print x

Không cần tạo hoán vị, chỉ cần thử từng số và kiểm tra xem các chữ số của nó cộng với 0 có khác biệt không. Mất một lúc để chạy.


1

SWI-Prolog 84

g([],O,_,O).
g(L,N,I,O):-nth1(_,L,D,R),M is N*10+D,J is I+1,0 is M mod J,g(R,M,J,O).

Đó là một chút gian lận, bởi vì danh sách các chữ số cần được cung cấp trong truy vấn:

?- g([1,2,3,4,5,6,7,8,9],0,0,O).
O = 381654729 ;
false.

Tuy nhiên, đó là điều làm cho mã này thú vị: bạn có thể giải quyết vấn đề cho bất kỳ danh sách chữ số nào. Ví dụ:

?- g([1,2,3,4,5,6,7,8,9,0],0,0,O).
O = 3816547290 ;
false.

?- g([1,2,3,4,5,6,7,8],0,0,O).
O = 38165472 ;
false.

?- g([1,2,3,4,5,6,7],0,0,O).
false.

?- g([1,2,3,4,5,6],0,0,O).
O = 123654 ;
O = 321654 ;
false.

?- g([2,2,3,3,5,6,7,8,9],0,0,O).
O = 363258729 ;
O = 363258729 ;
O = 363258729 ;
O = 363258729 ;
O = 723258963 ;
O = 723258963 ;
O = 723258963 ;
O = 723258963 ;
false.

1

Con trăn 2 - 114

Thậm chí không phải là giải pháp Python ngắn nhất, nhưng dù sao tôi cũng đang chia sẻ nó:

e=""
f=lambda s,n:[[n,e.join(f(s.replace(j,e),n+j)for j in s)][s>e],e][n>e>0<int(n)%len(n)]
print f("123456789",e)

1

Bash + coreutils, 159 byte

l=`echo {1..8}`
for d in {2..8};{
l=$(printf "a=%s;if(!a%%$d)a\n" $(eval echo {${l// /,}}{1..8}|tr \  '
'|grep -Pv '(\d).*\1')|bc|paste -d\  -s -)
}
echo ${l}9

Điều này khá dài, nhưng tôi nghĩ thuật toán có lẽ là một trong những cách nhanh nhất, vì đây là một kịch bản shell (thường chậm) chạy trong chưa đầy 0,1 giây.

Thuật toán đi như thế này:

  • Bắt đầu với chữ số ngoài cùng bên trái (1-8)
  • nối chữ số tiếp theo bên phải (1-8)
  • xóa mọi số có chữ số lặp lại ( grep)
  • kiểm tra tính phân chia theo $d(số chữ số) bằng cách sử dụng bcbiểu thức được tạo bởiprintf
  • Lặp lại như trên cho đến khi có được một số gồm 8 chữ số

Lưu ý rằng chúng tôi có một vài phím tắt, nhưng tôi nghĩ đây là những âm thanh toán học:

  • Chữ số ngoài cùng bên trái phải chia hết cho 1, là tất cả các chữ số, vì vậy chúng tôi không kiểm tra rõ ràng cho tập hợp đầu tiên của các chữ số ngoài cùng bên trái
  • Chữ số ngoài cùng bên phải phải là 9 (thực ra tôi không chắc đây có phải là giả định hợp lệ không - tôi sẽ phải suy nghĩ một chút)

1

C ++, 187

Tôi chỉ phải thử điều này trong C ++. Rõ ràng, nó sẽ không phải là giải pháp ngắn nhất nhưng đây là:

#include <algorithm>
using namespace std;bool c(int n,int d=9){return d<2||n%d==0&c(n/10,d-1);}int main(){for(char n[]="123456789";next_permutation(n,n+9);)if(c(atoi(n)))return atoi(n);}

trả về số thay vì in nó để lưu một số ký tự (bao gồm cả chết tiệt). Trong các hệ thống POSIX, điều này tất nhiên sẽ được chuyển đổi thành 8 bit không dấu và do đó không chính xác - nhưng chương trình sẽ tính toán một số chính xác.

Ungolfed (yêu cầu C ++ 11):

#include <iostream>
#include <algorithm>
using namespace std;

bool check(int n, int digit = 9)
{
  return (n % digit==0) && (digit == 1 || check(n/10,digit-1));
}

int main()
{
  string num {"123456789"};
  while (next_permutation(begin(num), end(num)))
    if (check(stoi(num))){
      cout << num << endl;
      break;
    }
}

1

T-SQL 2005+ - 203

T-sql không phải là một ngôn ngữ golf rất cạnh tranh ...

with A(n)as(select top 10 number from spt_values where'p'=type),R as(select \r,1l union all select r*10+n,l+1from R,A where n not in(select substring(str(r),n,1)from A)and(r*10+n)%l=0)select max(r)FROM R

Phải được chạy trên cơ sở dữ liệu chủ. Bạn có thể thay thế CTE đầu tiên bằng CTE này để biến nó thành cơ sở dữ liệu bất khả tri nhưng sau đó nó sử dụng thêm một vài ký tự (và yêu cầu 2008)

with A as(select*from(VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9))f(n))

Đội hình dễ đọc:

 with A(n)as(select top 10 number from spt_values where'p'=type),
    R as(select \ r,1 l 
        union all 
        select r*10+n,l+1
        from R,A
        where n not in (
            select substring(str(r),n,1)
            from A
        )
        and(r*10+n)%l=0)
select max(r) FROM R

Về cơ bản, chúng tôi tiếp tục thêm các chữ số vào mặt sau của rsố mà chúng tôi chưa thấy trong chuỗi và đảm bảo rằng chuỗi mới vẫn là modulo 0 của mức hiện tại. Chúng tôi khởi tạo R thành \, Đây thực sự là mẹo duy nhất trong mã này. Đó là một cách điên rồ để đặt nó thành 0 trong moneykiểu dữ liệu. Tôi đang đoán một cách để cho phép bạn gõ \thay vì tiền tệ. $cũng thực hiện điều tương tự trong T-SQL, nhưng $lsẽ cố gắng diễn giải một cột giả không tồn tại và gây ra lỗi. Điều này cho phép chúng tôi tránh lo lắng về việc sử dụngintđiều này sẽ gây ra tràn bình thường ở phần nối thứ 10, buộc chúng ta phải thực sự kiểm tra mức độ. Chỉnh sửa: Thực tế thú vị T-sql ngay cả trong năm 2014 không có cách xây dựng để biến một chuỗi thành một bảng các giá trị (ví dụ: không phân tách func), vì vậy chúng tôi thực sự cũng phải sử dụng lại Abảng của mình hai lần để lặp lại các ký tự trong xâu chuỗi

Các quy tắc ưu tiên T-Sql gây khó chịu vì vậy chúng tôi phải sử dụng phép nối số (* 10 + n), thay vì nối chuỗi.


Bạn có thể lưu 5 byte và cho phép nó chạy trên tất cả các loại cơ sở dữ liệu bằng cách thay thế hàng đầu tiên bằng:with A as(select 1n union all select n+1 from A where n<9),
Thoải

Điểm tốt. Trong mã thực, tôi sẽ không bao giờ sử dụng rCTE để đếm vì vậy tôi thậm chí không bình minh để thử nó!
Michael B

0

PHP, 89 byte

phiên bản ngẫu nhiên, 89 byte:

for($n=123456789;$n=str_shuffle($n);$d||die("$n"))for($d=10;--$d&&substr($n,0,$d)%$d<1;);

xáo trộn một chuỗi chứa các chữ số, sau đó kiểm tra tính chia hết trong một vòng lặp.

Chạy với -nr.


vòng lặp vũ phu, 90 byte, rất chậm:

for(;++$i<1e9;$d||die("$i"))for($d=10;--$d&&max(count_chars($i))<2&substr($i,0,$d)%$d<1;);

các vòng lặp từ 100000001, kiểm tra tính phân chia trong vòng lặp bên trong và thoát khi tìm thấy giải pháp.


Hàm đệ quy, 94 byte, rất nhanh:

function f($n="",$e=1){while($d++<9)strpos(_.$n,"$d")|($x=$n.$d)%$e||print$e>8?$x:f($x,$e+1);}

nối thêm một chữ số mà các số chưa có trong số đó, nếu tính phân chia theo độ dài được đưa ra, hãy lặp lại (hoặc in).

Điều này khai thác rằng chỉ có một giải pháp. không có điều đó, print$e>8?$x:f($x,$e+1)phải là print$e>8?"$x\n":f($x,$e+1)(+3 byte, in tất cả các giải pháp) hoặc ($e>8?die("$x"):f($x,$e+1))(+4 byte, thoát ở giải pháp đầu tiên) hoặc các giải pháp sẽ được in mà không có dấu phân cách.

Gọi với f();

-

TiO

Phiên bản brute force không có TiO vì những lý do rõ ràng, nhưng bạn có thể thử hai phiên bản còn lại .

Chức năng thời gian chạy của lệnh gọis được đo nội tuyến (khoảng từ 2 đến 4 mili giây);
tổng thời gian chạy được đo bởi trang web (thường từ 50 đến 500 ms).

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.