Prise électrique

23

Il s'agit d'un problème du NCPC 2005 . Roy a un appartement avec une seule prise électrique, mais il a un tas de multiprises. Calculez le nombre maximum de prises qu'il peut avoir en utilisant les multiprises dont il dispose. Le nombre de prises par multiprise est donné en entrée.

Il s'avère que si le nombre de sorties des bandes respectivement est

p1,p2,,pn

alors le nombre de sorties est ,

1n+ipi

ou

.

1+p11+p21++pn1

L'entrée du programme ou de la fonction est une série non vide d'entiers positifs.

Exemples

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098
Pål GD
la source
17
Et je pensais que tu n'étais pas censé enchaîner les multiprises ...
Joey
Autant que je sache, ma réponse Retina est la seule réponse utilisant une entrée unaire. Vous voudrez peut-être jeter un œil à la discussion sur les commentaires ici: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Si vous pensez que la solution unaire est trop un hack qui n'est pas dans l'esprit de le défi, je suis heureux pour vous de spécifier que l'entrée doit être en décimal (et corrigera ensuite ma réponse en conséquence).
Martin Ender
7
Parce que l'électricité est si chère, votre code doit être aussi court que possible pour éviter d'utiliser plus d'énergie
cat
1
@cat Il est temps de creuser la vieille machine à turing entraînée par des hamsters et les ordinateurs mécaniques.
Pharap
1
@immibis bien sûr, mais la sortie serait traitée comme les informations contenues dans le flux d'octets et non comme ce qui se passe par rendu par votre terminal.
Martin Ender

Réponses:

29

Rétine , 3 octets

 1

Le saut de ligne arrière est important.

L'entrée est une liste de nombres unaires séparés par des espaces .

Essayez-le en ligne!

Explication

Le code supprime simplement tous les espaces ainsi que 1les suivants de la chaîne. Voici pourquoi cela fonctionne:

L'ajout dans unaire est simple: il suffit de concaténer les nombres, ce qui revient à supprimer les délimiteurs. La décrémentation de 1 est également simple: il suffit de supprimer un 1de chaque nombre. Nous voulons cependant 1 de plus que la somme des entrées décrémentées, donc nous ne supprimons que les 1s que nous trouvons après les espaces, décrémentant ainsi toutes les entrées sauf la première.

Martin Ender
la source
1
Je me demande si la saisie en unaire devrait être autorisée.
John Dvorak
@JanDvorak c'est par défaut, sauf si le défi spécifie explicitement l'entrée décimale. (Voir le lien dans la réponse.) Peu importe, Jelly gagne quand même.
Martin Ender
@ MartinBüttner Il y a des exemples de données à la fois dans cette question et dans la mission d'origine. Ne pensez-vous pas (sauf indication contraire) que ce devrait être un critère de passage nécessaire (mais pas suffisant), que le code fonctionne avec les données de l'échantillon textuel?
nitro2k01
1
@ nitro2k01 Non (dans ce cas, la plupart des réponses seraient probablement invalides). Sauf si le défi spécifie explicitement un format d'entrée particulier, nous supposons normalement que les listes peuvent être prises dans n'importe quel format de liste natif . Il en va de même pour les formats numériques (au moins unaires et en prenant des entiers car les valeurs d'octets sont autorisées par consensus à moins que le défi ne les interdise). Il est à peu près impossible d'inclure des exemples de données dans tous les formats d'entrée natifs imaginables dans le défi.
Martin Ender
@ MartinBüttner Imo, ce n'est pas le problème que la recommandation aborde. Ce qui parle toujours contre cela, c'est que (sauf erreur) cela ne fonctionne pas car unaire est un format numérique pris en charge ou natif dans Retina mais il se trouve que cela fonctionne lorsque vous traitez la chaîne en tant que données de chaîne. C'est un hack. C'est même un hack intelligent, mais je ne suis toujours pas convaincu que cela soit conforme aux règles. Si les nombres unaires séparés par des espaces étaient un format natif dans Retina de la même manière qu'une liste d'octets est un format natif dans bf, je serais d'accord que la recommandation s'applique et j'aurais une opinion différente.
nitro2k01
9

Hexagonie , 18 14 octets

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

Déplié:

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

Essayez-le en ligne!

Je ne pense pas que la longueur du côté 2 soit possible, mais il doit y avoir une solution plus efficace du côté 3 que cela.

C'est l'approche habituelle "décrémenter tout, somme, incrémenter", mais je devrai ajouter des diagrammes plus tard pour montrer comment cela fonctionne exactement dans Hexagony.

Martin Ender
la source
7

Python, 24 octets

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

Essayez-le en ligne

Mego
la source
1
Cela suppose que la fonction est d'abord affectée, puis appliquée à l'entrée d'une autre variable.
juandesant
1
@juandesant ... qui est parfaitement bien. C'est une fonction littérale, qui est une forme de soumission valide.
FlipTack
7

Mathematica, 9 octets

Tr[#-1]+1&
A Simmons
la source
7

Haskell, 17 15 octets

foldl1$(+).pred

Exemple d'utilisation: ( foldl1$(+).pred ) [2,4,6]->10 .

Ancienne version, approche différente, 17 octets: succ.sum.map pred.

nimi
la source
6

J, 6 octets

+/+1-#

Somme plus une longueur moins. Entre parenthèses et appliquez-le, comme ceci:

   (+/+1-#) 2 3 4
7
Lynn
la source
6

Labyrinthe , 9 octets

"?;)!@
+(

Essayez-le en ligne!

Le primaire habituel:

  • Labyrinth est 2D et basé sur la pile. Les piles ont un nombre infini de zéros en bas.
  • Lorsque le pointeur d'instruction atteint une jonction, il vérifie le haut de la pile pour déterminer où tourner ensuite. Le négatif est à gauche, le zéro est en avant et le positif est à droite.

Ici, nous commençons en haut à gauche ", un no-op, se dirigeant vers la droite. Ensuite ?, qui lit un entier dans STDIN (jetant les caractères qu'il ne peut pas analyser comme un entier, par exemple des espaces). Maintenant, nous avons deux cas:

Si l'entrée est positive, nous tournons à droite en effectuant:

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

Si l'entrée est nulle (ce qui se produit à EOF), nous allons tout droit en effectuant:

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

Pyth, 5 octets

hstMQ

incrément (somme (mappage (décrémentation, entrée)))

Lynn
la source
5

ES6, 25 octets

a=>a.map(n=>r+=n-1,r=1)|r
Neil
la source
4
J'allais poster: "L'un des rares cas où réduire gagne le match" ... et c'est 25 aussi l=>l.reduce((a,b)=>a+b-1).
edc65
@ edc65 Oui, (,b)c'est cher, mais j'aime aussi cette version.
Neil
4

05AB1E , 4 octets

Code:

E<O>

Explication:

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

Prend l'entrée comme un tableau (par exemple [3, 4, 5]).

Adnan
la source
Très élégant pour une
langue de
4

Étoilé , 26 24 octets

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

Attend des entiers séparés par des sauts de ligne. Essayez-le en ligne!

Merci à @ MartinBüttner pour -2 octets.

,           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

La boucle est déroulée afin que le premier nombre ne soit pas décrémenté, ce qui annule la nécessité d'incrémenter. Pousser les chiffres coûte cher dans Starry ...

Sp3000
la source
Je ne compte que 20 octets.
Addison Crump
1
@VoteToClose Did you count the leading spaces? (I'm assuming you're talking about the 26 byte)
Sp3000
4

Bash + GNU utilities, 16

If there are N power strips, then there should be N-1 separators in the comma-separated input list. All we need to do is replace the separators with - 1 + and arithmetically evaluate:

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

Or using the same trick:

Pure Bash (no external utilities), 19

echo $[${1//,/-1+}]
Digital Trauma
la source
3

APL (NARS 2000), 13 10 bytes

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

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

{1++/1-⍨⍵}

Koneke
la source
3

gs2, 5 bytes

(CP437-encoded.)

W&Φd'

That’s read-nums dec m1 sum inc.

Lynn
la source
3

CJam, 7 bytes

q~:(:+)

Test it here.

Same approach as Lynn's (decrement all, sum, increment). This also works for 8 bytes (and is maybe a bit more interesting):

q~{(+}*

Cela replie "décrémenter, ajouter" sur la liste. En faisant cela, la décrémentation n'est appliquée qu'à tous les éléments à l'exception du premier, de sorte que nous n'avons pas besoin de prendre soin de l'incrément séparément.

Martin Ender
la source
3

C, 60 59 55 octets

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

Perl 6, 14 octets

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

usage

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
Raccourcis clavier
la source
J'avais bien l'intention de modifier ma réponse à la même chose (voir le commentaire html )
Brad Gilbert b2gills
11 octets:{.sum-$_+1}
nwellnhof
3

Sérieusement, 7 octets

,;l@Σ-u

Essayez-le en ligne!

Explication:

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

Perl 6 , 20 octets

put 1+sum --«@*ARGS

(Vous pouvez utiliser <<au lieu de« )

Usage:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098
Brad Gilbert b2gills
la source
«Est un opérateur Perl?
user253751
@immibis En fait, il fait partie de plusieurs opérateurs Perl 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Plusieurs d'entre eux sont ce que l'on appelle les opérateurs Meta, car ils se combinent avec d'autres opérateurs. (Perl 5 n'a pas ces opérateurs actuellement.)
Brad Gilbert b2gills
2

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

Nécessite des -apdrapeaux:

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

Enregistré dans un fichier et exécuté en tant que

perl -ap file.pl

EDIT: Une autre réponse, plus petite (19 + 2) mais essentiellement copiée à partir de la réponse dev-null:

$.+=$_-1for@F;$_=$.
ChatterOne
la source
2

F #, 25 octets

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

Il s'agit d'une fonction qui prend dans un tableau / liste / séquence d'entiers et renvoie le résultat requis.

Comment ça marche:

Seq.foldvous permet d'appliquer une fonction à chaque élément d'une séquence tout en portant un état tout en le faisant. Le résultat de la fonction appliquée au premier élément donnera l'état qui sera mis dans la fonction du deuxième élément, et ainsi de suite. Par exemple, pour résumer la liste [1; 3; 4; 10], vous l'écririez comme ceci:

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

Ce qui serait appliqué ainsi:

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

Le dernier état étant la valeur de retour de Seq.fold.

Roujo
la source
2

𝔼𝕊𝕄𝕚𝕟, 5 caractères / 7 octets

ï⒭+‡_

Try it here (Firefox only).

Utilise un encodage personnalisé avec des caractères 10 bits (thx @Dennis!). Exécutez encode('ï⒭+‡_')dans la console JS pour obtenir un formulaire encodé, etdecode(/*ENCODED TEXT HERE*/) pour décoder le formulaire codé.

Explication

Se traduit en Javascript ES6 comme:

i=>i.reduce(($,_)=>$+--_)
Mama Fun Roll
la source
Encodage intéressant.
lirtosiast
Cela fonctionne très bien aussi.
Mama Fun Roll
2

Mornington Crescent , 1909 1873 1839 octets

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

Essayez-le en ligne!

pppery
la source
"90% de toutes les instructions impliquent de prendre la ligne de district." C'est parce que District est l'endroit où se trouvent toutes les stations arithmétiques. Cependant, sur TIO, cela ne semble fonctionner pour aucun des exemples .
NieDzejkob
1873 octets en utilisant des noms de ligne plus courts dans la mesure du possible
NieDzejkob
L'interprète de TIO a un bug et
n'implémente
Belle prise. J'ai envoyé un PR qui le corrige en amont.
NieDzejkob
1

Python 3, 79 bytes

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)
Pål GD
la source
Looks like you're counting a newline as two bytes. Maybe replace it with a semi-colon to save a byte. A few spaces can be removed too.
Daffy
1

Ruby, 30 bytes

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

Simple enough - starting from 1, add up the supplied numbers, each -1 (command line args are in $*). Shame inject is such a long word.

Chowlett
la source
1

PowerShell, 19 bytes

$args-join'-1+'|iex

Note that 1 + p1-1 + p2-1 + ... + pn-1 is equivalent to p1-1 + p2-1 + ... + pn.

Takes input as separate command-line arguments with $args. We -join those together with a -1+ delimiter to create a string, such as 2-1+3-1+4. The string is then piped to Invoke-Expression (similar to eval), and outputs the result.

AdmBorkBork
la source
1

Perl, 21 + 2 = 23 bytes

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

Requires -a and -E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7
andlrc
la source
You can use the -a flag to get @F variable with already split elements, and replace -n with -p so you dont'need say, reducing it to 21+2: $a+=$_-1for@F;$_=++$a
ChatterOne
Using -p instead of say is the same because I need to use $_= anyway.
andlrc
@ChatterOne -a is a good idea!
andlrc
1

Brainfuck, 15 bytes

Assumption: The , operator returns 0 once all input has been exhausted, and there are no extension cords with 0 plugs. Also, the IO needs to be in byte values instead of ASCII character codes.

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

Explanation: This uses 2 registers. A "Value" accumulator register, representing the number of devices that can be plugged in, and a "current cord" register that keeps track of the value of the current cord. It starts off by incrementing the value by 1, for the existing outlet. Then, for each extension cord, it subtracts one from the value since a plug is being taken up, then increments the value by the number of plugs.

Most online interpreters don't operate in raw byte input mode. To test it online, use this code:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.
Ethan
la source
Can I test the program somewhere?
Pål GD
Thanks, corrected those mistakes. I'm not aware of any online interpreters that operate in byte mode. I can throw together an implementation that subtracts '0' from the inputs that will run on any online interpreter.
Ethan
If you want to test out the code, run it here: copy.sh/brainfuck Don't put spaces in between the numerical values. Unfortunately, since it's operating in ASCII mode, the demo code will only work on single digit values. However, the 15 byte version will work properly on an value <= 255. After you run it, view the memory dump to view the final value.
Ethan
One day BF will have proper standards for expected IO and we'll just be able to say 'using standard 3' instead of e.g. 'input and output are all asciii terminated by null char'.
Pharap