Outlet listrik


23

Ini adalah masalah dari NCPC 2005 . Roy memiliki apartemen dengan hanya satu outlet listrik, tetapi ia memiliki banyak colokan listrik. Hitung jumlah outlet maksimum yang dapat ia miliki dengan menggunakan soket ekstensi yang ia miliki. Jumlah outlet per strip daya diberikan sebagai input.

Ternyata jika jumlah outlet masing-masing strip

p1,p2,,pn

maka jumlah outlet adalah ,

1n+ipi

atau

.

1+p11+p21++pn1

Input ke program atau fungsi adalah serangkaian bilangan bulat positif yang tidak kosong.

Contohnya

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

17
Dan saya pikir Anda tidak seharusnya memasang kabel listrik ...
Joey

Sejauh yang saya tahu jawaban Retina saya adalah satu-satunya jawaban yang menggunakan input unary. Anda mungkin ingin melihat diskusi komentar di sana: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Jika Anda berpikir bahwa solusi unary adalah terlalu banyak peretasan yang tidak sesuai semangat tantangannya, saya senang bagi Anda untuk menentukan bahwa input harus dalam desimal (dan kemudian akan memperbaiki jawaban saya sesuai).
Martin Ender

7
Karena listrik sangat mahal, kode Anda harus sesingkat mungkin untuk menghindari menggunakan lebih banyak energi
cat

1
@cat Waktu untuk menggali mesin turing yang digerakkan hamster tua dan komputer mekanik.
Pharap

1
@ imibis yakin, tetapi output akan diperlakukan sebagai informasi yang terkandung dalam aliran byte tidak seperti apa yang terjadi oleh yang diberikan oleh terminal Anda.
Martin Ender

Jawaban:



29

Retina , 3 byte

 1

Linefeed tambahan sangat penting.

Input adalah daftar angka unary yang dipisahkan oleh spasi .

Cobalah online!

Penjelasan

Kode hanya menghapus semua spasi dan juga 1setelah mereka dari string. Inilah mengapa itu bekerja:

Penambahan di unary sederhana: hanya menggabungkan angka-angka yang sama dengan menghapus pembatas. Mengurangkan dengan 1 juga sederhana: cukup hapus a 1dari setiap angka. Kami menginginkan 1 lebih dari jumlah input yang dikurangi, jadi kami hanya menghapus yang 1kami temukan setelah spasi, sehingga mengurangi semua kecuali input pertama.


1
Saya bertanya-tanya apakah input di unary harus diizinkan.
John Dvorak

@ JanDvorak secara default, kecuali jika tantangan secara eksplisit menentukan input desimal. (Lihat tautan di jawaban.) Tidak masalah, Jelly tetap menang.
Martin Ender

@ MartinBüttner Ada sampel data baik dalam pertanyaan ini dan tugas asli. Tidakkah Anda berpikir (kecuali dinyatakan lain) bahwa itu harus menjadi kriteria yang diperlukan (meskipun tidak cukup) untuk lulus, bahwa kode tersebut bekerja dengan data sampel kata demi kata?
nitro2k01

1
@ nitro2k01 Tidak (dalam hal ini sebagian besar jawaban mungkin tidak valid). Kecuali jika tantangan secara eksplisit menentukan satu format input tertentu, kami biasanya menganggap bahwa daftar dapat diambil dalam format daftar asli apa pun . Hal yang sama berlaku untuk format angka (setidaknya unary dan mengambil integer sebagai nilai byte diizinkan oleh konsensus kecuali ada tantangan yang melarangnya). Sangat tidak mungkin untuk memasukkan data sampel dalam setiap format input asli yang masuk akal dalam tantangan.
Martin Ender

@ MartinBüttner Imo, itu bukan masalah yang direkomendasikan oleh alamat tersebut. Yang masih berbicara tentang ini adalah bahwa (kecuali saya salah) ini tidak berfungsi karena unary adalah format angka yang didukung atau asli di Retina tetapi itu terjadi ketika Anda memproses string sebagai data string. Ini hack. Bahkan ini adalah peretasan yang cerdas, tetapi saya masih tidak yakin bahwa itu sesuai dengan aturan. Jika angka-angka unary yang dipisahkan ruang adalah format asli di Retina dengan cara yang sama bahwa daftar byte adalah format asli dalam bf, saya akan menyetujui rekomendasi yang berlaku dan saya akan memiliki pendapat yang berbeda.
nitro2k01

9

Hexagony , 18 14 byte

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

Dibuka:

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

Cobalah online!

Saya tidak berpikir panjang sisi 2 adalah mungkin, tetapi harus ada solusi sisi panjang 3 yang lebih efisien.

Ini adalah pendekatan "decrement all, sum, increment" yang biasa, tetapi saya harus menambahkan diagram nanti untuk menunjukkan cara kerjanya di Hexagony.


7

Python, 24 byte

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

Cobalah online


1
Ini mengasumsikan bahwa fungsi pertama kali ditugaskan, kemudian diterapkan pada input dari variabel lain.
juandesant

1
@juandesant ... sangat bagus. Ini adalah fungsi literal, yang merupakan bentuk pengajuan yang valid.
FlipTack


7

Haskell, 17 15 byte

foldl1$(+).pred

Contoh penggunaan: ( foldl1$(+).pred ) [2,4,6]-> 10.

Versi lama, pendekatan yang berbeda, 17 byte: succ.sum.map pred.


6

J, 6 byte

+/+1-#

Jumlah plus satu panjang minus. Kuras dan terapkan, seperti:

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

6

Labirin , 9 byte

"?;)!@
+(

Cobalah online!

Primer yang biasa:

  • Labyrinth adalah 2D dan berbasis stack. Tumpukan memiliki angka nol tanpa batas di bagian bawah.
  • Ketika penunjuk instruksi mencapai persimpangan, itu memeriksa bagian atas tumpukan untuk menentukan ke mana harus belok berikutnya. Negatif dibiarkan, nol di depan dan positif di kanan.

Di sini kita mulai dari kiri atas ", no-op, menuju ke kanan. Selanjutnya adalah ?, yang membaca int dari STDIN (membuang karakter yang tidak dapat diurai sebagai bilangan bulat, misalnya spasi). Sekarang kami memiliki dua kasus:

Jika input positif, kami belok kanan, melakukan:

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

Jika inputnya nol (yang terjadi pada EOF), kami langsung melanjutkan, melakukan:

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

5

Pyth, 5 byte

hstMQ

increment (jumlah (peta (decrement, input)))


5

ES6, 25 byte

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

4
Saya akan memposting: "Salah satu kasus langka ketika mengurangi memenangkan permainan" ... dan itu 25 juga l=>l.reduce((a,b)=>a+b-1).
edc65

@ edc65 Ya, (,b)ini mahal, tapi saya suka versi itu juga.
Neil


4

05AB1E , 4 byte

Kode:

E<O>

Penjelasan:

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

Mengambil input seperti array (mis [3, 4, 5].).


Sangat elegan untuk lang golf
Pharap

4

Starry , 26 24 byte

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

Mengharapkan bilangan bulat yang dipisahkan oleh baris. Cobalah online!

Terima kasih kepada @ MartinBüttner untuk -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

Loop tidak dibuka sehingga angka pertama tidak dikurangi, meniadakan kebutuhan untuk bertambah. Mendorong angka itu mahal di Starry ...


Saya hanya menghitung 20 byte.
Addison Crump

1
@VoteToClose Apakah Anda menghitung spasi utama? (Saya berasumsi Anda sedang berbicara tentang 26 byte)
Sp3000

4

Utilitas Bash + GNU, 16

Jika ada Nstrip daya, maka harus ada N-1pemisah dalam daftar input yang dipisahkan koma. Yang perlu kita lakukan adalah mengganti separator dengan - 1 +dan mengevaluasi secara hitung:

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

Atau menggunakan trik yang sama:

Bash Murni (tanpa utilitas eksternal), 19

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

3

APL (NARS 2000), 13 10 byte

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

Sunting: Down to 10 with Lynn's (better) approach.

{1++/1-⍨⍵}


3

gs2, 5 byte

(Di-encode CP437.)

W&Φd'

Itu read-nums dec m1 sum inc.


3

CJam, 7 byte

q~:(:+)

Uji di sini.

Pendekatan yang sama dengan Lynn (decrement all, sum, increment). Ini juga berfungsi untuk 8 byte (dan mungkin sedikit lebih menarik):

q~{(+}*

Ini melipat "decrement, add" di atas daftar. Dengan melakukan itu, pengurangan hanya diterapkan ke semua elemen kecuali yang pertama, sehingga kita tidak perlu mengurus kenaikan secara terpisah.


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+[+] --«@_}

pemakaian

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

Saya sepenuhnya bermaksud untuk mengedit jawaban saya untuk hal yang sama (lihat komentar html )
Brad Gilbert b2gills

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

3

Serius, 7 byte

,;l@Σ-u

Cobalah online!

Penjelasan:

,;l@Σ-u
,        push input
 ;       dupe
  l@     push length (n), swap
    Σ-u  push sum, subtract n, add one

2

Perl 6 , 20 byte

put 1+sum --«@*ARGS

(Anda bisa menggunakan <<bukan «)

Pemakaian:

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

«Adalah operator Perl?
user253751

@immibis Sebenarnya itu adalah bagian dari beberapa operator Perl 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Beberapa dari mereka adalah apa yang dikenal sebagai operator Meta, di mana mereka bergabung dengan operator lain. (Perl 5 tidak memiliki operator tersebut saat ini.)
Brad Gilbert b2gills

2

Perl 5 23 + 2 = 25 atau 19 + 2 = 21

Membutuhkan -apbendera:

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

Disimpan dalam file dan jalankan sebagai

perl -ap file.pl

EDIT: Jawaban lain, lebih kecil (19 + 2) tetapi pada dasarnya disalin dari dev-null answer:

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

2

F #, 25 byte

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

Ini adalah fungsi yang mengambil dalam array / daftar / urutan bilangan bulat dan mengembalikan hasil yang diperlukan.

Bagaimana itu bekerja:

Seq.foldmemungkinkan Anda untuk menerapkan fungsi ke setiap elemen berurutan sambil membawa beberapa keadaan sekitar saat itu melakukannya. Hasil dari fungsi sebagaimana diterapkan pada elemen pertama akan memberikan status yang akan dimasukkan ke dalam fungsi untuk elemen kedua, dan seterusnya. Misalnya, untuk meringkas daftar [1; 3; 4; 10], Anda akan menulisnya seperti ini:

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

Yang akan diterapkan seperti ini:

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

Dengan status terakhir menjadi nilai pengembalian Seq.fold.


2

𝔼𝕊𝕄𝕚𝕟, 5 karakter / 7 byte

ï⒭+‡_

Try it here (Firefox only).

Menggunakan penyandian khusus dengan karakter 10-bit (thx @Dennis!). Jalankan encode('ï⒭+‡_')di konsol JS untuk mendapatkan formulir yang disandikan, dandecode(/*ENCODED TEXT HERE*/) mendekodekan formulir yang disandikan.

Penjelasan

Diterjemahkan ke Javascript ES6 sebagai:

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

Pengkodean yang menarik.
lirtosiast

Ini juga bekerja dengan sangat baik.
Mama Fun Roll

2

Mornington Crescent , 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

Cobalah online!


"90% dari semua instruksi melibatkan mengambil Garis Distrik." Itu karena District adalah tempat semua stasiun aritmatika berada. Namun, pada TIO, sepertinya tidak berfungsi untuk semua contoh .
NieDzejkob

1873 byte dengan menggunakan nama garis yang lebih pendek jika mungkin
NieDzejkob

Penerjemah TIO memiliki bug dan tidak mengimplementasikan Turnham Green
pppery

Tangkapan bagus. Saya telah mengirim PR yang memperbaikinya di hulu.
NieDzejkob

1

Python 3, 79 byte

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

Sepertinya Anda menghitung baris baru sebagai dua byte. Mungkin menggantinya dengan titik koma untuk menyimpan byte. Beberapa ruang juga dapat dihapus.
Daffy

1

Ruby, 30 byte

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

Cukup sederhana - mulai dari 1, tambahkan angka yang disediakan, masing-masing -1 (arg baris perintah ada di $*). Rasa malu injectadalah kata yang panjang.


1

PowerShell, 19 byte

$args-join'-1+'|iex

Catatan yang 1 + p1-1 + p2-1 + ... + pn-1setara denganp1-1 + p2-1 + ... + pn .

Mengambil input sebagai argumen baris perintah terpisah dengan $args. Kami -joinyang bersama dengan -1+pembatas untuk membuat string, seperti 2-1+3-1+4. String kemudian disalurkan ke Invoke-Expression(mirip dengan eval), dan menampilkan hasilnya.


1

Perl, 21 + 2 = 23 byte

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

Membutuhkan -adan -E:

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

Anda dapat menggunakan -abendera untuk mendapatkan @Fvariabel dengan elemen yang sudah terpecah, dan ganti -n dengan -p sehingga Anda tidak perlu say, menguranginya menjadi 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne

Menggunakan -pbukannya saysama karena saya harus $_=tetap menggunakan .
andlrc

@ChatterOne -aadalah ide bagus!
andlrc

1

Brainfuck, 15 byte

Asumsi: The, operator mengembalikan 0 setelah semua input telah habis, dan tidak ada kabel ekstensi dengan 0 colokan. Juga, IO harus dalam nilai byte, bukan kode karakter ASCII.

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

Penjelasan: Ini menggunakan 2 register. Daftar akumulator "Nilai", mewakili jumlah perangkat yang dapat dicolokkan, dan register "kabel saat ini" yang melacak nilai kabel saat ini. Dimulai dengan menambah nilainya dengan 1, untuk outlet yang ada. Kemudian, untuk setiap kabel ekstensi, itu mengurangi satu dari nilai karena plug diambil, kemudian menambah nilainya dengan jumlah plug.

Kebanyakan penerjemah online tidak beroperasi dalam mode input byte mentah. Untuk mengujinya secara online, gunakan kode ini:

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

Bisakah saya menguji program di suatu tempat?
Pål GD

Terima kasih, koreksi kesalahan-kesalahan itu. Saya tidak mengetahui adanya penerjemah online yang beroperasi dalam mode byte. Saya dapat menggabungkan implementasi yang mengurangi '0' dari input yang akan berjalan pada penerjemah online apa pun.
Ethan

Jika Anda ingin menguji kode, jalankan di sini: copy.sh/brainfuck Jangan menaruh spasi di antara nilai-nilai numerik. Sayangnya, karena beroperasi dalam mode ASCII, kode demo hanya akan berfungsi pada nilai satu digit. Namun, versi 15 byte akan bekerja dengan baik pada nilai <= 255. Setelah Anda menjalankannya, lihat dump memori untuk melihat nilai akhir.
Ethan

Suatu hari BF akan memiliki standar yang sesuai untuk IO yang diharapkan dan kita hanya akan bisa mengatakan 'menggunakan standar 3' alih-alih misalnya 'input dan output semuanya diakhiri oleh null char'.
Pharap
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.