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.