Ít hoạt động nhất đến 100


15

Tổng quat

Đưa ra một danh sách các chữ số, tìm ít thao tác nhất để thực hiện 100

Đầu vào

Một chuỗi các chữ số, có thể có hoặc không theo thứ tự số. Thứ tự của các chữ số không thể thay đổi, tuy nhiên các toán tử cộng (+) hoặc trừ (-) có thể được thêm vào giữa mỗi chữ số để tổng tổng bằng 100.

Đầu ra

Số lượng toán tử được thêm vào, theo sau là chuỗi đầy đủ các chữ số và toán tử. Hai có thể được phân tách bằng một khoảng trắng, tab hoặc chuỗi dòng mới.

Ví dụ

có hiệu lực

Đầu vào: 123456789
Đầu ra:3 123–45–67+89


Đầu vào không hợp lệ : 123456789
Đầu ra:
6 1+2+34-5+67-8+9
(Có nhiều cách để giải quyết vấn đề này với ít thao tác hơn)



Chúng ta có phải sử dụng tất cả các chữ số không? Chúng ta chỉ có thể sử dụng +-? Chúng ta có thể cho rằng chúng ta sẽ luôn có thể thực hiện 100từ đầu vào không?
TheLethalCoder

6
Một số trường hợp thử nghiệm sẽ được chào đón nhiều.
Arnauld

2
Bạn có thể xác nhận rằng các dấu hiệu không thể được thêm vào chữ số đầu tiên? Đó là, cho đầu vào 299399, sẽ -299+399hợp lệ?
Luis Mendo

1
Là '0' một chữ số? Ví dụ: '10808' là đầu vào hợp lệ? '1 108-08' có phải là phản hồi hợp lệ không?
Chas Brown

Câu trả lời:


10

JavaScript (ES6), 153 176 byte

EDIT: Trong chế độ không nghiêm ngặt, JS diễn giải các biểu thức số có tiền tố 0 là bát phân (ví dụ: 017được phân tích thành 15 trong số thập phân). Đây là một phiên bản cố định hỗ trợ các số không hàng đầu.

let f =

s=>[...Array(3**(l=s.length,l-1))].map((_,n)=>m=eval((x=s.replace(/./g,(c,i)=>c+['','+','-'][o=(n/3**i|0)%3,j-=!o,o],j=l)).replace(/\b0+/g,' '))-100|j>m?m:(S=x,j),m=l)&&m+' '+S

console.log(f("123456789"))
console.log(f("20172117"))


Đẹp, còn 20172117 làm đầu vào thì sao?
mdahmoune

@LuisMendo Thật ra, tôi nghĩ câu trả lời mong đợi là 2-017-2+117. Nhưng 017là một ký hiệu bát phân trong JS, cung cấp 15 số thập phân. Vì vậy, mã hiện tại của tôi chỉ tìm thấy 2-0-17-2+117. Tôi sẽ cố gắng giải quyết vấn đề đó sau hôm nay.
Arnauld

@Arnauld Ah, tôi đã không thấy giải pháp khác. Xóa bình luận của tôi
Luis Mendo

@mdahmoune Cảm ơn bạn đã mang cái này lên. Bây giờ đã sửa.
Arnauld

3**(l=s.length,l-1)=>3**~-(l=s.length)
l4m2

5

MATL , 37 36 byte

n'+-'OhZ^!t2\s&SZ)"G@!vXzU100=?@z3M.

Trường hợp thử nghiệm mất khoảng 6 giây trong TIO.

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

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

n        % Implicitly input a string. Number of elements, say k
'+-'     % Push this string
Oh       % Append char 0. This is treated like ' ' (space)
Z^       % Cartesian power of the three-char string '+- ' raised to k.
         % Gives a matrix where each row is a Cartesian k-tuple
!        % Transpose
t        % Duplicate
2\       % Modulo 2. This turns '+' and '-' into 1, and ' ' into 0
s        % Sum of each column: number of '+' and '-' symbols
&S       % Sort and push the indices of the sorting
Z)       % Apply as column indices. This sorts the columns (k-tuples)
         % by the number of '+' and '-' they contain
"        % For each column, i.e. each k-tuple formed by '+', '-' and ' '
  G      %   Push input string again
  @!     %   Push k-tuple as row vector (string)
  v      %   Concatenate vertically into a 2×k char array
  Xz     %   Remove space (and char 0). Gives a string as result. In this
         %   process, the 2×k array is linearized in column major order 
         %   (down, then across). So the '+' and '-' signs are between 
         %   digits of the input, or at the end
  U      %   Convert to number. This performs the operation determined by
         %   by the '+' and '-' signs and returns the result. A trailing
         %   '+' or '-' sign makes the input invalid, which causes an
         %   empty result
  100=   %   Is it equal to 100?
  ?      %   If so
    @    %     Push current k-tuple
    z    %     Number of nonzeros, i.e. of '+' and '-' signs
    3M   %     Push linearized string without spaces again
    .    %     Break for loop
         %   Implicit end
         % Implicit end
         % Implicitly dispplay stack

Tuyệt vời, những gì về 299399 là đầu vào?
mdahmoune

1
@mdahmoune 299399không có giải pháp và do đó không phải là đầu vào hợp lệ (các toán tử được chỉ định để đi "giữa" các chữ số, đầu vào đó sẽ yêu cầu -299+399nơi -không nằm giữa các chữ số).
Jonathan Allan

@mdahmoune Nếu các dấu hiệu chỉ có thể được chèn giữa các chữ số (như văn bản thách thức nói), tôi nghĩ không có giải pháp. Nếu chúng cũng có thể được thêm vào chữ số đầu tiên, thì giải pháp là -299+399, và trong trường hợp đó tôi cần một thay đổi nhỏ trong mã của mình . Tôi đã hỏi OP để làm rõ
Luis Mendo

Cũng đáng chú ý rằng nếu nó có nghĩa là cả trước giữa thì ví dụ 123456789nên có số lượng toán tử 4không 3.
Jonathan Allan

@mdahmoune OP đã xác nhận rằng các dấu hiệu chỉ có thể nằm giữa các chữ số. Vì vậy, mã của tôi là chính xác và 299399là một đầu vào không hợp lệ bởi vì, vì OP cũng đã làm rõ, mọi đầu vào nên có ít nhất một giải pháp
Luis Mendo

3

[Python 2], 164 158 byte

from itertools import*
f=lambda N:min((len(s)-len(N),s)for s in(''.join(sum(zip(N,p+('',)),()))for p in product(('+','-',''),repeat=len(N)-1))if eval(s)==100)

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

Lấy N là một chuỗi các chữ số; trả về một tuple (numOps, biểu thứcString).

Về cơ bản cách tiếp cận tương tự như những người khác; sử dụng itertools.product để xây dựng các "trường hợp" riêng lẻ, ví dụ cho N == '1322', một "trường hợp" sẽ ('-','','+')và sẽ đánh giá '1-32 + 2'.

Ném ValueError nếu đầu vào không hợp lệ (nhưng tôi nghĩ OP đảm bảo không có đầu vào không hợp lệ).


3

PHP, 166 171 byte

for(;$n<3**$e=strlen($x=$argn);eval("return $s;")-100?:$r[]=sprintf("%2d $s",strlen($s)-$e))for($i=0,$s="",$k=$n++;a&$c=$x[$i];$k/=3)$s.="+-"[$i++?$k%3:2].$c;echo min($r);

Chạy như đường ống với -nRhoặc kiểm tra nó trực tuyến .

sử dụng các số được định dạng để sắp xếp kết quả ->
có thể in các khoảng trống hàng đầu (và có thể không thành công cho đầu vào có hơn 99 chữ số; tăng số tại%2d để sửa).

không quá 10 chữ số, 161 byte

for(;$n<3**$e=strlen($x=$argn);eval("return $s;")-100?:$r[]=(strlen($s)-$e)." $s")for($i=0,$s="",$k=$n++;a&$c=$x[$i];$k/=3)$s.="+-"[$i++?$k%3:2].$c;echo min($r);

phá vỡ

for(;$n<3**$e=strlen($x=$argn); # loop $n up
    eval("return $s;")-100?:        # 2. evaluate term, if 100 then
                                    # prepend number of operations, add to results
        $r[]=sprintf("%2d $s",strlen($s)-$e)
)
                                # 1. create term
    for($i=0,$s="",$k=$n++;         # init variables, increment $n
        a&$c=$x[$i];$k/=3)          # loop through digits/operator index
        $s.="+-"[$i++?$k%3:2].$c;   # prepend operator for base-3 digit (nothing for 2)
echo min($r);                   # print lowest result

3

Thạch , 32 byte

L’⁾+_ṗż@€
ŒṖÇ€ẎµFV=ȷ2µÐfLÞḢFṄḟ³L

Một chương trình đầy đủ hiển thị bằng các toán tử Jelly ( _thay vì -).

Lưu ý: Để hiển thị -ở đầu ra thay vì _(không phải là yêu cầu), hãy thêm ⁾_-yvào giữa F( ⁾_-là một cặp ký tự theo nghĩa đen ['_','-']ylà nguyên tử "dịch" dyadic).

Làm sao?

L’⁾+_ṗż@€ - Link 1, form all sums from a partition: list of lists of characters
                                     e.g. ["12","345","67"]
L         - length                        3
 ’        - decremented                   2
  ⁾+_     - literal ['+','_']
     ṗ    - Cartesian power               ["++","+_","_+","__"]
      ż@€ - zip for €ach (swap @rguments) ["12+345+67","12+345_67","12_345+67","12_345_67"]

ŒṖÇ€ẎµFV=ȷ2µÐfLÞḢFṄḟ³L - Main link: list of characters
ŒṖ                     - all partitions
  Ç€                   - call the last link (1) as a monad for €ach
    Ẏ                  - tighten (flatten by 1 level)
     µ     µÐf         - filter keep if:
      F                -   flatten
       V               -   evaluate as Jelly code (perform the sum)
         ȷ2            -   literal 100
        =              -   equal?
               Þ       - sort by:
              L        -  length
                Ḣ      - head
                 F     - flatten
                  Ṅ    - print that and a newline
                   ḟ³  - filter out the characters from the input
                     L - length (number of operators)
                       - implicit print

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


2

Toán học, 136 146 149 156 165 166 byte

#&@@Sort[{StringLength@#-e+9!(ToExpression@#-100)^2,#}&/@StringJoin/@(Riffle[b,#]&)/@Tuples[{"","+","-"},(e=Length[b=Characters@#])-1]]&

Trả về {3, 123-45-67+89}ví dụ.

Trường hợp thử nghiệm mất khoảng 0,09 giây để hoàn thành.


2

Python 2 , 256 230 208 205 172 171 170 165 byte, phương thức lặp

  • 33 nhờ Chas Brown
  • Một byte được lưu khi thay thế len(a)bởiw
  • Một byte được lưu khi thay thế z-=1;d=zbởid=z=z-1
q=[];a=input()
w=len(a);z=n=3**w
while z-n/3:
 d=z=z-1;j=0;b=''
 while d:r=d%3;d/=3;b+=a[j]+chr(r+43)*(d>0!=r-1);j+=1
 if eval(b)==100:q+=[(len(b)-w,b)]
print min(q)

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

Ít giải thích Sử dụng biểu diễn trong cơ sở 3, mã này xen kẽ các chữ số với các toán tử {'+', '-', ghép nối} theo tất cả các kết hợp có thể.

Python 2 , 167 byte, phương thức đệ quy

def f(s):
 if len(s)==1:return[s]
 b=s[0];q=[]
 for z in f(s[1:]):q+=[b+'+'+z,b+'-'+z,b+z]
 return q
a=input()
print min((len(x)-len(a),x)for x in f(a)if eval(x)==100)

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

Một số đầu ra

"399299"    --> (1, '399-299')
"987654321" --> (4, '98-76+54+3+21')
"1111111"   --> (3, '1+111-1-11')

1
Tôi thích việc sử dụng divmod! Một vài sân golf tôi có thể thấy: thay thế list(input())bằng chỉ input(), vì một chuỗi đã được lặp lại để lưu 6 byte; thay thế b.count('+')+b.count('-')bằng len(b)-len(a)để tiết kiệm 12 byte; và thay thế chr(r+43)bằng chr(r+43)*(d>0!=r-1)và sau đó bạn có thể xóa dòng b=b[:-1].replace(',','')để lưu 15 byte ròng ( (d>0!=r-1)tương đương với (d>0 and 0!=r-1)).
Chas Brown

2

Brachylog , 36 byte

~cịᵐ{|ṅ}ᵐ{+100&{ℕṫ,"+"↻|ṫ}ᵐcbE&kl;E}

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

Hơn một nửa trong số này là để có được định dạng đầu ra ngay. Logic cốt lõi thực tế chỉ là:

15 byte

~cịᵐ{|ṅ}ᵐ.+100∧

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

Điều này trả về một danh sách như [123, cám45, HP67,89]. Biểu thức là tổng của các phần tử và số lượng toán tử nhỏ hơn 1 so với độ dài của danh sách.

~cLhℕ∧100~+Lhầu như hoạt động với 12 byte ( Hãy thử trực tuyến! ) - nhưng quá chậm để xử lý đầu vào 9 chữ số đầy đủ trên TIO và quan trọng hơn, nó không thành công cho các đầu vào như 10808- Brachylog quá thông minh để phân chia số để có số 0 đứng đầu, vì vậy không ' t thấy phân vùng [108, -08].


1

Haskell , 180 178 byte

m#[a]=[[a]]
m#(b:r)|s<-m#r=m(b:)=<<[s,m('+':)s,m('-':)s]
o '-'=(-)
o _=(+)
(p:r)?a|[(b,s)]<-lex r=s?o p a(read b)
_?a=a
g s=minimum[(sum[1|c<-t,c<'0'],t)|t<-map#s,('+':t)?0==100]

Hãy thử trực tuyến! Công dụng: g "123456789"sản lượng (3,"123-45-67+89").

#xây dựng một danh sách tất cả các thuật ngữ có thể, ?đánh giá một thuật ngữ và glọc các thuật ngữ đó ước tính thành 100 và trả về một thuật ngữ có số lượng toán hạng tối thiểu.


0

Thạch , 27 byte

L’““+“_”ṗ⁸żF¥ⱮV⁼ȷ2ƊƇLÞḢṄḟ⁸L

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

Không thể nói rằng tôi đã không nhận được một vài gợi ý từ câu trả lời cũ hơn của Jonathan Allan. ;-)

So với câu trả lời của anh ta, cái này chỉ ngắn hơn hai byte (30) chứ không phải năm, nếu chúng ta thực hiện so sánh công bằng do cập nhật ngôn ngữ:

L’““+“_”ṗ⁸żF¥Ð€V⁼ȷ2$$ÐfLÞḢṄḟ⁸L

Nếu chúng ta so sánh theo cách khác (phiên bản mới hơn thay vì cũ hơn), sự khác biệt là như nhau (trở thành 29 byte, được nhìn thấy bên dưới):

ŒṖżⱮL’⁾+_ṗƲ$€ẎFV=ȷ2ƲƇLÞḢFṄḟ³L
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.