Електрична розетка


23

Це проблема NCPC 2005 . У Роя є квартира, яка має лише одну електричну розетку, але у нього є куточок електроживлення. Обчисліть максимальну кількість розеток, які він може мати, використовуючи електроживлення. Кількість розеток на силову смугу задається як вхід.

Виявляється, якщо кількість розеток смуг відповідно

p1,p2,,pн

то кількість розеток становить ,

1-н+ipi

або

1+p1-1+p2-1++pн-1
.

Вхід до програми чи функції - це порожній ряд натуральних чисел.

Приклади

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

17
І я думав, що ти не повинен був приводити в дію силові смуги ...
Joey

Наскільки я можу сказати, моя відповідь на сітківку - це єдина відповідь, використовуючи одинарне введення. Ви можете поглянути на обговорення коментарів там: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Якщо ви вважаєте, що одинарне рішення - це занадто багато хак, що не в дусі виклик, я радий вам вказати, що вхід повинен бути десятковим (і потім відповідно виправлю мою відповідь).
Мартін Ендер

7
Оскільки електроенергія така дорога, ваш код повинен бути якомога коротшим, щоб уникнути використання більше енергії
кішка

1
@cat Час викопати стару машину, що ведеться хом'яками, і механічні комп'ютери.
Фарап

1
@immibis впевнений, але висновок трактуватиметься як інформація, що міститься в байтовому потоці, а не як те, що відбувається, надане вашим терміналом.
Мартін Ендер

Відповіді:



29

Сітківка , 3 байти

 1

Подача підводного каналу є значною.

Введення - це розділений пробілом список одинарних чисел .

Спробуйте в Інтернеті!

Пояснення

Код просто видаляє всі 1рядки, а також після них з рядка. Ось чому це працює:

Додавання в одинарному просто: просто з'єднайте числа, що збігається з видаленням роздільників. Зменшення рівня на 1 також просте: просто видаліть а 1з кожного числа. Хоча ми на 1 більше, ніж сума зменшених входів, тому ми просто видаляємо лише 1s, які ми знаходимо після пробілів, тим самим зменшуючи всі, крім першого введення.


1
Мені цікаво, чи слід дозволити введення даних унар.
Джон Дворак

@JanDvorak це за замовчуванням, якщо виклик прямо не вказує десяткове введення. (Дивіться посилання у відповіді.) Не має значення, Джелі все одно виграє.
Мартін Ендер

@ MartinBüttner У цьому питанні та оригінальному завданні є вибіркові дані. Чи не вважаєте ви (якщо не вказано інше), що код повинен бути необхідним (хоча і не достатнім) критерієм проходження, щоб код працював з даними дослівного зразка?
nitro2k01

1
@ nitro2k01 Ні (у такому випадку більшість відповідей, ймовірно, недійсні). Якщо виклик прямо не вказує конкретний формат введення, ми зазвичай припускаємо, що списки можна приймати у будь-якому форматі нативного списку . Те ж саме стосується форматів чисел (принаймні унарні та прийняття цілих чисел як байтових значень дозволяється консенсусом, якщо виклик не забороняє їх). Досить неможливо включити вибіркові дані у кожен тонкий натурний вхідний формат у виклик.
Мартін Ендер

@ MartinBüttner Імо, це не проблема, яку стосується рекомендація. Що все ще говорить проти цього, це те, що (якщо я не помиляюся) це не працює, тому що унар є підтримуваним або нативним номером у форматі Retina, але це працює, коли ви обробляєте рядок як рядкові дані. Це злом. Це навіть спритний злом, але я все ще не переконаний, що це за правилами. Якби унарні числа, розділені пропуском, були у натисканні на Retina форматом так само, як список байтів - це власний формат у форматі bf, я погодився б, що рекомендація застосовується, і я б мав іншу думку.
nitro2k01

9

Шестикутник , 18 14 байт

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

Розгорнуто:

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

Спробуйте в Інтернеті!

Я не думаю , що сторона довжини 2 можлива, але повинна була б більш ефективною бічній довжиною 3 рішення , що це.

Це звичайний підхід "декремент всіх, сума, приріст", але мені доведеться додати схеми пізніше, щоб показати, як саме він працює в шестикутнику.


7

Пітон, 24 байти

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

Спробуйте в Інтернеті


1
Це передбачає, що функція спочатку призначається, а потім застосовується до вводу з іншої змінної.
Джундесант

1
@juandesant ... що цілком чудово. Це буквальна функція, яка є дійсною формою подання.
FlipTack


7

Haskell, 17 15 байт

foldl1$(+).pred

Приклад використання: ( foldl1$(+).pred ) [2,4,6]-> 10.

Стара версія, інший підхід, 17 байт: succ.sum.map pred.


6

J, 6 байт

+/+1-#

Сума плюс один мінус довжини. Вставте параметри та застосуйте його так:

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

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

Pyth, 5 байт

hstMQ

приріст (сума (карта (декремент, введення)))


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)це дорого, але мені подобається і ця версія.
Ніл


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]).


Дуже елегантно для гольфу
Фарап

4

Зоряний , 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 байт.
Аддісон Кримп

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 з (кращим) підходом Лінни.

{1++/1-⍨⍵}


3

gs2, 5 байт

(CP437-закодований.)

W&Φd'

Ось так read-nums dec m1 sum inc.


3

CJam, 7 байт

q~:(:+)

Перевірте це тут.

Той самий підхід, що і Лінн (зменшення всіх, сума, приріст). Це також працює на 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 )
Бред Гілберт b2gills

11 байт:{.sum-$_+1}
nwellnhof


2

Perl 6 , 20 байт

put 1+sum --«@*ARGS

(Ви можете використовувати <<замість« )

Використання:

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

«Є оператором Perl?
користувач253751

@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

EDIT: Ще одна відповідь, менша (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-бітовими символами (thx @Dennis!). Запустіть encode('ï⒭+‡_')у консолі JS, щоб отримати закодовану форму, і decode(/*ENCODED TEXT HERE*/)розшифруйте закодовану форму.

Пояснення

Перекладається на Javascript ES6 як:

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

Цікаве кодування.
lirtosiast

Це теж непогано працює.
Mama Fun Roll

2

Морнінгтон Півмісяць , 1909 1873 1839 байт

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% усіх інструкцій передбачає взяття на лінію району." Це тому, що район - це всі арифметичні станції. Однак у 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)

Схоже, ви рахуєте новий рядок як два байти. Можливо, замініть його на крапку з двокрапкою, щоб зберегти байт. Кілька пробілів теж можна видалити.
Даффі

1

Рубін, 30 байт

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

Досить просто - починаючи з 1, складайте додані номери, кожне -1 (аргументи командного рядка є $*). Сором inject- таке довге слово.


1

PowerShell, 19 байт

$args-join'-1+'|iex

Зауважте, що 1 + p1-1 + p2-1 + ... + pn-1еквівалентно p1-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" замість, наприклад "введення та виведення - це всі припинення, що припиняються нульовою графікою".
Фарап
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.