เต้าเสียบไฟฟ้า


23

ปัญหานี้เป็นปัญหาจากNCPC 2005 Roy มีอพาร์ทเมนต์ที่มีเต้าเสียบปลั๊กไฟเพียงอันเดียว แต่เขามีปลั๊กไฟหลายอัน คำนวณจำนวนช่องจ่ายไฟสูงสุดที่เขาสามารถใช้กับปลั๊กไฟที่มี จำนวนช่องเสียบต่อรางปลั๊กไฟจะได้รับเป็นอินพุต

ปรากฎว่าหากจำนวนร้านค้าของแถบตามลำดับคือ

p1,p2,,pn

แล้วจำนวนร้านคือ ,

1n+ipi

หรือ

1+p11+p21++pn1
p_n-1

อินพุตไปยังโปรแกรมหรือฟังก์ชั่นเป็นชุดที่ไม่ว่างของจำนวนเต็มบวก

ตัวอย่าง

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

17
และฉันคิดว่าคุณไม่ควรที่จะเสียบสายไฟ ...
Joey

เท่าที่ฉันสามารถบอกได้ว่าคำตอบ Retina ของฉันเป็นคำตอบเดียวที่ใช้อินพุตแบบยูนารี คุณอาจต้องการดูการอภิปรายความคิดเห็นที่นั่น: codegolf.stackexchange.com/questions/71047/electrical-outlet/ ...... ถ้าคุณคิดว่าทางออกของยูนารีนั้นเป็นแฮ็คที่ไม่ได้อยู่ในจิตวิญญาณของ ความท้าทายฉันยินดีให้คุณระบุว่าข้อมูลควรเป็นทศนิยม (และจะแก้ไขคำตอบของฉันตามลำดับ)
Martin Ender

7
เนื่องจากไฟฟ้ามีราคาแพงมากรหัสของคุณควรสั้นที่สุดเท่าที่จะทำได้เพื่อหลีกเลี่ยงการใช้พลังงานมากขึ้น
cat

1
@cat เวลาที่จะขุดหนูแฮมสเตอร์เก่าที่ขับเคลื่อนด้วยเครื่องจักรทัวริงและคอมพิวเตอร์เชิงกล
Pharap

1
@immibis แน่นอน แต่เอาต์พุตจะถือว่าเป็นข้อมูลที่มีอยู่ในสตรีมไบต์ไม่ใช่สิ่งที่เกิดขึ้นจากการแสดงผลโดยเทอร์มินัลของคุณ
Martin Ender

คำตอบ:



29

เรติน่า 3 ไบต์

 1

ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ

การป้อนข้อมูลเป็นรายการพื้นที่ที่คั่นของตัวเลขเอก

ลองออนไลน์!

คำอธิบาย

รหัสเพียงแค่ลบช่องว่างทั้งหมดเช่นเดียวกับ1หลังจากพวกเขาออกจากสตริง นี่คือเหตุผลที่ใช้งานได้:

นอกจากนี้ยังง่ายมากเพียงแค่เชื่อมตัวเลขที่เหมือนกับการเอาตัวคั่นออก การลดจำนวนลงด้วย 1 ก็ง่ายเช่นกันเพียงแค่ลบออก1จากแต่ละหมายเลข เราต้องการ 1 มากกว่าผลรวมของอินพุตที่ลดลงดังนั้นเราก็แค่ลบ1s ที่เราพบหลังจากช่องว่างเท่านั้นดังนั้นจึงลดลงทั้งหมดยกเว้นอินพุตแรก


1
ฉันสงสัยว่าควรอนุญาตให้ป้อนข้อมูลด้วยภาษาเดียวหรือไม่
John Dvorak

@JanDvorak เป็นค่าเริ่มต้นเว้นแต่ความท้าทายจะระบุอินพุตทศนิยมอย่างชัดเจน (ดูลิงก์ในคำตอบ) ไม่สำคัญว่า Jelly จะเป็นผู้ชนะต่อไป
Martin Ender

@ MartinBüttnerมีข้อมูลตัวอย่างทั้งในคำถามนี้และงานมอบหมายดั้งเดิม คุณไม่คิดว่า (เว้นแต่จะระบุไว้เป็นอย่างอื่น) ว่าควรเป็นเกณฑ์ที่จำเป็น (แม้ว่าจะไม่เพียงพอ) สำหรับการผ่านรหัสนั้นใช้ได้กับข้อมูลตัวอย่างคำต่อคำหรือไม่
nitro2k01

1
@ nitro2k01 ไม่ (ในกรณีนั้นคำตอบส่วนใหญ่น่าจะไม่ถูกต้อง) เว้นแต่ความท้าทายจะระบุรูปแบบการป้อนข้อมูลเฉพาะเรามักจะถือว่ารายการสามารถนำไปใช้ในรูปแบบรายการดั้งเดิมได้ กันไปสำหรับรูปแบบตัวเลข (อย่างน้อยเอกภาพและรับจำนวนเต็มเป็นค่าไบต์ได้รับอนุญาตจากฉันทามติเว้นแต่ความท้าทายห้ามพวกเขา) เป็นไปไม่ได้ที่จะรวมข้อมูลตัวอย่างในทุกรูปแบบอินพุตดั้งเดิมที่คิดได้ในการท้าทาย
Martin Ender

@ MartinBüttner Imo นั่นไม่ใช่ปัญหาที่คำแนะนำนั้นกำลังพูดถึง สิ่งที่ยังคงพูดถึงคือ (ยกเว้นกรณีที่ฉันเข้าใจผิด) สิ่งนี้ใช้ไม่ได้เนื่องจาก unary เป็นรูปแบบตัวเลขที่สนับสนุนหรือเนทีฟใน Retina แต่จะเกิดขึ้นเมื่อคุณประมวลผลสตริงเป็นข้อมูลสตริง มันแฮ็ค แม้แต่แฮ็คที่ฉลาด แต่ฉันก็ยังไม่มั่นใจว่าเป็นไปตามกฎ หากตัวเลขที่แยกออกจากกันเป็นช่องว่างเป็นรูปแบบเนทิฟใน Retina ในลักษณะเดียวกับที่รายการของไบต์เป็นรูปแบบดั้งเดิมใน bf ฉันจะเห็นด้วยกับข้อเสนอแนะนั้นและฉันก็จะมีความคิดเห็นที่ต่างออกไป
nitro2k01

9

Hexagony , 18 14 ไบต์

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

กางออก:

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

ลองออนไลน์!

ฉันไม่คิดว่าความยาวด้านข้าง 2 เป็นไปได้ แต่ต้องมีวิธีแก้ปัญหาความยาวด้าน 3 ที่มีประสิทธิภาพมากกว่านี้

นี่เป็นวิธีการ "ลดทั้งหมด, เพิ่ม, เพิ่ม" ตามปกติ แต่ฉันจะต้องเพิ่มไดอะแกรมในภายหลังเพื่อแสดงให้เห็นว่ามันทำงานอย่างไรใน Hexagony


7

Python ขนาด 24 ไบต์

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

ลองออนไลน์


1
นี่ถือว่าฟังก์ชั่นได้รับมอบหมายก่อนจากนั้นนำไปใช้กับอินพุตจากตัวแปรอื่น
juandesant

1
@juandesant ... ซึ่งดีมาก เป็นฟังก์ชันตามตัวอักษรซึ่งเป็นรูปแบบการส่งที่ถูกต้อง
FlipTack


7

Haskell, 17 15 ไบต์

foldl1$(+).pred

ตัวอย่างการใช้งาน: ( foldl1$(+).pred ) [2,4,6]10 ->

รุ่นเก่าวิธีการที่แตกต่างกัน 17 succ.sum.map predไบต์:



6

เขาวงกต 9 ไบต์

"?;)!@
+(

ลองออนไลน์!

ไพรเมอร์ปกติ:

  • เขาวงกตนั้นเป็นแบบ 2D และเป็นแบบกองซ้อน สแต็คมีจำนวนศูนย์ที่ด้านล่าง
  • เมื่อตัวชี้คำสั่งมาถึงทางแยกมันจะตรวจสอบด้านบนของสแต็กเพื่อกำหนดว่าจะเลี้ยวถัดไป ลบทิ้งเหลือศูนย์จะไปข้างหน้าและบวกเป็นบวก

ที่นี่เราเริ่มต้นที่มุมบนซ้าย"ไม่มีโอปมุ่งหน้าไปทางขวา ถัดไปคือ?ซึ่งอ่าน int จาก STDIN (การทิ้งตัวอักษรไว้จะไม่สามารถแยกวิเคราะห์เป็นจำนวนเต็มเช่นช่องว่าง) ตอนนี้เรามีสองกรณี:

หากอินพุตเป็นบวกเราจะเลี้ยวขวาแสดง:

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

หากอินพุตเป็นศูนย์ (ซึ่งเกิดขึ้นที่ EOF) เราจะดำเนินการทันที:

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


5

ES6, 25 ไบต์

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

4
ฉันกำลังจะไปโพสต์: "หนึ่งในกรณีที่หายากเมื่อลดเกมที่ชนะ" ... และก็ 25 l=>l.reduce((a,b)=>a+b-1)เกินไป
edc65

@ edc65 ใช่(,b)มันแพง แต่ฉันก็ชอบเวอร์ชั่นนั้นด้วย
Neil


4

05AB1E , 4 ไบต์

รหัส:

E<O>

คำอธิบาย:

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

รับอินพุตเหมือนอาร์เรย์ (เช่น[3, 4, 5])


หรูหรามากสำหรับการตีกอล์ฟ
Pharap

4

Starry , 26 24 ไบต์

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

คาดว่าจะเป็นจำนวนเต็มคั่นด้วยการขึ้นบรรทัดใหม่ ลองออนไลน์!

ขอบคุณ @ MartinBüttnerสำหรับ -2 ไบต์

,           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

วนซ้ำไม่ได้ถูกควบคุมเพื่อให้หมายเลขแรกไม่ลดค่าลงทำให้ไม่จำเป็นต้องเพิ่มค่า การกดหมายเลขมีราคาแพงใน Starry ...


ฉันนับเพียง 20 ไบต์
Addison Crump

1
@VoteToClose คุณนับช่องว่างนำหน้าหรือไม่ (ฉันสมมติว่าคุณกำลังพูดถึง 26 ไบต์)
Sp3000

4

ยูทิลิตี Bash + GNU, 16

หากมีNรางปลั๊กไฟควรมีN-1ตัวคั่นในรายการอินพุตคั่นด้วยเครื่องหมายจุลภาค สิ่งที่เราต้องทำคือแทนที่ตัวคั่นด้วย- 1 +และประเมินผลทางคณิตศาสตร์:

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

หรือใช้เคล็ดลับเดียวกัน:

Pure Bash (ไม่มียูทิลิตี้ภายนอก), 19

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

3

APL (NARS 2000), 13 10 ไบต์

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

แก้ไข: ลดลง 10 ด้วยวิธีการของ Lynn (ดีกว่า)

{1++/1-⍨⍵}



3

CJam, 7 ไบต์

q~:(:+)

ทดสอบที่นี่

วิธีการเดียวกับของ Lynn (ลดทั้งหมด, รวม, เพิ่ม) วิธีนี้ใช้ได้กับ 8 ไบต์ (และอาจน่าสนใจกว่าอีกเล็กน้อย):

q~{(+}*

การดำเนินการนี้จะ "ลดลงเพิ่ม" เหนือรายการ โดยการทำเช่นนั้นการลดลงจะถูกนำไปใช้กับองค์ประกอบทั้งหมดยกเว้นรายการแรกเท่านั้นซึ่งเราไม่จำเป็นต้องดูแลการเพิ่มขึ้นแยกกัน



3

Perl 6, 14 ไบต์

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

การใช้

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

ฉันตั้งใจอย่างเต็มที่ที่จะแก้ไขคำตอบของฉันในสิ่งเดียวกัน (ดูความคิดเห็น html )
Brad Gilbert b2gills

11 ไบต์:{.sum-$_+1}
nwellnhof


2

Perl 6 , 20 ไบต์

put 1+sum --«@*ARGS

(คุณสามารถใช้<<แทน« )

การใช้งาน:

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

«เป็นผู้ดำเนินการ Perl หรือไม่
user253751

@immibis จริง ๆ แล้วมันเป็นส่วนหนึ่งของตัวดำเนินการ Perl 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »หลายตัวหลายตัวเป็นสิ่งที่รู้จักกันในชื่อตัวดำเนินการ Meta โดยที่พวกเขารวมกับตัวดำเนินการอื่น (Perl 5 ยังไม่มีโอเปอเรเตอร์เหล่านี้)
แบรดกิลเบิร์ต b2gills

2

Perl 5 23 + 2 = 25 หรือ 19 + 2 = 21

ต้องใช้-apธง:

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

บันทึกในไฟล์และเรียกใช้เป็น

perl -ap file.pl

แก้ไข: คำตอบอื่นเล็ก (19 + 2) แต่โดยทั่วไปคัดลอกมาจากคำตอบ dev-null:

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

2

F #, 25 ไบต์

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

นี่คือฟังก์ชั่นที่รับอาร์เรย์ / รายการ / ลำดับของจำนวนเต็มและส่งคืนผลลัพธ์ที่ต้องการ

มันทำงานอย่างไร:

Seq.foldช่วยให้คุณสามารถใช้ฟังก์ชั่นกับองค์ประกอบทุกลำดับในขณะที่ดำเนินการบางรัฐในขณะที่มันทำเช่นนั้น ผลลัพธ์ของฟังก์ชันตามที่ใช้กับองค์ประกอบแรกจะให้สถานะที่จะใส่ลงในฟังก์ชันสำหรับองค์ประกอบที่สองเป็นต้น ตัวอย่างเช่นหากต้องการสรุปรายการ[1; 3; 4; 10]คุณต้องเขียนดังนี้:

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

ซึ่งจะนำไปใช้เช่น:

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

Seq.foldกับรัฐที่ผ่านมาเป็นค่าตอบแทนของ


2

𝔼𝕊𝕄𝕚𝕟, 5 ตัวอักษร / 7 ไบต์

ï⒭+‡_

Try it here (Firefox only).

ใช้การเข้ารหัสที่กำหนดเองด้วยตัวอักษร 10 บิต (ขอบคุณ @Dennis!) รันencode('ï⒭+‡_')ในคอนโซล JS เพื่อรับแบบฟอร์มที่เข้ารหัสและdecode(/*ENCODED TEXT HERE*/)เพื่อถอดรหัสแบบฟอร์มที่เข้ารหัส

คำอธิบาย

แปลเป็น Javascript ES6 เป็น:

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

การเข้ารหัสที่น่าสนใจ
lirtosiast

มันใช้งานได้ค่อนข้างดีเช่นกัน
Mama Fun Roll

2

Mornington Crescent , 1909 1873 1839 bytes

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

ลองออนไลน์!


"90% ของคำแนะนำทั้งหมดเกี่ยวข้องกับการใช้ District District" เป็นเพราะ District เป็นที่ตั้งของสถานีเลขคณิตทั้งหมด อย่างไรก็ตามใน TIO ก็ดูเหมือนจะไม่ทำงานใด ๆ ของตัวอย่าง
NieDzejkob

1873 ไบต์โดยใช้ชื่อบรรทัดที่สั้นที่สุดเท่าที่จะเป็นไปได้
NieDzejkob

ล่ามของ TIO มีข้อผิดพลาดและไม่ใช้ Turnham Green
pppery

รับได้สวย. ฉันส่ง PR ที่แก้ไขต้นน้ำ
NieDzejkob

1

Python 3, 79 ไบต์

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

ดูเหมือนว่าคุณกำลังนับบรรทัดใหม่เป็นสองไบต์ อาจแทนที่ด้วยเซมิโคลอนเพื่อบันทึกไบต์ สามารถลบช่องว่างเล็กน้อยได้เช่นกัน
Daffy

1

Ruby ขนาด 30 ไบต์

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

ง่ายพอ - เริ่มจาก 1 เพิ่มตัวเลขที่ให้มาแต่ละ -1 (บรรทัดคำสั่ง args อยู่$*) ความอัปยศinjectเป็นคำที่ยาวมาก


1

PowerShell ขนาด 19 ไบต์

$args-join'-1+'|iex

โปรดทราบว่าเทียบเท่ากับ1 + p1-1 + p2-1 + ... + pn-1p1-1 + p2-1 + ... + pn

$argsจะเข้าเป็นอาร์กิวเมนต์บรรทัดคำสั่งแยกต่างหากกับ เรา-joinเหล่านั้นพร้อมกับ-1+2-1+3-1+4ตัวคั่นเพื่อสร้างสตริงเช่น สตริงจะถูกไพพ์ไปที่Invoke-Expression(คล้ายกับeval) และส่งออกผลลัพธ์


1

Perl, 21 + 2 = 23 ไบต์

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

ต้องการ-aและ-E:

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

คุณสามารถใช้การ-aตั้งค่าสถานะเพื่อรับ@Fตัวแปรด้วยองค์ประกอบที่แบ่งแล้วและแทนที่ -n ด้วย -p ดังนั้นคุณไม่จำเป็นต้องsayลดเป็น 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne

ใช้-pแทนsayเหมือนกันเพราะฉันต้องใช้$_=ต่อไป
andlrc

@ChatterOne -aเป็นความคิดที่ดี!
andlrc

1

Brainfuck, 15 ไบต์

ข้อสังเกตุ: ตัวดำเนินการส่งคืนค่า 0 เมื่ออินพุตทั้งหมดหมดและไม่มีสายต่อพ่วงที่มีปลั๊ก 0 ตัว นอกจากนี้ IO จำเป็นต้องอยู่ในค่าไบต์แทนรหัสอักขระ ASCII

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

คำอธิบาย: ใช้การลงทะเบียน 2 รายการ การลงทะเบียนการสะสม "มูลค่า" ซึ่งแสดงถึงจำนวนของอุปกรณ์ที่สามารถเสียบเข้าและการลงทะเบียน "สายไฟปัจจุบัน" ที่ติดตามค่าของสายไฟปัจจุบัน มันเริ่มต้นด้วยการเพิ่มค่าเป็น 1 สำหรับร้านที่มีอยู่ จากนั้นสำหรับสายต่อแต่ละอันมันจะลบหนึ่งออกจากค่าเนื่องจากมีการใช้ปลั๊กแล้วจึงเพิ่มค่าด้วยจำนวนของปลั๊ก

ล่ามออนไลน์ส่วนใหญ่จะไม่ทำงานในโหมดอินพุตดิบ หากต้องการทดสอบออนไลน์ให้ใช้รหัสนี้:

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

ฉันสามารถทดสอบโปรแกรมที่อื่นได้หรือไม่?
Pål GD

ขอขอบคุณแก้ไขข้อผิดพลาดเหล่านั้น ฉันไม่ทราบว่ามีล่ามออนไลน์ที่ทำงานในโหมดไบต์ ฉันสามารถรวมการใช้งานที่ลบ '0' จากอินพุตที่จะทำงานกับล่ามออนไลน์
อีธาน

หากคุณต้องการทดสอบโค้ดให้รันที่นี่: copy.sh/brainfuckอย่าใส่ช่องว่างระหว่างค่าตัวเลข น่าเสียดายเนื่องจากมันทำงานในโหมด ASCII รหัสการสาธิตจะทำงานกับค่าตัวเลขหลักเดียวเท่านั้น อย่างไรก็ตามรุ่น 15 ไบต์จะทำงานอย่างถูกต้องกับค่า <= 255 หลังจากที่คุณเรียกใช้ดูการถ่ายโอนข้อมูลหน่วยความจำเพื่อดูค่าสุดท้าย
อีธาน

วันหนึ่ง BF จะมีมาตรฐานที่เหมาะสมสำหรับ IO ที่คาดหวังและเราจะสามารถพูดว่า 'ใช้มาตรฐาน 3' แทนเช่น 'อินพุทและเอาท์พุททั้งหมดเป็น asciii ที่ถูกยกเลิกโดย null char'
Pharap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.