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!



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,.


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.


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

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!


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)


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!


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.


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


@ 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!


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!


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'));


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.

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


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

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

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;
}

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

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!



@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

Mathematica, 77 bytes

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
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.