Tổng các chữ số từ 1 đến 7


21

Thử thách

Cho một số nguyên dương Nđó là 28 hoặc cao hơn, sản lượng một danh sách các số tổng hợp để Nsử dụng mà mỗi chữ số 1thông qua 7đúng một lần. Bạn có thể đưa ra như một chương trình hoặc chức năng.

Các chữ số có thể tự xuất hiện hoặc ghép nối, miễn là bạn sử dụng từng chữ số một lần mà không lặp lại. Ví dụ, [12, 34, 56, 7]là hợp lệ, như là [1, 27, 6, 4, 35], và [1234, 567]không [123, 34567]hoặc [3, 2, 1476]. Thứ tự mà các số được liệt kê không quan trọng.

Nếu Nkhông thể được thực hiện với 1-7, trả lại hoặc đầu ra không có gì.

Thông tin khác

  • Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte vào thứ năm ngày 15 tháng 10 sẽ thắng.

  • Đặt bất kỳ câu hỏi trong các ý kiến.

  • Bất cứ điều gì tôi không chỉ định trong thử thách là tùy thuộc vào bạn.

  • Sơ hở tiêu chuẩn là không được phép.

Ví dụ

Đây có thể xóa bất kỳ sự nhầm lẫn lên:

Đầu vào

28

Đầu ra

[1, 2, 3, 4, 5, 6, 7]

Đầu vào

100

Đầu ra

[56, 7, 4, 31, 2]

Đầu vào

1234567

Đầu ra

[1234567]

Đầu vào

29

Đầu ra

Không có gì, 29 là không hợp lệ.

Đầu vào

1891

Đầu ra

[1234, 657]

Đầu vào

370

Đầu ra

[15, 342, 7, 6]

Tôi sẽ làm thêm nếu cần.

Đây là một quá khứ của tất cả các số có thể được tạo ra với bảy số này, với sự giúp đỡ của FryAmTheEggman.


Đầu ra để làm 29gì?
Geobits

4
Nếu bạn muốn đầu ra không có gì, đừng đặt (N/A)đầu ra.
mbomb007

1
@LukStorms [1234566, 1]không phải là đầu ra hợp lệ, vì 6 được lặp lại. Bạn không thể lặp lại số trong đầu ra.
The_Basset_Hound

2
Có thể »... một danh sách các số được tạo từ các chữ số thập phân 1 đến 7 có tổng bằng N« là một từ ngữ rõ ràng hơn so với số hiện tại trong câu hỏi.
Paŭlo Ebermann 8/10/2015

3
Đối với một giải pháp có hiệu lực một chút ít vũ phu: Đây là tương đương với gán một power-of-10 hệ số cho mỗi 1, ..,, 7sao cho có ít nhất càng nhiều 1là như 10's, ít nhất là nhiều 10's như 100' s, và vân vân.
xnor

Câu trả lời:


9

Bình thường, 18 14 byte

hfqSjkTjkS7./Q

Cảm ơn @isaacg đã chơi golf 2 byte và mở đường cho 2 người nữa.

Mã sẽ sập nếu nó không tạo ra đầu ra, điều này khiến cho không có đầu ra nào được tạo ra.

Điều này sẽ hoạt động cho các đầu vào nhỏ nếu bạn đủ kiên nhẫn và cho các đầu vào lớn hơn nếu có đủ thời gian và bộ nhớ.

Để xác minh rằng mã công trình như dự định, bạn có thể thay thế 7với một 3cho các khoản tiền của các chữ số từ 1 đến 3 . Nhấn vào đây để một bộ thử nghiệm.

Ví dụ chạy

$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 28
(1, 2, 3, 4, 5, 6, 7)

real    4m34.634s
user    4m34.751s
sys     0m0.101s
$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 29 2>/dev/null

real    9m5.819s
user    9m6.069s
sys     0m0.093s

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

           ./Q    Compute all integer partitions of the input.
 f                Filter the integer partitions:
    jkT             Join the integers with empty separator.
   S                Sort the characters of the resulting string.
      jkS7          Join [1, ..., 7] with empty separator.
  q                 Check both results for equality.
                  Keep the partition of `q' returned True.
h                 Retrieve the first element of the filtered list.
                  For a non-empty list, this retrieves the solution.
                  For the empty list, it causes an error and produces no output.

2
Làm tốt! Khá là một cách tiếp cận sáng tạo. `` `MS7`` ngắn hơn r\1\8. Cũng @ .. 0giống như h.
isaacg

@isaacg Cảm ơn! Tôi không chắc là tôi đã bỏ lỡ như thế nào h, nhưng tôi không biết bạn có thể sử dụng Stheo cách đó. (Tài liệu tham khảo char trong trình thông dịch trực tuyến không đề cập đến nó.) jkS7Dường như còn ngắn hơn, vì tôi không cần snữa.
Dennis

5

Trăn 3, 109

def f(n,s=set('1234567'),l='0,'):[f(n,s-{x},l+x+c)for c in(',','')for x in s]or n-sum(eval(l))or~print(l[2:])

Một hàm lấy một số và xuất ra một tuple giống như 123,4567,. Vâng, đây là một tuple hợp lệ.

Ý tưởng là để tạo ra tất cả các chuỗi có thể giống như 43,126,7,5,có các chữ số 1thông qua 7nhau bằng dấu phẩy, không có hai dấu phẩy liên tiếp. Đánh giá biểu thức này dưới dạng một tuple và tổng của nó bằng n, in nó và chấm dứt với lỗi.

Để xây dựng tất cả các chuỗi như vậy, chúng tôi theo dõi tập hợp scác ký tự sẽ sử dụng và thử nối từng chuỗi bằng dấu phẩy, làm cho chữ số kết thúc mục nhập hoặc không có, trong trường hợp đó, các chữ số trong tương lai sẽ ghép vào nó.

Việc chập mạch được sử dụng để kiểm tra xem slà trống rỗng, vì danh sách-comp là trống rỗng, và rằng n==sum(eval(l)), trong trường hợp mà chúng tôi in lvà chấm dứt với một lỗi bằng cách tham gia ~của Nonetrở lại bằng cách in (nhờ Sp3000 cho việc này.).

Tôi tin rằng trong Python 3.5, hai ký tự có thể được lưu bằng cách viết s={*'1234567'}(cảm ơn Sp3000).

Có một số phiền toái nhỏ ăn hết chars. Một là trong trường hợp ltrông giống như 1234567không có dấu phẩy, nó được phân tích cú pháp dưới dạng một số duy nhất và việc gọi bị sumlỗi. Điều này được xử lý với hack bắt đầu lvới phần tử 0và tước nó khi in. Cái này có giá 6 ký tự.

Lặp clại dấu phẩy và chuỗi trống là từ khó chịu for c in(',',''), vì Python 3 không cho phép bộ dữ liệu này được khỏa thân. Tôi muốn có một số char ?bị bỏ qua trong số để làm ',?'ít hơn 4 ký tự, nhưng dường như không có char nào như vậy.


Phương pháp cũ:

Con trăn 2, 117

def f(n,s={1,2,3,4,5,6,7},l=[],p=0):
 if{n,p}|s=={0}:print l;1/0
 if p:f(n-p,s,l+[p])
 for x in s:f(n,s-{x},l,p*10+x)

Xác định hàm lấy số và in danh sách.

Ý tưởng là sử dụng đệ quy để thử mọi nhánh. Các biến theo dõi là

  • Số tiền còn lại ncần thiết
  • Tập hợp các chữ số scòn lại để sử dụng
  • Danh sách lcác số được thực hiện cho đến nay
  • Số lượng hình thành một phần hiện tại p

Khi n==0strống, in lvà chấm dứt do lỗi.

Nếu số hình thành một phần hiện tại plà khác không, hãy thử thêm nó vào danh sách và xóa nó khỏi số tiền còn lại.

Đối với mỗi chữ số xchúng ta có thể sử dụng từ s, hãy thử thêm nó vào pvà xóa nó khỏi s.


4

Bình thường, 23

#iRThfqQsiR10Ts./M.pS7q

Lực lượng vũ phu ngây thơ, quá chậm trên mạng, mất khoảng một phút trên máy tính của tôi. Sử dụng mô hình "vòng lặp mãi mãi cho đến khi ngoại lệ" chung của các sân golf trong đó việc truy cập vào danh sách kết hợp được lọc kết quả gây ra lỗi cho các số không thể, như 29.

Đầu ra như một danh sách pythonic, ví dụ

1891
[1234, 657]
100
[1, 2, 34, 56, 7]
370
[12, 345, 6, 7]

Dưới đây là một dán của tất cả 10136 số có thể được thực hiện theo cách này.


Tôi có thể sử dụng liên kết pastebin cho các ví dụ?
The_Basset_Hound 8/10/2015

@The_Basset_Hound Tất nhiên, hãy tiếp tục.
FryAmTheEggman

3

Python 2.7, 178 172 169 byte

n=input()
for i in range(8**7):
 for j in len(set('%o0'%i))/8*range(128):
    s=''
    for c in'%o'%i:s+='+'[:j%2*len(s)]+c;j/=2
    if eval(s)==n:print map(int,s.split('+'));1/0

Lưu ý rằng ba dòng cuối cùng được cho là được thụt lề bằng các tab nhưng tôi không thể tìm ra cách thực hiện trong trình chỉnh sửa này.

Chỉnh sửa: Làm phẳng một lớp lồng với sự trợ giúp của Sp3000


Thật không may, SE loại bỏ các tab, vì vậy chỉ cần nói làm thế nào để thụt lề là ổn :)
Sp3000

Ah được rồi, vẫn đang tìm cách của tôi xung quanh trang web này.
xsot

3

JavaScript (ES6), 165 196

Chỉnh sửa Rút ngắn một chút. Có thể sử dụng ngắn hơn eval, nhưng tôi thích nó nhanh

Sức mạnh vũ phu, đáng xấu hổ lâu hơn phiên bản Pith, nhưng nhanh hơn. Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ EcmaScript 6.

f=z=>{for(r=i=1e6;r&&++i<8e6;)for(m=/(.).*\1|[089]/.test(w=i+'')?0:64;r&&m--;t.split`+`.map(v=>r-=v,r=z))for(t=w[j=0],l=1;d=w[++j];l+=l)t+=l&m?'+'+d:d;return r?'':t}

function test() { O.innerHTML=f(+I.value) }

test()

// Less golfed

f=z=>{
  for(r=i=1e6; r&&++i<8e6;)
    for(m=/(.).*\1|[089]/.test(w=i+'')?0:64; r&&m--; t.split`+`.map(v=>r-=v,r=z))
      for(t=w[j=0],l=1;d=w[++j];l+=l)
        t+=l&m?'+'+d:d;
  return r?'':t
}
<input id=I value=28><button onclick=test()>-></button><span id=O></span>


Không có gì phải xấu hổ vì ngôn ngữ dài hơn, tôi thực sự thích câu trả lời JS của bạn, +1
FryAmTheEggman

1

Con trăn 2 270 268 byte

from itertools import*;P=permutations
x,d,f=range(1,8),[],input()
r=sum([[int(''.join(str(n)for n in i))for i in list(P(x,j))]for j in x],[])
z=1
while z:
 t=sum([[list(j)for j in P(r,z)]for i in x],[])
 v=filter(lambda i:sum(i)==f,t)
 if v:print v[0];break
 else:z+=1

Vẫn đang làm việc trên sân golf.

Vòng lặp này cho đến khi một trận đấu được tìm thấy.


import ashiếm khi cần thiết - bạn có thể làmfrom itertools import*;P=permutations
Sp3000

Nó ngắn hơn để sử dụng map(str,i)so với việc hiểu danh sách và bạn có thể xây dựng danh sách r trực tiếp thay vì làm phẳng danh sách lồng nhau: r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]và một điều tương tự cho t.
Ruth Franklin

Bạn có thể sử dụng `n`thay vì str(n), vì nsẽ không bao giờ vượt quá số nguyên tối đa.
mbomb007

1

Haskell (145 byte)

main=getLine>>=print.head.f[1..7].read
f[]0=[[]]
f b s=[n:j|(n,g)<-m b,j<-f g$s-n]
m b=[(d+10*z,g)|d<-b,(z,g)<-(0,filter(/=d)b):m(filter(/=d)b)]

Sử dụng đệ quy.

Ungolfed (337 byte):

delete d = filter (/= d)
main = getLine >>= print . (`form` [1..7]) . read

form s [] | s == 0    = [[]]
form s ds | s <= 0    = []
form s ds | otherwise = [n:ns | (n, ds') <- makeNumbers ds, ns <- form (s-n) ds']

makeNumbers [] = []
makeNumbers ds  = [(d + 10 * n',ds') | d <- ds, (n',ds') <- (0,delete d ds):makeNumbers (delete d ds)]

0

Scala, 195 byte

Đây không phải là hiệu quả nhất và phải mất hơn 15 phút để có được đầu ra cho 29 nhưng nó hoạt động

def g(s: Seq[Int]): Iterator[Seq[Int]]=s.combinations(2).map(c=>g(c.mkString.toInt +: s.filterNot(c.contains))).flatten ++ Seq(s)
def f(i: Int)=(1 to 7).permutations.map(g).flatten.find(_.sum==i)

Đây là một số đầu ra

scala> f(100)
res2: Option[Seq[Int]] = Some(Vector(46, 35, 12, 7))

scala> f(1891)
res3: Option[Seq[Int]] = Some(Vector(567, 1324))

scala> f(370)
res4: Option[Seq[Int]] = Some(Vector(345, 12, 6, 7))

scala> f(29)
res5: Option[Seq[Int]] = None

0

Ruby, 105 byte

Lực lượng vũ phu! Kiểm tra mọi tập hợp con có độ dài từ 0 đến 7 của các số nguyên trong khoảng từ 1 đến 7654321 và xem liệu có bất kỳ số nào phù hợp với tiêu chí của chúng tôi không. Bạn có thể không muốn chờ đợi điều này chấm dứt.

->n{8.times{|i|[*1..7654321].permutation(i){|x|return x if
x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}

Để chạy và xác minh thuật toán, bạn có thể thu hẹp không gian tìm kiếm bằng cách thay thế 7654321bằng số lớn nhất bạn biết sẽ có trong câu trả lời. Chẳng hạn, 56 cho n = 100 hoặc 1234 cho n = 1891. Đây là bản chạy thử sau:

$ ruby -e "p ->n{8.times{|i|[*1..1234].permutation(i){|x|return x if x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}[gets.to_i]" <<< 1891
[657, 1234]

0 đến 7 số nguyên? Bạn nên sử dụng số nguyên exaclty 7: 1,2,3,4,5,6,7
edc65

@ edc65 Ý bạn là chính xác 7 chữ số . Kết quả là một tập hợp các số nguyên và kích thước của tập hợp phụ thuộc vào đầu vào.
daniero

Tôi không nói Ruby, tôi cho rằng chương trình hoạt động, nhưng tôi không nhận được lời giải thích. Nếu số nguyên của bạn nhỏ hơn 1234567, làm thế nào để bạn nhận được 7654321?
edc65

@ edc65 Bạn nói đúng, tôi sẽ phải thay đổi số đó. Tôi cũng sẽ cố gắng giải thích nó tốt hơn.
daniero
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.