Tomada


23

Este é um problema do NCPC 2005 . Roy tem um apartamento com apenas uma única tomada elétrica, mas ele tem várias tomadas de força. Calcule o número máximo de tomadas que ele pode ter usando as réguas de energia que possui. O número de tomadas por filtro de linha é fornecido como entrada.

Acontece que se o número de saídas das tiras, respectivamente, for

p1,p2,...,pn

então o número de pontos de venda é ,

1-n+EupEu

ou

1+p1-1+p2-1++pn-1
.

A entrada para o programa ou função é uma série não vazia de números inteiros positivos.

Exemplos

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

17
E eu pensei que você não deveria réguas de energia cadeia ...
Joey

Tanto quanto eu posso dizer, minha resposta da Retina é a única resposta usando dados unários. Você pode dar uma olhada na discussão dos comentários: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Se você acha que a solução unária é um hack demais, isso não faz parte do espírito de o desafio, fico feliz que você especifique que a entrada deve ser decimal (e corrigirá minha resposta de acordo).
Martin Ender

7
Porque a eletricidade é tão caro, o código deve ser tão curto quanto possível, evitar o uso de mais energia
gato

1
@cat Hora de desenterrar a velha máquina de turing e computadores mecânicos acionados por hamster.
Pharap

1
@immibis com certeza, mas a saída seria tratada como a informação contida no fluxo de bytes, não como o que acontece com a renderização do seu terminal.
Martin Ender

Respostas:



29

Retina , 3 bytes

 1

O avanço de linha à direita é significativo.

Entrada é uma lista separada por espaços de números unários .

Experimente online!

Explicação

O código simplesmente remove todos os espaços, bem como o 1depois deles, da string. Aqui está o porquê disso funcionar:

A adição em unário é simples: basta concatenar os números, o mesmo que remover os delimitadores. Decrementar por 1 também é simples: basta remover a 1de cada número. Porém, queremos 1 a mais do que a soma das entradas decrementadas, portanto, apenas removemos os 1s que encontramos após os espaços, diminuindo assim tudo, exceto a primeira entrada.


1
Gostaria de saber se a entrada em unário deve ser permitida.
John Dvorak

@JanDvorak é por padrão, a menos que o desafio especifique explicitamente a entrada decimal. (Veja o link na resposta.) Não importa, porém, Jelly está ganhando de qualquer maneira.
Martin Ender

@ MartinBüttner Existem dados de amostra nesta pergunta e na atribuição original. Você não acha (salvo indicação em contrário) que deveria ser um critério necessário (embora não suficiente) para a aprovação, que o código funcione com os dados de amostra literal?
Nitro2k01

1
@ nitro2k01 Não (nesse caso, a maioria das respostas provavelmente seria inválida). A menos que o desafio especifique explicitamente um formato de entrada específico , normalmente assumimos que as listas podem ser obtidas em qualquer formato de lista nativo . O mesmo vale para os formatos numéricos (pelo menos unários e usando números inteiros, pois os valores de bytes são permitidos por consenso, a menos que o desafio os proíba). É praticamente impossível incluir dados de amostra em todos os formatos de entrada nativos possíveis no desafio.
Martin Ender

@ MartinBüttner Imo, esse não é o problema que a recomendação está abordando. O que ainda fala contra isso é que (a menos que eu esteja enganado) isso não funciona porque unary é um formato de número nativo ou suportado no Retina, mas funciona quando você processa a string como dados da string. É um truque. É até um truque inteligente, mas ainda não estou convencido de que esteja de acordo com as regras. Se os números unários separados por espaço fossem um formato nativo no Retina da mesma maneira que uma lista de bytes é um formato nativo no bf, eu concordaria que a recomendação se aplica e eu teria uma opinião diferente.
Nitro2k01

9

Hexagonia , 18 14 bytes

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

Desdobrado:

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

Experimente online!

Não acho que o comprimento do lado 2 seja possível, mas deve haver uma solução mais eficiente do lado do comprimento 3 do que isso.

Essa é a abordagem usual "decrementar tudo, somar, incrementar", mas terei que adicionar diagramas mais tarde para mostrar como exatamente funciona no Hexagony.


7

Python, 24 bytes

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

Experimente online


1
Isso pressupõe que a função seja atribuída primeiro e depois aplicada à entrada de outra variável.
juandesant

1
@juandesant ... o que está perfeitamente bem. É uma função literal, que é uma forma válida de envio.
FlipTack


7

Haskell, 17 15 bytes

foldl1$(+).pred

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

Versão antiga, abordagem diferente, 17 bytes: succ.sum.map pred.


6

J, 6 bytes

+/+1-#

Soma mais um comprimento negativo. Entre parênteses e aplique-o, da seguinte maneira:

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

6

Labirinto , 9 bytes

"?;)!@
+(

Experimente online!

A cartilha usual:

  • O labirinto é 2D e baseado em pilha. As pilhas têm um número infinito de zeros na parte inferior.
  • Quando o ponteiro de instrução atinge uma junção, ele verifica o topo da pilha para determinar para onde virar a seguir. Negativo é deixado, zero é para frente e positivo é direito.

Aqui começamos no canto superior esquerdo ", no-op, indo para a direita. A seguir ?, leia um int de STDIN (jogando fora caracteres que ele não pode analisar como um número inteiro, por exemplo, espaços). Agora temos dois casos:

Se a entrada for positiva, viramos à direita, executando:

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

Se a entrada for zero (o que ocorre no EOF), seguimos em frente, executando:

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

5

Pitão, 5 bytes

hstMQ

incremento (soma (mapa (decremento, entrada))))


5

ES6, 25 bytes

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

4
Eu ia postar: "Um dos raros casos em que reduzir vence o jogo" ... e são 25 também l=>l.reduce((a,b)=>a+b-1).
Edc65

@ edc65 Sim, (,b)é caro, mas eu também gosto dessa versão.
Neil


4

05AB1E , 4 bytes

Código:

E<O>

Explicação:

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

Recebe entrada como uma matriz (por exemplo [3, 4, 5]).


Muito elegante para um golfe lang
Pharap

4

Estrelado , 26 24 bytes

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

Espera números inteiros separados por nova linha. Experimente online!

Obrigado 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

O loop é desenrolado para que o primeiro número não seja diminuído, negando a necessidade de incrementar. Empurrar números é caro em Starry ...


Eu conto apenas 20 bytes.
Addison Crump #

1
@VoteToClose Você contou os espaços à esquerda? (Eu estou supondo que você está falando sobre o 26 byte)
SP3000

4

Utilitários Bash + GNU, 16

Se houver Nréguas de energia, deve haver N-1separadores na lista de entradas separadas por vírgula. Tudo o que precisamos fazer é substituir os separadores - 1 +e avaliar aritmeticamente:

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

Ou usando o mesmo truque:

Pure Bash (sem utilitários externos), 19

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

3

APL (NARS 2000), 13 10 bytes

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

Editar: até 10 com a abordagem (melhor) de Lynn.

{1++/1-⍨⍵}


3

gs2, 5 bytes

(Codificado em CP437.)

W&Φd'

É isso read-nums dec m1 sum inc.


3

CJam, 7 bytes

q~:(:+)

Teste aqui.

Mesma abordagem que a de Lynn (decrementa tudo, soma, incremento). Isso também funciona para 8 bytes (e talvez seja um pouco mais interessante):

q~{(+}*

Isso dobra "decremento, adicione" sobre a lista. Ao fazer isso, o decréscimo é aplicado apenas a todos os elementos, exceto o primeiro, de modo que não precisamos cuidar do incremento separadamente.


3

C, 60 59 55 bytes

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


3

Sério, 7 bytes

,;l@Σ-u

Experimente online!

Explicação:

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

2

Perl 6 , 20 bytes

put 1+sum --«@*ARGS

(Você pode usar em <<vez de «)

Uso:

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

«É um operador Perl?
user253751

@immibis Na verdade, faz parte de vários operadores Perl 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Vários deles são conhecidos como operadores Meta, na medida em que combinam com outros operadores. (Perl 5 não tem os operadores atualmente.)
Brad Gilbert b2gills

2

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

Requer -apsinalizadores:

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

Salvo em um arquivo e executado como

perl -ap file.pl

EDIT: Outra resposta, menor (19 + 2), mas basicamente copiada da resposta dev-null:

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

2

F #, 25 bytes

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

Esta é uma função que recebe uma matriz / lista / sequência de números inteiros e retorna o resultado necessário.

Como funciona:

Seq.foldpermite que você aplique uma função a todos os elementos de uma sequência enquanto carrega algum estado enquanto o faz. O resultado da função aplicada ao primeiro elemento fornecerá o estado que será colocado na função para o segundo elemento e assim por diante. Por exemplo, para resumir a lista [1; 3; 4; 10], escreva-a assim:

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

O que seria aplicado assim:

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

Com o último estado sendo o valor de retorno de Seq.fold.


2

, 5 caracteres / 7 bytes

ï⒭+‡_

Try it here (Firefox only).

Usa uma codificação personalizada com caracteres de 10 bits (thx @Dennis!). Execute encode('ï⒭+‡_')no console JS para obter o formulário codificado e decode(/*ENCODED TEXT HERE*/)decodificar o formulário codificado.

Explicação

Traduz para Javascript ES6 como:

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

Codificação interessante.
precisa saber é o seguinte

Também funciona muito bem.
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

Experimente online!


"90% de todas as instruções envolvem a adoção da linha do distrito". É porque District é onde estão todas as estações aritméticas. No entanto, no TIO, ele não parece funcionar para nenhum dos exemplos .
NieDzejkob 9/0318

1873 bytes por usar nomes de linha mais curtos, sempre que possível
NieDzejkob

O intérprete de TIO tem um bug e não implementa Turnham Green
pppery

Boa pegada. Enviei um PR que o corrige a montante.
NieDzejkob 29/07

1

Python 3, 79 bytes

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

Parece que você está contando uma nova linha como dois bytes. Talvez substitua-o por um ponto-e-vírgula para salvar um byte. Alguns espaços também podem ser removidos.
Daffy #

1

Ruby, 30 bytes

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

Simples o suficiente - a partir de 1, some os números fornecidos, cada -1 (os argumentos da linha de comando estão dentro $*). Vergonha injecté uma palavra tão longa.


1

PowerShell, 19 bytes

$args-join'-1+'|iex

Note que 1 + p1-1 + p2-1 + ... + pn-1é equivalente a p1-1 + p2-1 + ... + pn.

Recebe entrada como argumentos separados da linha de comando com $args. Nós, -joinjunto com um -1+delimitador, criamos uma string, como 2-1+3-1+4. A sequência é então canalizada para Invoke-Expression(semelhante a eval) e gera o resultado.


1

Perl, 21 + 2 = 23 bytes

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

Requer -ae -E:

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

Você pode usar a -abandeira para obter @Fvariável com elementos já divididos, e substituir -n com -p para que dont'need say, reduzindo-a a 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne

Usar em -pvez de sayé o mesmo, porque eu preciso usá-lo de $_=qualquer maneira.
andlrc

@ChatterOne -aé uma boa ideia!
andlrc

1

Brainfuck, 15 bytes

Suposição: O operador, retorna 0 quando todas as entradas estiverem esgotadas e não há cabos de extensão com 0 plugues. Além disso, o IO precisa estar em valores de bytes, em vez de códigos de caracteres ASCII.

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

Explicação: Utiliza 2 registros. Um registro acumulador "Value", representando o número de dispositivos que podem ser conectados, e um registro "cord atual" que rastreia o valor do cabo atual. Ele começa incrementando o valor em 1 para a tomada existente. Em seguida, para cada cabo de extensão, subtrai um do valor desde que um plugue está sendo retirado e depois incrementa o valor pelo número de plugues.

A maioria dos intérpretes online não opera no modo de entrada de bytes brutos. Para testá-lo online, use este código:

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

Posso testar o programa em algum lugar?
Gål GD

Obrigado, corrigimos esses erros. Não conheço intérpretes online que operem no modo byte. Posso reunir uma implementação que subtrai '0' das entradas que serão executadas em qualquer intérprete online.
Ethan

Se você quiser testar o código, execute-o aqui: copy.sh/brainfuck Não coloque espaços entre os valores numéricos. Infelizmente, como está operando no modo ASCII, o código de demonstração funcionará apenas em valores de um dígito. No entanto, a versão de 15 bytes funcionará corretamente em um valor <= 255. Após a execução, exiba o despejo de memória para exibir o valor final.
Ethan

Um dia o BF terá padrões adequados para o IO esperado e apenas poderemos dizer 'usando o padrão 3' em vez de, por exemplo, 'entrada e saída são todos asciii terminados por nulo char'.
Pharap
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.