Estamos acostumados ao termo "quadrado" n para significar o cálculo de n 2 . Também estamos acostumados ao termo "cubing" n para significar n 3 . Dito isto, por que não podemos também triangular um número?
Como triângulo um número?
Primeiro, vamos escolher um número
53716
.Posicione-o em um paralelogramo, cujo comprimento lateral seja igual ao número de dígitos do número e tenha dois lados posicionados na diagonal, conforme mostrado abaixo.
53716 53716 53716 53716 53716
Agora, nós queremos, certo? Para fazer isso, corte os lados que não se encaixam em um triângulo retângulo:
5 53 537 5371 53716
Pegue as somas de cada linha, para este exemplo, resultando em
[5, 8, 15, 16, 22]
:5 -> 5 53 -> 8 537 -> 15 5371 -> 16 53716 -> 22
Soma a lista
[5, 8, 15, 16, 22]
, resultando em66
. Este é o triângulo deste número!
Especificações e regras
A entrada será um número inteiro não negativo n ( n ≥ 0, n ∈ Z ).
Você pode receber e fornecer saída por qualquer meio permitido .
A entrada pode ser formatada como um número inteiro, uma representação em seqüência do número inteiro ou uma lista de dígitos.
Lacunas padrão não permitidas.
Isso é código-golfe , então o código mais curto em bytes vence!
Mais casos de teste
Entrada -> Saída 0 -> 0 1 -> 1 12 -> 4 123 -> 10 999 -> 54 100000 -> 6 654321 -> 91
Inspiração. As explicações são incentivadas!
fonte
645321 -> 91
?645321
vez de654321
.Respostas:
Haskell , 13 bytes
Experimente online!
Recebe a entrada como lista de dígitos. Calcula as somas acumuladas e depois as soma.
fonte
Husk ,
42 bytesObrigado @ H.PWiz por
-2
bytes!Experimente online!
"Ungolfed" / Explained
fonte
Flacidez cerebral ,
65, 50,36 bytesExperimente online!
Depois de muita revisão, agora estou muito orgulhoso dessa resposta. Eu gosto do algoritmo, e quão bem ele pode ser expresso no cérebro.
A maior parte da contagem de bytes vem do tratamento de 0 na entrada. De fato, se pudéssemos assumir que não havia zeros na entrada, seria uma resposta belamente curta de 20 bytes:
Experimente online!
Infelizmente, porém, o cérebro é notório pelo mau manuseio de casos extremos.
Explicação
Primeiro, uma observação minha:
Se a entrada tiver n dígitos, o primeiro dígito aparecerá no triângulo n vezes, o segundo dígito aparecerá n-1 vezes e assim por diante no último dígito, que aparecerá uma vez. Podemos tirar proveito disso, pois é realmente fácil calcular quantos dígitos de entrada restam no cérebro,
Então, aqui está como o código funciona.
fonte
Pitão -
64 bytesExperimente online aqui .
Bom 6 bytes que não usa o prefixo incorporado:
fonte
s.e*bhk_
MATL , 3 bytes
Experimente online!
Toma a entrada como uma lista de dígitos.
fonte
Gelatina , 3 bytes
Experimente online! Utiliza a mesma técnica da minha resposta em japonês: adição cumulativa e soma.
fonte
Haskell , 25 bytes
Recebe entrada como lista de dígitos
Experimente online!
Haskell , 41 bytes
Recebe entrada como representação de sequência
Experimente online!
fonte
Japonês ,
764 bytesExperimente online!
Explicação
Solução antiga:
Experimente online!
Explicação
fonte
Brain-Flak , 28 bytes
Experimente online!
14 bytes se não precisarmos suportar zeros (o que fazemos)
Experimente online!
DJMcMayhem tem uma resposta legal aqui, você deve conferir. Infelizmente para ele não estava disposto a deixá-lo vencer em seu próprio idioma: P
Como funciona?
Vamos começar com a versão simples.
A ação principal aqui é
({}<>{})<>
, que pega o topo da pilha esquerda e adiciona ao topo da pilha direita. Ao fazer o loop desta operação, somamos a pilha atual (até atingir zero) colocando a soma na pilha desativada. Isso é bastante mundano, a parte interessante é que resumimos os resultados de todas essas execuções como resultado. Isso calculará o valor desejado. Por quê? Bem, vamos dar uma olhada em um exemplo123
,. Na primeira tentativa, obtemos apenas 1, então nosso valor é 1Na próxima captura, retornamos 1 mais 2
Na última corrida, temos todos os três juntos
Você vê o triângulo? A soma de todas as execuções é o "triângulo" da lista.
Ok, mas agora precisamos trabalhar com zeros, aqui eu usei o mesmo truque do DJMcMayhem, além de alguns truques de pés. Em vez de fazer um loop até atingirmos um zero, fazemos um loop até que a pilha esteja vazia.
Eu então usei essa dica , escrita por ninguém menos que a sua, para jogar fora outros 2 bytes.
E aí temos que. Eu ficaria surpreso se houvesse uma solução mais curta, mas, novamente, coisas mais estranhas aconteceram.
fonte
Unfortunately for him I wasn't about to let him win at his own language :P
Não espero nada menos de você. : DJavaScript (ES6), 28 bytes
Recebe a entrada como uma lista de dígitos.
fonte
Python 3 , 37 bytes
Experimente online!
fonte
len
parasum
bem, embora eu não acredito que ajuda nada.sum([])
é 0, mas nada foi bastante se unindo ... pode haver uma maneira emboraC # (.NET Core) , 59 bytes
Experimente online!
Substancialmente diferente das outras respostas C #. Entrada é uma lista de dígitos. Todos os casos de teste incluídos no link do TIO.
Pode salvar um monte de bytes se for permitido receber a entrada como uma lista de dígitos para trás com 0 inicial.
fonte
number
, não é uma lista de dígitos?Python 3 , 35 bytes
Acabei de notar que, no final, isso é apenas um pouco da resposta da Business Cat !
Experimente online!
fonte
J , 7 bytes
Experimente online! Leva uma lista de dígitos, como
f 6 5 4 3 2 1
.Explicação
Um pouco mais fiel ao problema original seria
[:+/@,]/
"sum" (+/
) os,
prefixos achatados ( ) da entrada (]\
).fonte
Vim ,
605932 pressionamentos de teclaMuito obrigado ao @CowsQuack pela dica com a macro recursiva e o
h
truque, isso me salvou 27 bytes!Experimente online!
Ungolfed / Explained
Isso criará o triângulo como descrito (apenas para mantê-lo alinhado à esquerda):
O buffer está agora assim:
Junte todas as linhas em uma e construa uma expressão avaliável a partir dela:
o
"
registro agora contém a seguinte string (observe falta 0):Então, tudo o que precisamos fazer é acrescentar um zero e avaliá-lo:
fonte
&
(toda a partida) em vez de\1
no comando substitutoqqYp$xq:exe"norm".col('.')."@q"⏎
pode se tornarqqYp$xh@qq@q
. Essa macro recursiva encontrará um erro de quebra quando houver um caractere na linha, após o qual será interrompido.:s/./&+/g
. Também:%j⏎
pode se tornarV{J
. EDi
pode se tornarC
(eu já comentei sobre isso em outra resposta do Vim). Experimente online!Python 2 ,
4945 bytes-4 bytes graças ao Sr. Xcoder.
Experimente online!
Recebe a entrada como uma lista de dígitos.
fonte
Utilitários Bash + GNU,
3224Entrada lida de STDIN.
Atualização: Vejo que a entrada pode ser fornecida como uma lista de dígitos. Minha lista de entrada é delimitada por nova linha.
Experimente online .
Explicação
fonte
APL, 4 bytes
Isso leva a entrada como uma lista de dígitos, por exemplo:
Explicação
fonte
Táxi , 1478 bytes
Experimente online!
Sem golfe:
fonte
Perl 5 , 19 + 1 (
-p
) = 20 bytesExperimente online!
Quão?
$ \ mantém o total acumulado, $ p mantém o total de dígitos na linha atual. Cada linha do paralelogramo é simplesmente a linha anterior com o próximo dígito do número anexado. Portanto, é a soma da linha anterior mais o novo dígito. Isso itera sobre todos os dígitos, calculando as somas à medida que avançam. A substituição real é irrelevante; é apenas um meio de iterar sobre os dígitos sem criar um loop real. No final, $ \ é impresso implicitamente pela
-p
opção.fonte
Python 2 , 56 bytes
Experimente online!
fonte
Geléia ,
54 bytesUm link monádico que obtém uma lista de dígitos decimais e retorna o triângulo do número que a lista representa.
Experimente online!
Quão?
fonte
€
ainda funcionaria. Pity ...Retina , 13 bytes
Experimente online! O link inclui casos de teste. Explicação: O primeiro estágio gera todos os prefixos do número original, o segundo estágio converte cada dígito em unário e o terceiro estágio obtém o total.
fonte
Mathematica, 49 bytes
fonte
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim , 3 bytes
Explicação:
Experimente online!
Resposta alternativa:
Explicação:
Experimente online!
fonte
Java 8, 53 bytes
Eu implementei um lambda para cada tipo de entrada aceitável. Cada um deles percorre os dígitos do número, adicionando o múltiplo adequado de cada um a um acumulador.
Inteiro como entrada (53 bytes)
Lambda de
Integer
atéInteger
:Representação de string como entrada (72 bytes)
Lambda de
String
atéInteger
:Matriz de dígitos como entrada (54 bytes)
Lambda de
int[]
(de dígitos, maior valor do local primeiro) aInteger
:fonte
Pyt ,
96 bytesExplicação:
fonte
Python 3,
945854 bytesAgradeço ao Sr. Xcoder por me ajudar a economizar alguns bytes!
Experimente Online!
Recebe a entrada como uma sequência. Simplesmente multiplica cada dígito pelo número de vezes que precisa ser adicionado e retorna sua soma.
fonte
0
. Sep
sempre deve ser0
, você deve substituir op
porp=0
nalambda
declaração. No entanto, você pode simplesmente removerp
completamente para obter 54 bytesSNOBOL4 (CSNOBOL4) , 79 bytes
Experimente online!
Entrada de stdin, saída para stdout.
fonte
Lisp comum,
5352 bytesInsira como lista de dígitos.
Experimente online!
-1 byte graças a @ceilingcat.
fonte
apply
aplicados a listas muito longas por causa docall-arguments-limit
.