Paralelogramo um número

18

Agora que sabemos como fazer corretamente quadrado e triângulo um número, vamos aprender como paralelogramo um. Para paralelogramar um número, primeiro organizamos-o como um paralelogramo, empilhando-o em cima de si várias vezes igual ao número de dígitos que possui e adicionando espaços para torná-lo um paralelogramo. Então 123formaria:

   123
  123
 123

Agora pegamos cada número horizontal e vertical e os adicionamos 123+123+123+1+12+123+23+3, que é igual a 531, que é o paralelogramo de 123.

Sua tarefa:

Escreva um programa ou função que, ao receber um número como entrada, retorne o paralelogramo do número.

Entrada:

Um número inteiro não negativo ou um número inteiro não negativo representado por uma sequência.

Resultado:

O paralelogramo do número inteiro.

Casos de teste:

1234567 -> 10288049
123     -> 531
101     -> 417
12      -> 39

Pontuação:

Isso é , a menor pontuação em bytes ganha!

Gryphon - Restabelecer Monica
fonte
Sandbox Post
Gryphon - Reinstate Monica
Por que o voto negativo?
Gryphon - Restabelece Monica

Respostas:

9

MATL , 12 bytes

tnEXyPY+c!Us

Entrada é uma sequência. Experimente online!

Explicação

Considere a entrada '123'como um exemplo.

O código duplica a entrada ( t) e cria uma matriz de identidade ( Xy) de tamanho duas vezes o comprimento da entrada ( nE):

1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1

depois vira de cabeça para baixo ( P):

0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0

A sequência de entrada, interpretada como códigos ASCII dos dígitos, é equivalente ao vetor de linha numérica

49 50 51

A convolução bidimensional em tamanho real ( Y+) do vetor e da matriz acima fornece

 0  0  0  0  0 49 50 51
 0  0  0  0 49 50 51  0
 0  0  0 49 50 51  0  0
 0  0 49 50 51  0  0  0
 0 49 50 51  0  0  0  0
49 50 51  0  0  0  0  0

A interpretação desses números como códigos ASCII ( c) fornece a seguinte matriz de caracteres, com char 0 representado como espaço:

     123
    123 
   123  
  123   
 123    
123

Transposition ( !) transforma isso em

     1
    12
   123
  123 
 123  
123   
23    
3     

Interpretar cada linha como um número ( U) fornece o vetor da coluna numérica

  1
 12
123
123
123
123
 23
  3

e somar ( s) fornece o resultado final 531,.

Luis Mendo
fonte
1
Eu cheira ... convolução #
214 Adnan
1
@Adnan O que mais? :-D
Luis Mendo
6

Retina , 22 bytes

.
$`;$&$';$_;
\d+
$*
1

Experimente online! O link inclui casos de teste. Explicação: O primeiro estágio divide o número de entrada em cada dígito e inclui todos os prefixos exclusivos e sufixos inclusivos, fornecendo os números verticais, além do número de entrada original repetido para cada dígito, fornecendo os números horizontais. Os estágios restantes simplesmente somam os números resultantes.

Neil
fonte
6

05AB1E ,  12 11  8 bytes

I 'm certeza sabia que isso pode poderia ser golfed ainda - dicas bem-vindos!

-1 byte graças a Erik the Outgolfer (evite envoltórios, mas usando uma concatenação)
e depois ...
-3 mais bytes graças a Adnan (evite a multiplicação pelo comprimento-1 vetorizando a adição e subtraindo a entrada no final)

.s¹η++Oα

Experimente online!

Quão?

.s¹η++Oα - implicit input, say i      e.g.  123
.s       - suffixes                         [3,23,123]
  ¹      - push i                           123
   η     - prefixes                         [1,12,123]
    +    - addition of top two              [4,35,246]
     +   - addition (vectorises)            [127,158,369]
      O  - sum                              654
       α - absolute difference abs(123-654) 531
         - implicit print
Jonathan Allan
fonte
Você pode usar «para concatenar os sufixos e os prefixos:g<*¹.s¹η«O+
Erik the Outgolfer
1
.s¹η++Oαdeve trabalhar por 8 bytes
Adnan
Obrigado @EriktheOutgolfer os dois envoltórios me pareciam estranhos!
Jonathan Allan
@ Adnan - isso é muito doce!
Jonathan Allan
@JonathanAllan "dicas bem-vindas!" não tenho certeza se você vai obter qualquer mais ...
Erik o Outgolfer
5

Haskell , 90 78 76 71 64 63 59 57 bytes

g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]

Experimente online!

Assistente de Trigo
fonte
g x=sum[x+div x a+mod x a|(a,_)<-zip((10^)<$>[1..])$show x].
nimi
g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]é um cabelo mais curto ainda.
Lynn
g x=sum[x+x`div`10^a+x`mod`10^a|(a,_)<-zip[1..]$show x].
Laikoni
4

Casca , 13 12 bytes

ṁit§+SRL§+ḣṫ

Experimente online!

Explicação

              -- implicit input, say "123"
   §+         -- concatenate the results of the following two functions
     SR       --  ¹repeat the input n times, where n is the result of the next function
       L      --   length                                                  ["123","123"]
        §+   --  ²concatenate the results of the following two functions
          ḣ  --     prefixes                                              ["","1","12","123"]
           ṫ --     suffixes                                              ["123","23","3",""]
              -- inner concatenation                                      ["","1","13","123","123","23","3",""]
              -- outer concatenation                                      ["123","123","","1","13","123","123","23","3",""]
  t           -- all but the first element                                ["123","","1","13","123","123","23","3",""]
ṁ             -- map then sum
 i            --   convert to integer (where "" converts to 0)
H.PWiz
fonte
4

Neim , 7 bytes

𝐱S𝐗𝔻𝔻𝐬𝕤

Cuidado. Contém cobras:S𝐬𝕤

Experimente online!

Okx
fonte
1
" Cuidado. Contém cobras:S𝐬𝕤 " Lol ..𝐗𝔻
Kevin Cruijssen 10/08
4

Python 3 , 85 70 bytes

f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)+i(n)or i(n)*2

Para a entrada 12345:

Resume fatias da entrada 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, usando a indexação de sequência no índice (r) = 1,2,3,4 antes da conversão para o número inteiro e adiciona a 12345 * 2

Agradecimentos especiais para:

-14 Bytes @ Jonathan Allen

-1 Byte @ovs

Experimente online!

Conner Johnston
fonte
Links TIO para código errado. (len(n)+1)pode ser jogado para -~len(n)( ~xé -1-x) e, em seguida, isso pode salvar outro byte usando -i(n)*~len(n). Então você pode fazer tudo uma função anônima: lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)(74 bytes)
Jonathan Allan
Ainda melhor fazer essa função recursiva para 71 bytes:f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)or-i(n)*~len(n)
Jonathan Allan
Corrigi o seu link do tio.
Mr. Xcoder
3

Japonês , 15 11 bytes

-4 bytes graças a @Shaggy.

¬£iYç
cUz)x

Recebe entrada como strings.

Experimente online!

Explicação

£

Divida a matriz de entrada em dígitos ( ¬) e mapeie por ( £) a seguinte função, onde Y é o índice.
["1", "2", "3"]

iYç

O valor de entrada (implícito) com Yespaços ( ç) inseridos ( i) no início. Isso é atribuído a U.
["123", " 123", " 123"]

cUz1)x

Concatene que ele próprio girou 90 ° para a direita ( 1tempo). Então soma ( x).
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531.

Justin Mariner
fonte
Exatamente como eu estava tentando fazer isso, mas não consegui chegar lá, por algum motivo - muito bem :) Aqui está uma versão de 13 bytes .
Shaggy às
11 bytes
Shaggy
@ Shaggy Awesome, eu sabia que tinha que haver uma maneira mais curta de acrescentar os espaços para cada linha. Obrigado!
9787 Justin Mariner
3

Japonês , 31 18 bytes

-13 bytes graças a @ETHproductions

Essa abordagem não funciona bem usando o Japt. A solução de Justin é muito melhor.

[U*Ål U¬£tYÃUå+]xx

Explicação:

[U*Ål U¬£tYÃUå+]xx
[              ]    // Create a new array
 U*Ål               // Push: Input * Input.slice(1).length()
                    // Push:
      U¬            //   Input, split into chars
        £tY         //   Map; At each char: .substr(Index)
            Uå+     // Push: Cumulative reduce Input; with addition
                xx  // Sum all the items, twice

Experimente online!

Oliver
fonte
3
É isso, estou adicionando um atalho para Ul : P
ETHproductions
Hmm ... você não precisa de nenhum dos Us nas funções, e o item do meio da matriz pode ser condensado Uå+ x, o que eu acho que reduz os 23 bytes.
ETHproductions
@ETHproductions Obrigado! Eu peguei outro byte reorganizando os itens da matriz.
Oliver
Você pode mudar mx xpara xx? :-)
ETHproductions
@ETHproductions Eu com certeza posso, obrigado novamente :) #
Oliver Oliver
2

Ruby , 61 55 + 1 = 56 bytes

Usa a -nbandeira. Entrada de STDIN.

p (1..~/$/).sum{|i|[$_[i,~/$/],$_[0,i],$_].sum &:to_i}

Experimente online!

Value Ink
fonte
Para entrada, 102033seu programa imprime 728714enquanto o valor correto é 729702.
NOOOO! Amaldiçoar suas representações oficiais! (fixação BRB, 02033foi a questão)
Valor Ink
Eu supunha que os números octais são o problema, mas não tinha certeza (pelo que não conheço ruby). Obrigado por esclarecer :)
@ThePirateBay não há problema; Eu já estava trabalhando em uma solução mais curto, alternativo, que teve entradas de string, e mesmo com as correções necessárias eu realmente acabou salvando bytes de qualquer maneira :)
Valor Ink
2

JavaScript, 77 74 bytes

Economizou 3 bytes graças ao Value Ink

f=a=>[...a+a].map((_,b)=>a-=-z.substr((b-=n)>0?b:0,b+n),a*=n=(z=a).length)|a

console.log(f('123'));
console.log(f('101'));
console.log(f('12'));
console.log(f('1234567'));
console.log(f('102033'));


fonte
1

Pitão , 20 19 bytes

Minha abordagem atual do prefixo (espero que seja ainda mais).

+*tlQsQssM+_M.__Q._

Teste o Suite ou tente uma abordagem alternativa com a mesma contagem de bytes .

Explicação

+*tlQsQssM+_M.__Q._  - Full program that reads a String from STDIN, with implicit input.

  tlQ                - Length of the input - 1.
     sQ              - The input converted to an integer.
 *                   - Product of the above two elements. We will call this P.
                 ._  - Prefixes of the input.
          +          - Concatenated with:
           _M.__Q    - The prefixes of the reversed input, reversed.
        sM           - Convert each to an integer.
       s             - Sum.
+                    - Addition of the product P and the sum above.

Para entender melhor o conceito, vamos dar um exemplo, digamos "123".

  • Primeiro obtemos os prefixos da entrada. Aqueles são ['1', '12', '123'].

  • Então, obtemos os prefixos da entrada invertida, ou seja: ['3', '32', '321']e invertemos cada um, daí obtemos ['3', '23', '123'].

  • Concatenamos as duas listas e convertemos cada elemento em um número inteiro, para obtermos [3, 23, 123, 1, 12, 123].

  • Somando a lista, o resultado é 285.

  • O produto Pé o comprimento da entrada - 1 (ou seja 2) multiplicado pela representação inteira dele ( 2 * 123 = 246).

  • No final, somamos os dois resultados: 285 + 246portanto, obtemos 531qual é o resultado correto.


Pitão , 20 bytes

+*hlQsQsm+s>Qds<QdtU

Suíte de teste.

Explicação

Explicação a seguir após mais golfe. Por enquanto não consegui jogar golfe ainda mais (tenho idéias).

+*hlQsQsm+s>Qds<QdtUQ  - Full program. Reads from STDIN. Q means input, and is implicit at the end.

  hlQ                  - Length of the input + 1.
     sQ                - The input converted to an integer.
 *                     - Multiply the above. We'll call the result P.
        m         tUQ  - Map over [1...length of the input)
          s>Qd         - input[currentItem:] casted to an integer.
              s<Qd     - input[:currentItem] casted to an integer.
         +             - Sum the above.
       s               - Sum the list.
+                      - Add the sum of the list and P.
Mr. Xcoder
fonte
1

q / kdb +, 34 bytes

Solução:

{sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}

Exemplos:

q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"1234567"
10288049
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"123"    
531
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"101"    
417
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"12"     
39

Explicação:

{sum"J"$((c#c),c-til 2*c:count x)#\:x} / ungolfed
{                                    } / lambda function
                                    x  / implicit input
                                 #\:   / apply take (#) to each-left element with the right element
        (                       )      / the left element
                       c:count x       / count length and save in variable c
                     2*                / multiply by 2 (e.g. 6)
                 til                   / range, so 0 1 2 3 4 5
               c-                      / vector subtraction, so 3 2 1 0 -1 -2
         (   )                         / do this together
          c#c                          / 3 take 3, so 3 3 3
              ,                        / join, so 3 3 3 3 2 1 0 - 1 -2          
    "J"$                               / cast this "123", "123", "123" .. "23" to longs
 sum                                   / sum them up and return result
rua
fonte
1

Swift 3 , 213 bytes

func f(n:String){print((n.characters.count-1)*Int(n)!+(0..<n.characters.count).map{r in Int(n[n.index(n.startIndex,offsetBy:r)..<n.endIndex])!+Int(n[n.startIndex..<n.index(n.endIndex,offsetBy:-r)])!}.reduce(0,+))}

Não pode ser testado online, porque é lento e atinge o tempo limite. Você pode experimentá-lo no Swift Playgrounds se desejar testá-lo.

Amostra de execução

Entrada:

f (n: "123")
f (n: "101")
f (n: "1234567")

Resultado:

531
417
10288049
Mr. Xcoder
fonte
1

Gelatina , 12 bytes

LḶṚ⁶ẋ;€µ;ZVS

Experimente online!

Recebe a entrada como uma sequência. Cria o "paralelogramo" como uma matriz de caracteres e avalia cada linha e coluna para obter os números somados.

Explicação

LḶṚ⁶ẋ;€µ;ZVS  Input: string S
L             Length
 Ḷ            Lowered range - [0, 1, ..., len(S)-1]
  Ṛ           Reverse
   ⁶          The char ' ' (space)
    ẋ         Create that many characters of each in the range
     ;€       Prepend each to S
       µ      Begin a new monadic chain
        ;     Concatenate with
         Z    Transpose
          V   Eval each string
           S  Sum
milhas
fonte
1

C (gcc) ,95 8481 bytes (78 + -lmsinalizador do compilador)

Oi! Esta é a minha primeira submissão, espero não ter infringido nenhuma regra.

g,o,l;f(char*s){l=atoi(s);while(s[o++])g+=l/pow(10,o)+atoi(s+o);return g+l*o;}

Experimente online!

Sem Golfe, sem avisos:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int g,o,l;

int f(char *s){
  l = atoi(s);

  while(s[o++]) {
    g+=l/pow(10,o)+atoi(s+o);
  }

  return g+l*o;
}

int main(void){
  printf("%d\n",f("1234567"));
  return 0;
}
escoteiro
fonte
Parece válido para mim :)
Okx
Hmm, -lmpara funções matemáticas é necessário apenas para alguns tempos de execução C, como por exemplo glibc. Compilar, por exemplo, com MinGW (usando Microsoft msvcrt.dll), não seria necessário. Não tem certeza se é necessário adicionar aqui? De qualquer forma, se você adicioná-lo, faria 3 bytes;)
Felix Palmen
Infelizmente, -lmé necessário para a pow()função com o gcc. Tentei trabalhar sem ele, mas não consegui encontrar uma solução usando menos de 6 bytes (pow + o sinalizador do compilador). Não consegui encontrar regras sobre como incluir sinalizadores no número de bytes, e sei que fiz uma suposição falsa sobre o -personagem não estar sendo contado. Estou adicionando um byte de +1 no momento.
Scottinet
-lmnão é necessário, gccmas pelo fato de glibcnão incluir as funções matemáticas na biblioteca principal. msvcrt.dllassim, compilando em janelas com gccobras sem o -lm. Isso é óbvio e não tenho muita certeza do que as regras sobre isso realmente têm a dizer.
Felix Palmen
Não graças a cabeça para cima :) Eu sou incapaz de tentar a sua proposta e tio não parecem oferecer essa possibilidade também, infelizmente
scottinet
1

Java 8, 147 137 126 116 116 114 bytes

n->{Integer l=(n+"").length(),r=n*l,i=0;for(;++i<l*2;)r+=l.valueOf((n+"").substring(i>l?i-l:0,i<l?i:l));return r;}

-13 bytes (137 → 126 e 116 → 114) graças a @ OlivierGrégoire .

Explicação:

Experimente aqui.

n->{                          // Method with integer as parameter and return-type
  Integer l=(n+"").length(),  //  Length of the input integer
      r=n*l,                  //  Result-integer (starting at `n*l`)
      i=0;                    //  Index-integer (starting at 0)
  for(;++i<l*2;               //  Loop from 0 through two times `l` (exclusive)
    r+=                       //   Add to the result-integer sum:
       l.valueOf((n+"").substring(
                              //    Substring of input, converted to integer:
        i>l?                  //     If `i` is larger than `l`:
         i-l                  //      Substring starting at `i-l`
        :                     //     Else:
         0,                   //      Substring starting at 0
        i<l?                  //     If `i` is smaller than `l`:
         i                    //      Substring ending at `i` (exclusive)
        :                     //     Else:
         l)                   //      Substring ending at `l` (exclusive)
  );                          //  End of loop
  return r;                   //  Return resulting sum
}                             // End of method
Kevin Cruijssen
fonte
1
114 bytes: n->{Integer l=(n+"").length(),s=n*l,i=0;for(;++i<l*2;)s+=l.valueOf((n+"").substring(l<i?i-l:0,i<l?i:l));return s;}. É uma janela deslizante com min-max para reduzir o número de chamadas para o caronew Integer(....substring(...))
Olivier Grégoire
1
@ OlivierGrégoire Obrigado, e pode até encurtar um pouco mais mudando Math.max(0,i-l)para 0>i-l?0:i-le Math.min(i,l)para i>l?l:i. Modificando-o agora. Ah, vejo que você editou seu comentário depois de copiar a resposta de 126 bytes. ;)
Kevin Cruijssen
Sim, desculpe pela edição, mas eu não tinha verificado isso;):
Olivier Grégoire
1

R , 168 162 103 bytes

-6 bytes por não usar c ()

-59 bytes graças a @Giuseppe

function(n){k=nchar(n)
a=k*strtoi(n)
for(i in 1:k)for(j in i:k)a=a+(i==1|j==k)*strtoi(substr(n,i,j))
a}

Experimente online!

Recebe a entrada como uma sequência.

Estou absolutamente certo de que há melhorias a serem feitas, principalmente para alavancar qualquer um dos pontos fortes de R ... mas em um desafio que é basicamente manipulação de cordas, estou lutando para ver como.

Edit: Muito melhor agora que não estou repetindo uma má idéia!

CriminallyVulgar
fonte
1
103 bytes
Giuseppe
@Giuseppe Ah thanks! Isso foi muito espaço desperdiçado desde quando eu ainda estava usando uma entrada inteira. Gosto da maneira strtoi (substr ()) e o truque (a | b) é muito mais inteligente do que eu. Obrigado pelas melhorias! É quase uma resposta diferente neste momento ...
CriminallyVulgar
Isso acontece quando você adiciona outra abordagem! Eu não conseguia descobrir os loops, mas acho que você pode construir os índices substrexplicitamente em vez de fazer loop, o que economizaria alguns bytes.
21417 Giuseppe
0

Perl 5 , 53 + 1 (-n) = 54 bytes

$r=$_*(@n=/./g);for$i(@n){$r+=$_+($t=(chop).$t)}say$r

Experimente online!

Xcali
fonte
0

Mathematica, 77 bytes

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
J42161217
fonte