Toma de corriente

23

Este es un problema de NCPC 2005 . Roy tiene un departamento con una sola toma de corriente, pero tiene un montón de enchufes. Calcule el número máximo de salidas que puede tener usando las tiras de energía que tiene. El número de salidas por regleta se da como entrada.

Resulta que si el número de salidas de las tiras respectivamente son

pags1,pags2,...,pagsnorte

entonces el número de salidas es ,

1-norte+yopagsyo

o

.

1+pags1-1+pags2-1++pagsnorte-1

La entrada al programa o función es una serie no vacía de enteros positivos.

Ejemplos

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098
Pål GD
fuente
17
Y pensé que no se suponía que debías encadenar tiras de energía ...
Joey
Por lo que puedo decir, mi respuesta de Retina es la única respuesta que usa una entrada unaria. Es posible que desee echar un vistazo a la discusión de comentarios allí: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Si cree que la solución unaria es un truco que no está en el espíritu de El desafío, me alegra que especifique que la entrada debe estar en decimal (y luego solucionará mi respuesta en consecuencia).
Martin Ender
77
Debido a que la electricidad es muy costosa, su código debe ser lo más breve posible para evitar el uso de más energía
cat
1
@cat Es hora de desenterrar la vieja máquina de turing impulsada por el hámster y las computadoras mecánicas.
Pharap
1
@immibis seguro, pero la salida se trataría como la información contenida en la secuencia de bytes, no como lo que sucede con su terminal.
Martin Ender

Respuestas:

29

Retina , 3 bytes

 1

El avance de línea final es significativo.

La entrada es una lista separada por espacios de números unarios .

Pruébalo en línea!

Explicación

El código simplemente elimina todos los espacios, así como los 1siguientes, de la cadena. Aquí es por qué eso funciona:

La adición en unario es simple: simplemente concatene los números, lo que equivale a eliminar los delimitadores. Disminuir en 1 también es simple: simplemente elimine a 1de cada número. Sin embargo, queremos 1 más que la suma de las entradas decrementadas, por lo que simplemente eliminamos los 1s que encontramos después de los espacios, disminuyendo así todos menos la primera entrada.

Martin Ender
fuente
1
Me pregunto si debería permitirse la entrada en unario.
John Dvorak
@ JanDvorak es por defecto, a menos que el desafío especifique explícitamente la entrada decimal. (Vea el enlace en la respuesta.) Sin embargo, no importa, Jelly está ganando de todos modos.
Martin Ender
@ MartinBüttner Hay datos de muestra tanto en esta pregunta como en la asignación original. ¿No cree (a menos que se indique lo contrario) que debería ser un criterio necesario (aunque no suficiente) para aprobar, que el código funciona con los datos de muestra textuales?
nitro2k01
1
@ nitro2k01 No (en ese caso, la mayoría de las respuestas probablemente no sean válidas). A menos que el desafío especifique explícitamente un formato de entrada particular , normalmente asumimos que las listas se pueden tomar en cualquier formato de lista nativa . Lo mismo ocurre con los formatos de números (al menos unarios y tomar enteros como valores de byte permitidos por consenso a menos que el desafío los prohíba). Es prácticamente imposible incluir datos de muestra en todos los formatos de entrada nativos imaginables en el desafío.
Martin Ender
@ MartinBüttner Imo, ese no es el problema que aborda la recomendación. Lo que todavía habla en contra de esto es que (a menos que me equivoque) esto no funciona porque unary es un formato de número nativo o compatible en Retina, pero sucede que funciona cuando procesas la cadena como datos de cadena. Es un hack. Incluso es un truco inteligente, pero todavía no estoy convencido de que sea de acuerdo con las reglas. Si los números unarios separados por espacios fueran un formato nativo en Retina de la misma manera que una lista de bytes es un formato nativo en bf, estaría de acuerdo en que la recomendación se aplica y tendría una opinión diferente.
nitro2k01
9

Hexagonia , 18 14 bytes

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

Desplegado:

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

Pruébalo en línea!

No creo que la longitud lateral 2 sea posible, pero hay debe haber una solución de longitud lateral 3 más eficiente que esta.

Este es el enfoque habitual de "decrementar todo, suma, incremento", pero tendré que agregar diagramas más adelante para mostrar cómo funciona exactamente en Hexagony.

Martin Ender
fuente
7

Python, 24 bytes

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

Pruébalo en línea

Mego
fuente
1
Esto supone que la función se asigna primero, luego se aplica a la entrada de otra variable.
juandesant
1
@juandesant ... que está perfectamente bien. Es una función literal, que es una forma válida de presentación.
FlipTack
7

Mathematica, 9 bytes

Tr[#-1]+1&
Un simmons
fuente
7

Haskell, 17 15 bytes

foldl1$(+).pred

Ejemplo de uso: ( foldl1$(+).pred ) [2,4,6]-> 10.

Versión antigua, enfoque diferente, 17 Bytes: succ.sum.map pred.

nimi
fuente
6

J, 6 bytes

+/+1-#

Suma más uno menos longitud. Paréntesis y aplíquelo, así:

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

Laberinto , 9 bytes

"?;)!@
+(

Pruébalo en línea!

La cartilla habitual:

  • Labyrinth es 2D y está basado en pila. Las pilas tienen un número infinito de ceros en la parte inferior.
  • Cuando el puntero de instrucción alcanza una unión, comprueba la parte superior de la pila para determinar a dónde girar a continuación. Negativo es izquierdo, cero es hacia adelante y positivo es correcto.

Aquí comenzamos en la parte superior izquierda ", un no-op, hacia la derecha. El siguiente es ?, que lee un int de STDIN (descartando caracteres que no puede analizar como un entero, por ejemplo, espacios). Ahora tenemos dos casos:

Si la entrada es positiva, giramos a la derecha, realizando:

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

Si la entrada es cero (que ocurre en EOF), seguimos adelante, realizando:

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

Pyth, 5 bytes

hstMQ

incremento (suma (mapa (decremento, entrada)))

Lynn
fuente
5

ES6, 25 bytes

a=>a.map(n=>r+=n-1,r=1)|r
Neil
fuente
44
Iba a publicar: "Uno de los raros casos en que reduce gana el juego" ... y también son 25 l=>l.reduce((a,b)=>a+b-1).
edc65
@ edc65 Sí, (,b)es costoso, pero también me gusta esa versión.
Neil
5

MATL, 3 bytes

qsQ

Pruébalo en línea.

Explicación

qsQ
q      thread decrement over the input array
  s    sum
   Q   increment
un espagueti
fuente
4

05AB1E , 4 bytes

Código:

E<O>

Explicación:

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

Toma la entrada como una matriz (por ejemplo [3, 4, 5]).

Adnan
fuente
Muy elegante para un lang de golf
Pharap
4

Estrellado , 26 24 bytes

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

Espera enteros separados por nueva línea. Pruébalo en línea!

Gracias a @ MartinBüttner por -2 bytes.

,           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

El bucle se desenrolla para que el primer número no disminuya, lo que niega la necesidad de incrementar. Empujar números es caro en Starry ...

Sp3000
fuente
Cuento solo 20 bytes.
Addison Crump
1
@VoteToClose ¿Contaste los espacios iniciales? (Supongo que estás hablando del 26 byte)
Sp3000
4

Bash + GNU utilidades, 16

Si hay Ntiras de alimentación, entonces debería haber N-1separadores en la lista de entrada separada por comas. Todo lo que necesitamos hacer es reemplazar los separadores con - 1 +y evaluar aritméticamente:

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

O usando el mismo truco:

Pure Bash (sin utilidades externas), 19

echo $[${1//,/-1+}]
Trauma digital
fuente
3

APL (NARS 2000), 13 10 bytes

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

Editar: hasta 10 con el enfoque (mejor) de Lynn.

{1++/1-⍨⍵}

Koneke
fuente
3

gs2, 5 bytes

(CP437-codificado)

W&Φd'

Eso es read-nums dec m1 sum inc.

Lynn
fuente
3

CJam, 7 bytes

q~:(:+)

Pruébalo aquí.

El mismo enfoque que el de Lynn (decrementar todo, suma, incremento). Esto también funciona para 8 bytes (y quizás sea un poco más interesante):

q~{(+}*

Esto pliega "decremento, agregar" sobre la lista. Al hacerlo, la disminución solo se aplica a todos los elementos, excepto al primero, de modo que no necesitamos ocuparnos del incremento por separado.

Martin Ender
fuente
3

C, 60 59 55 bytes

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

Perl 6, 14 bytes

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

uso

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
Teclas de acceso rápido
fuente
Tenía toda la intención de editar mi respuesta a la misma cosa (ver el comentario html )
Brad Gilbert b2gills
11 bytes:{.sum-$_+1}
nwellnhof el
3

En serio, 7 bytes

,;l@Σ-u

Pruébalo en línea!

Explicación:

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

Perl 6 , 20 bytes

put 1+sum --«@*ARGS

(Puedes usar en <<lugar de «)

Uso:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098
Brad Gilbert b2gills
fuente
«Es un operador de Perl?
user253751
@immibis En realidad, es parte de varios operadores de Perl 6. @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Varios de ellos son lo que se conoce como operadores Meta, ya que se combinan con otros operadores. (Perl 5 no tiene esos operadores actualmente.)
Brad Gilbert b2gills
2

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

Requiere -apbanderas:

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

Guardado en un archivo y ejecutado como

perl -ap file.pl

EDITAR: Otra respuesta, más pequeña (19 + 2) pero básicamente copiada de la respuesta dev-null:

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

F #, 25 bytes

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

Esta es una función que toma una matriz / lista / secuencia de enteros y devuelve el resultado requerido.

Cómo funciona:

Seq.foldle permite aplicar una función a cada elemento de una secuencia mientras lleva algún estado mientras lo hace. El resultado de la función aplicada al primer elemento dará el estado que se colocará en la función para el segundo elemento, y así sucesivamente. Por ejemplo, para resumir la lista [1; 3; 4; 10], la escribiría así:

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

Que se aplicaría así:

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

Con el último estado siendo el valor de retorno de Seq.fold.

Roujo
fuente
2

𝔼𝕊𝕄𝕚𝕟, 5 caracteres / 7 bytes

ï⒭+‡_

Try it here (Firefox only).

Utiliza una codificación personalizada con caracteres de 10 bits (thx @Dennis!). Ejecute encode('ï⒭+‡_')en la consola JS para obtener un formulario codificado y decode(/*ENCODED TEXT HERE*/)decodificar el formulario codificado.

Explicación

Se traduce a Javascript ES6 como:

i=>i.reduce(($,_)=>$+--_)
Mama Fun Roll
fuente
Interesante codificación.
lirtosiast
Funciona bastante bien también.
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

Pruébalo en línea!

pppery
fuente
"El 90% de todas las instrucciones implican tomar la línea del distrito". Es porque el Distrito es donde están todas las estaciones aritméticas. Sin embargo, en TIO, no parece funcionar para ninguno de los ejemplos .
NieDzejkob
1873 bytes utilizando nombres de línea más cortos cuando sea posible
NieDzejkob
El intérprete de TIO tiene un error y no implementa Turnham Green
pppery
Buena atrapada. He enviado un RP que lo soluciona en sentido ascendente.
NieDzejkob
1

Python 3, 79 bytes

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)
Pål GD
fuente
Parece que estás contando una nueva línea como dos bytes. Quizás reemplazarlo con un punto y coma para guardar un byte. También se pueden eliminar algunos espacios.
Daffy
1

Rubí, 30 bytes.

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

Suficientemente simple: a partir de 1, sume los números proporcionados, cada -1 (los argumentos de la línea de comando están incluidos $*). Vergüenza injectes una palabra tan larga.

Chowlett
fuente
1

PowerShell, 19 bytes

$args-join'-1+'|iex

Tenga en cuenta que 1 + p1-1 + p2-1 + ... + pn-1es equivalente a p1-1 + p2-1 + ... + pn.

Toma datos como argumentos de línea de comandos separados con $args. Nosotros, -joinjunto con un -1+delimitador para crear una cadena, como 2-1+3-1+4. La cadena se canaliza a Invoke-Expression(similar a eval) y genera el resultado.

AdmBorkBork
fuente
1

Perl, 21 + 2 = 23 bytes

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

Requiere -ay -E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7
andlrc
fuente
Puede usar el -aindicador para obtener @Fvariables con elementos ya divididos y reemplazar -n con -p para que no lo necesite say, reduciéndolo a 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne
Usar en -plugar de sayes lo mismo porque necesito usar de $_=todos modos.
andlrc
¡@ChatterOne -aes una buena idea!
andlrc
1

Brainfuck, 15 bytes

Suposición: El operador devuelve 0 una vez que toda la entrada se ha agotado y no hay cables de extensión con enchufes 0. Además, el IO debe estar en valores de bytes en lugar de códigos de caracteres ASCII.

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

Explicación: Esto utiliza 2 registros. Un registro de acumulador de "Valor", que representa el número de dispositivos que se pueden enchufar, y un registro de "cable actual" que realiza un seguimiento del valor del cable actual. Comienza incrementando el valor en 1, para la salida existente. Luego, para cada cable de extensión, resta uno del valor ya que se está tomando un enchufe, luego incrementa el valor por el número de enchufes.

La mayoría de los intérpretes en línea no funcionan en modo de entrada de bytes sin procesar. Para probarlo en línea, use este código:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.
Ethan
fuente
¿Puedo probar el programa en alguna parte?
Pål GD
Gracias, corrigió esos errores. No conozco ningún intérprete en línea que funcione en modo byte. Puedo lanzar una implementación que resta '0' de las entradas que se ejecutarán en cualquier intérprete en línea.
Ethan
Si desea probar el código, ejecútelo aquí: copy.sh/brainfuck No coloque espacios entre los valores numéricos. Desafortunadamente, dado que funciona en modo ASCII, el código de demostración solo funcionará en valores de un solo dígito. Sin embargo, la versión de 15 bytes funcionará correctamente en un valor <= 255. Después de ejecutarlo, vea el volcado de memoria para ver el valor final.
Ethan
Un día, BF tendrá los estándares adecuados para la E / S esperada y solo podremos decir 'usando el estándar 3' en lugar de, por ejemplo, 'la entrada y la salida están terminadas en asciii por null char'.
Pharap