Ổ cắm điện


23

Đây là một vấn đề từ NCPC 2005 . Roy có một căn hộ chỉ có một ổ cắm điện duy nhất, nhưng anh ta có một loạt các dải năng lượng. Tính số lượng ổ cắm tối đa anh ta có thể có bằng cách sử dụng các dải năng lượng anh ta có. Số lượng ổ cắm trên mỗi dải nguồn được đưa ra làm đầu vào.

Nó chỉ ra rằng nếu số lượng đầu ra của dải tương ứng là

p1,p2,Giáo dục,pn

sau đó số lượng cửa hàng là ,

1-n+Σtôiptôi

hoặc là

.

1+p1-1+p2-1++pn-1

Đầu vào của chương trình hoặc hàm là một chuỗi các số nguyên dương không trống.

Ví dụ

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098

17
Và tôi nghĩ rằng bạn không cần phải xâu chuỗi các dải năng lượng ...
Joey

Theo như tôi có thể nói câu trả lời Retina của tôi là câu trả lời duy nhất sử dụng đầu vào đơn nguyên. Bạn có thể muốn xem cuộc thảo luận về nhận xét ở đó: codegolf.stackexchange.com/questions/71047/electrical-outlet/ trộm ... Nếu bạn nghĩ rằng giải pháp đơn nguyên đó là quá nhiều về một vụ hack không theo tinh thần Thử thách, tôi rất vui khi bạn chỉ định rằng đầu vào phải ở dạng thập phân (và sau đó sẽ sửa câu trả lời của tôi cho phù hợp).
Martin Ender

7
Vì điện quá đắt, mã của bạn phải càng ngắn càng tốt để tránh sử dụng nhiều năng lượng hơn
mèo

1
@cat Thời gian để đào bới máy móc và máy tính cơ hamster cũ.
Pharap 6/2/2016

1
@immibis chắc chắn, nhưng đầu ra sẽ được coi là thông tin chứa trong luồng byte không giống như những gì xảy ra bởi thiết bị đầu cuối của bạn.
Martin Ender

Câu trả lời:



29

Võng mạc , 3 byte

 1

Các linefeed trailing là đáng kể.

Đầu vào là một danh sách các số đơn vị được phân tách bằng dấu cách .

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

Giải trình

Mã chỉ đơn giản là loại bỏ tất cả các khoảng trắng cũng như 1sau chúng khỏi chuỗi. Đây là lý do tại sao nó hoạt động:

Bổ sung trong unary rất đơn giản: chỉ cần ghép các số giống như loại bỏ các dấu phân cách. Giảm 1 cũng rất đơn giản: chỉ cần xóa a 1khỏi mỗi số. Chúng tôi muốn nhiều hơn 1 so với tổng của các đầu vào giảm dần, vì vậy chúng tôi chỉ đơn giản là loại bỏ các 1s chúng tôi tìm thấy sau các khoảng trắng, từ đó giảm tất cả trừ đầu vào đầu tiên.


1
Tôi đang tự hỏi nếu đầu vào trong unary nên được cho phép.
John Dvorak

@JanDvorak theo mặc định, trừ khi thử thách chỉ định rõ ràng đầu vào thập phân. (Xem liên kết trong câu trả lời.) Mặc dù vậy, Jelly vẫn chiến thắng.
Martin Ender

@ MartinBüttner Có dữ liệu mẫu cả trong câu hỏi này và bài tập gốc. Bạn không nghĩ (trừ khi có quy định khác) rằng nó phải là một tiêu chí cần thiết (mặc dù không đủ) để thông qua, rằng mã có hoạt động với dữ liệu mẫu nguyên văn không?
nitro2k01

1
@ nitro2k01 Không (trong trường hợp đó hầu hết các câu trả lời có thể không hợp lệ). Trừ khi thách thức chỉ định rõ ràng một định dạng đầu vào cụ thể, chúng tôi thường cho rằng các danh sách có thể được thực hiện ở bất kỳ định dạng danh sách gốc nào . Tương tự với các định dạng số (ít nhất là đơn nguyên và lấy số nguyên làm giá trị byte được cho phép bởi sự đồng thuận trừ khi thách thức cấm chúng). Rất khó để đưa dữ liệu mẫu vào mọi định dạng đầu vào gốc có thể nghĩ được trong thử thách.
Martin Ender

@ MartinBüttner Imo, đó không phải là vấn đề mà đề xuất đang giải quyết. Điều vẫn nói chống lại điều này là (trừ khi tôi nhầm) điều này không hoạt động vì unary là định dạng số gốc được hỗ trợ hoặc bản địa trong Retina nhưng nó sẽ hoạt động khi bạn xử lý chuỗi dưới dạng dữ liệu chuỗi. Đó là một hack. Thậm chí đó là một cách hack thông minh, nhưng tôi vẫn không tin đó là theo quy tắc. Nếu các số đơn nguyên được phân tách bằng dấu cách là định dạng gốc trong Retina giống như danh sách các byte là định dạng gốc trong bf, tôi sẽ đồng ý khuyến nghị áp dụng và tôi sẽ có ý kiến ​​khác.
nitro2k01

9

Lục giác , 18 14 byte

.?<_(@'")>{+.!

Mở ra:

  . ? <
 _ ( @ '
" ) > { +
 . ! . .
  . . .

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

Tôi không nghĩ rằng side-length 2 là có thể, nhưng có lẽ phải có một giải pháp 3 chiều dài hiệu quả hơn đó.

Đây là cách tiếp cận "giảm tất cả, tổng, tăng" thông thường, nhưng tôi sẽ phải thêm sơ đồ sau để hiển thị chính xác cách thức hoạt động của nó trong Hexagony.


7

Python, 24 byte

lambda*n:1-len(n)+sum(n)

Dùng thử trực tuyến


1
Điều này giả định rằng hàm được gán trước, sau đó được áp dụng cho đầu vào từ biến khác.
juandesant

1
@juandesant ... đó là hoàn toàn tốt. Đây là một chức năng theo nghĩa đen, là một hình thức đệ trình hợp lệ.
FlipTack


7

Haskell, 17 15 byte

foldl1$(+).pred

Ví dụ sử dụng: ( foldl1$(+).pred ) [2,4,6]-> 10.

Phiên bản cũ, cách tiếp cận khác nhau, 17 byte : succ.sum.map pred.


6

J, 6 byte

+/+1-#

Tổng cộng một chiều dài trừ. Dấu ngoặc đơn và áp dụng nó, như vậy:

   (+/+1-#) 2 3 4
7

6

Mê cung , 9 byte

"?;)!@
+(

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

Các mồi thông thường:

  • Labyrinth là 2D và dựa trên ngăn xếp. Các ngăn xếp có vô số số 0 ở phía dưới.
  • Khi con trỏ lệnh đạt đến một điểm nối, nó sẽ kiểm tra đỉnh của ngăn xếp để xác định nơi tiếp theo. Tiêu cực là trái, không là tiến và dương là đúng.

Ở đây chúng tôi bắt đầu ở phía trên bên trái ", một no-op, hướng sang phải. Tiếp theo là ?, đọc một int từ STDIN (vứt bỏ các ký tự, nó không thể phân tích thành số nguyên, ví dụ như khoảng trắng). Bây giờ chúng tôi có hai trường hợp:

Nếu đầu vào là dương, chúng tôi rẽ phải, thực hiện:

(            decrement top of stack
+            add top two stack elements
             [continue loop]

Nếu đầu vào bằng 0 (xảy ra tại EOF), chúng ta sẽ đi thẳng, thực hiện:

;            pop zero from EOF
)            increment top of stack
!            output top of stack as number
@            halt program

5

Bình thường, 5 byte

hstMQ

gia tăng (tổng (bản đồ (giảm, đầu vào)))


5

ES6, 25 byte

a=>a.map(n=>r+=n-1,r=1)|r

4
Tôi sẽ đăng: "Một trong những trường hợp hiếm hoi khi giảm chiến thắng trò chơi" ... và nó cũng 25 l=>l.reduce((a,b)=>a+b-1).
edc65

@ edc65 Vâng, cái (,b)này rất tốn kém, nhưng tôi cũng thích phiên bản đó.
Neil


4

05AB1E , 4 byte

Mã số:

E<O>

Giải trình:

E     # Evaluates input
 <    # Decrement on list
  O   # Compute the total sum
   >  # Increment on the sum
      # Implicit: output top of the stack

Đưa đầu vào như một mảng (ví dụ [3, 4, 5]).


Rất thanh lịch cho một buổi đánh gôn
Pharap 6/2/2016

4

Starry , 26 24 byte

, + '`      + ** `, +'*.

Mong đợi số nguyên phân tách dòng mới. Hãy thử trực tuyến!

Cảm ơn @ MartinBüttner cho -2 byte.

,           Read line as integer
 + '        Dupe and jump to label 1 if nonzero
`           Set label 0
      +     Push 1
 *          Sub
*           Add
 `          Set label 1
,           Read line as integer
 + '        Dupe and jump to label 0 if nonzero
*           Add
.           Output as integer

Vòng lặp không được kiểm soát để số đầu tiên không bị giảm, phủ định sự cần thiết phải tăng. Đẩy số là tốn kém trong Starry ...


Tôi chỉ đếm 20 byte.
Addison Crump

1
@VoteToClose Bạn đã đếm các không gian hàng đầu? (Tôi giả sử bạn đang nói về 26 byte)
Sp3000

4

Tiện ích Bash + GNU, 16

Nếu có Ncác dải nguồn, thì nên có các N-1dải phân cách trong danh sách đầu vào được phân tách bằng dấu phẩy. Tất cả những gì chúng ta cần làm là thay thế các dải phân cách bằng - 1 +và đánh giá một cách hợp lý:

sed s/,/-1+/g|bc

Hoặc sử dụng cùng một mẹo:

Pure Bash (không có tiện ích bên ngoài), 19

echo $[${1//,/-1+}]

3

APL (NARS 2000), 13 10 byte

{1+(+/⍵)-⍴∊⍵}

Chỉnh sửa: Xuống đến 10 với cách tiếp cận (tốt hơn) của Lynn.

{1++/1-⍨⍵}


3

gs2, 5 byte

(Mã hóa CP437.)

W&Φd'

Đó là read-nums dec m1 sum inc.


3

CJam, 7 byte

q~:(:+)

Kiểm tra nó ở đây.

Cách tiếp cận tương tự như của Lynn (giảm tất cả, tổng, tăng). Điều này cũng hoạt động với 8 byte (và có thể thú vị hơn một chút):

q~{(+}*

Điều này gấp "giảm, thêm" trên danh sách. Bằng cách đó, phần giảm chỉ được áp dụng cho tất cả các phần tử ngoại trừ phần tử đầu tiên, do đó chúng ta không cần phải quan tâm đến phần tăng thêm một cách riêng biệt.


3

C, 60 59 55 byte

x;main(s){while(~scanf("%i",&x))s+=x-1;printf("%i",s);}

3

Perl 6, 14 byte

{1+[+] --«@_}

sử dụng

my &f = {1+[+] --«@_}

say f([2,3,4]) # 7
say f([2,4,6]) # 10
say f([1,1,1,1,1,1,1,1]) # 1
say f([100,1000,10000]) # 11098

Tôi hoàn toàn có ý định chỉnh sửa câu trả lời của mình cho cùng một điều (xem bình luận html )
Brad Gilbert b2gills

11 byte:{.sum-$_+1}
nwellnhof


2

Perl 6 , 20 byte

put 1+sum --«@*ARGS

(Bạn có thể sử dụng <<thay vì «)

Sử dụng:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098

«Là toán tử Perl?
dùng253751

@immibis Trên thực tế, đó là một phần của một số toán tử Perl 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Một vài trong số đó là các toán tử Meta, trong đó chúng kết hợp với các toán tử khác. (Perl 5 hiện không có các nhà khai thác này.)
Brad Gilbert b2gills

2

Perl 5 23 + 2 = 25 hoặc 19 + 2 = 21

Yêu cầu -apcờ:

map{$.+=($_-1)}@F;$_=$.

Được lưu trong một tệp và chạy như

perl -ap file.pl

EDIT: Một câu trả lời khác, nhỏ hơn (19 + 2) nhưng về cơ bản được sao chép từ câu trả lời dev-null:

$.+=$_-1for@F;$_=$.

2

F #, 25 byte

Seq.fold(fun s n->s+n-1)1

Đây là một hàm lấy một mảng / danh sách / chuỗi số nguyên và trả về kết quả cần thiết.

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

Seq.foldcho phép bạn áp dụng một hàm cho mọi phần tử của chuỗi trong khi mang một số trạng thái xung quanh trong khi nó làm như vậy. Kết quả của hàm như được áp dụng cho phần tử đầu tiên sẽ đưa ra trạng thái sẽ được đưa vào hàm cho phần tử thứ hai, v.v. Ví dụ: để tổng hợp danh sách [1; 3; 4; 10], bạn sẽ viết nó như thế này:

Seq.fold (fun sum element -> sum + element) 0 [1; 3; 4; 10]
         (       function to apply        ) ^ (sequence to process)
                                     ( initial state )

Mà sẽ được áp dụng như vậy:

// First, initial state  + first element
0 + 1  = 1
// Then, previous state + next element until the end of the sequence
1 + 3  = 4
4 + 4  = 8
8 + 10 = 18

Với trạng thái cuối cùng là giá trị trả về của Seq.fold.


2

, 5 ký tự / 7 byte

ï⒭+‡_

Try it here (Firefox only).

Sử dụng mã hóa tùy chỉnh với ký tự 10 bit (thx @Dennis!). Chạy encode('ï⒭+‡_')trong bảng điều khiển JS để nhận dạng được mã hóa và decode(/*ENCODED TEXT HERE*/)để giải mã dạng được mã hóa.

Giải trình

Dịch sang Javascript ES6 là:

i=>i.reduce(($,_)=>$+--_)

Mã hóa thú vị.
lirtosiast

Nó hoạt động khá độc đáo, quá.
Mama Fun Roll

2

Lưỡi liềm Mornington , 1909 1873 1839 byte

Take Northern Line to Stockwell
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Turnham Green
Take District Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Embankment
Take Northern Line to Stockwell
Take Northern Line to Embankment
Take Circle Line to Temple
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Blackfriars
Take Circle Line to Embankment
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Parsons Green
Take District Line to Embankment
Take Circle Line to Blackfriars
Take Circle Line to Bank
Take Northern Line to Angel
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

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


"90% tất cả các hướng dẫn liên quan đến việc thực hiện Đường huyện." Đó là bởi vì Quận là nơi có tất cả các trạm số học. Tuy nhiên, trên TIO, nó dường như không hoạt động đối với bất kỳ ví dụ nào .
NieDzejkob

1873 byte bằng cách sử dụng tên dòng ngắn hơn nếu có thể
NieDzejkob 15/03/18

Thông dịch viên của TIO có một lỗi và không triển khai Turnham Green
pppery

Bắt đẹp. Tôi đã gửi một PR mà sửa nó ngược dòng.
NieDzejkob

1

Python 3, 79 byte

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)

Có vẻ như bạn đang đếm một dòng mới là hai byte. Có thể thay thế nó bằng dấu chấm phẩy để lưu một byte. Một vài khoảng trống cũng có thể được loại bỏ.
Daffy

1

Ruby, 30 byte

$*.inject(1){|s,v|s+=v.to_i-1}

Đủ đơn giản - bắt đầu từ 1, cộng các số được cung cấp, mỗi -1 (đối số dòng lệnh đang ở $*). Xấu hổ injectlà một từ dài.


1

PowerShell, 19 byte

$args-join'-1+'|iex

Lưu ý rằng 1 + p1-1 + p2-1 + ... + pn-1tương đương với p1-1 + p2-1 + ... + pn.

Đưa đầu vào dưới dạng đối số dòng lệnh riêng biệt với $args. Chúng tôi -joincùng với một -1+dấu phân cách để tạo một chuỗi, chẳng hạn như 2-1+3-1+4. Chuỗi sau đó được dẫn đến Invoke-Expression(tương tự eval) và đưa ra kết quả.


1

Perl, 21 + 2 = 23 byte

$a+=$_-1for@F;say++$a

Yêu cầu -a-E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7

Bạn có thể sử dụng -acờ để nhận @Fbiến với các phần tử đã phân tách và thay thế -n bằng -p để bạn không cần say, giảm nó xuống 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne

Sử dụng -pthay vì saylà như nhau bởi vì tôi cần phải sử dụng $_=anyway.
andlrc

@ChatterOne -alà một ý tưởng tốt!
andlrc

1

Brainfuck, 15 byte

Giả định: Toán tử trả về 0 khi tất cả đầu vào đã hết và không có dây mở rộng nào có 0 phích cắm. Ngoài ra, IO cần phải có giá trị byte thay vì mã ký tự ASCII.

+>,[-[-<+>],]<.

Giải thích: Điều này sử dụng 2 thanh ghi. Thanh ghi tích lũy "Giá trị", biểu thị số lượng thiết bị có thể được cắm và thanh ghi "dây hiện tại" theo dõi giá trị của dây hiện tại. Nó bắt đầu bằng cách tăng giá trị lên 1, cho ổ cắm hiện có. Sau đó, đối với mỗi dây mở rộng, nó trừ đi một giá trị từ khi một phích cắm được đưa lên, sau đó tăng giá trị theo số lượng phích cắm.

Hầu hết các trình thông dịch trực tuyến không hoạt động trong chế độ đầu vào byte thô. Để kiểm tra trực tuyến, sử dụng mã này:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.

Tôi có thể kiểm tra chương trình ở đâu đó không?
Pål GD

Cảm ơn, sửa chữa những sai lầm. Tôi không biết bất kỳ trình thông dịch trực tuyến nào hoạt động ở chế độ byte. Tôi có thể kết hợp một triển khai trừ '0' khỏi các đầu vào sẽ chạy trên bất kỳ trình thông dịch trực tuyến nào.
Ethan

Nếu bạn muốn kiểm tra mã, hãy chạy mã ở đây: copy.sh/brainfuck Đừng đặt khoảng trắng ở giữa các giá trị số. Thật không may, vì nó hoạt động ở chế độ ASCII, mã demo sẽ chỉ hoạt động trên các giá trị một chữ số. Tuy nhiên, phiên bản 15 byte sẽ hoạt động chính xác trên một giá trị <= 255. Sau khi bạn chạy nó, hãy xem kết xuất bộ nhớ để xem giá trị cuối cùng.
Ethan

Một ngày nào đó BF sẽ có các tiêu chuẩn phù hợp cho IO dự kiến ​​và chúng ta sẽ chỉ có thể nói "sử dụng tiêu chuẩn 3" thay vì "đầu vào và đầu ra đều bị asciii chấm dứt bởi null char".
Pharap 6/2/2016
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.