Parallelogramma un numero


18

Ora che sappiamo come quadrare e triangolare correttamente un numero, impareremo a parallelizzare uno. Per parallelogramma un numero, prima lo disponiamo come un parallelogramma impilandolo su se stesso un numero di volte uguale al numero di cifre che ha e aggiungendo spazi per renderlo un parallelogramma. Quindi 123formerebbe:

   123
  123
 123

Ora prendiamo ogni numero orizzontale e verticale e li aggiungiamo 123+123+123+1+12+123+23+3, che è uguale 531, che è il parallelogramma di 123.

Il tuo compito:

Scrivi un programma o una funzione che, quando viene dato un numero come input, restituisce il parallelogramma del numero.

Ingresso:

Un numero intero non negativo o un numero intero non negativo rappresentato da una stringa.

Produzione:

Il parallelogramma dell'intero.

Casi test:

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

punteggio:

Questo è , il punteggio più basso in byte vince!



Perché il downvote?
Gryphon - Ripristina Monica il

Risposte:


9

MATL , 12 byte

tnEXyPY+c!Us

L'input è una stringa. Provalo online!

Spiegazione

Considera l'input '123'come esempio.

Il codice duplica l'input ( t) e crea una matrice identità ( Xy) di dimensioni doppie rispetto alla lunghezza dell'input ( 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

quindi lo capovolge ( 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

La stringa di input, interpretata come codici ASCII delle cifre, equivale al vettore di riga numerico

49 50 51

Convoluzione bidimensionale a grandezza naturale ( Y+) del vettore e della matrice sopra indicati

 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

L'interpretazione di questi numeri come codici ASCII ( c) restituisce la seguente matrice di caratteri, con char 0 rappresentato come spazio:

     123
    123 
   123  
  123   
 123    
123

Transposition ( !) trasforma questo in

     1
    12
   123
  123 
 123  
123   
23    
3     

L'interpretazione di ogni riga come un numero ( U) fornisce il vettore della colonna numerica

  1
 12
123
123
123
123
 23
  3

e sommarlo ( s) dà il risultato finale, 531.


1
Sento odore ... convoluzione
Adnan,

1
@Adnan Cos'altro? MrGreen
Luis Mendo l'

6

Retina , 22 byte

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

Provalo online! Il link include casi di test. Spiegazione: Il primo stadio divide il numero di input per ogni cifra e include tutti i prefissi esclusivi e i suffissi inclusivi, fornendo i numeri verticali, oltre al numero di input originale ripetuto per ogni cifra, fornendo i numeri orizzontali. Le fasi rimanenti quindi sommano semplicemente i numeri risultanti.


6

05AB1E ,  12 11  8 byte

Sono sicuro che si può giocare a golf ulteriormente - suggerimenti benvenuti!

-1 byte grazie a Erik the Outgolfer (evita gli involucri ma usando una concatenazione)
e poi ...
-3 più byte grazie ad Adnan (evita la moltiplicazione per lunghezza-1 vettorializzando l'addizione e sottraendo l'input alla fine)

.s¹η++Oα

Provalo online!

Come?

.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

È possibile utilizzare «per concatenare i suffissi e i prefissi:g<*¹.s¹η«O+
Erik the Outgolfer

1
.s¹η++Oαdovrebbe funzionare per 8 byte
Adnan il

Grazie @EriktheOutgolfer i due involucri mi sono sembrati strani!
Jonathan Allan,

@Adnan - è piuttosto dolce!
Jonathan Allan,

@JonathanAllan "suggerimenti benvenuti!" non sono sicuro se ne avrai più ...
Erik the Outgolfer

5

Haskell , 90 78 76 71 64 63 59 57 57 byte

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

Provalo 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]è ancora un pelo più corto.
Lynn,

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

4

Buccia , 13 12 byte

ṁit§+SRL§+ḣṫ

Provalo online!

Spiegazione

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

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

Per l'ingresso 12345:

Riassume le sezioni dell'input 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, utilizzando l'indicizzazione delle stringhe per indicizzare (r) = 1,2,3,4 prima di eseguire il casting in numero intero e aggiunge 12345 * 2

Ringraziamenti speciali a:

-14 byte @Jonathan Allen

-1 Byte @ovs

Provalo online!


TIO si collega a un codice errato. (len(n)+1)può essere golfato su -~len(n)( ~xis -1-x), e quindi può salvare un altro byte usando -i(n)*~len(n). Quindi puoi rendere tutto una funzione anonima: lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)(74 byte)
Jonathan Allan il

Ancora meglio rendere quella funzione ricorsiva per 71 byte: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 il


Ho corretto il tuo link tio.
Mr. Xcoder,

3

Japt , 15 11 byte

-4 byte grazie a @Shaggy.

¬£iYç
cUz)x

Accetta input come stringhe.

Provalo online!

Spiegazione

£

Dividi l'array di input in digit ( ¬) e mappa per ( £) la seguente funzione, dove Y è l'indice.
["1", "2", "3"]

iYç

Il valore di input (implicito) con Yspazi ( ç) inseriti ( i) all'inizio. Questo è assegnato a U.
["123", " 123", " 123"]

cUz1)x

Concatena quello con se stesso ruotato di 90 ° a destra ( 1tempo). Quindi somma ( x).
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531.


Esattamente come stavo provando a farlo, ma non sono riuscito ad arrivarci, per qualche ragione - ben fatto :) Ecco una versione da 13 byte .
Shaggy,


@Shaggy Fantastico, sapevo che doveva esserci un modo più breve per anteporre gli spazi a ciascuna linea. Grazie!
Justin Mariner,

3

Japt , 31 18 byte

-13 byte grazie a @ETHproductions

Questo approccio non funziona bene usando Japt. La soluzione di Justin è molto meglio.

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

Spiegazione:

[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

Provalo online!


3
Ecco fatto, sto aggiungendo una scorciatoia per Ul : P
ETHproductions

Hmm ... non hai bisogno di nessuna delle Us nelle funzioni, e l'elemento intermedio nell'array può essere condensato Uå+ x, che penso ti porti a 23 byte.
ETHproductions

@ETHproductions Grazie! Ho ottenuto un altro byte riordinando gli elementi dell'array.
Oliver,

Puoi cambiare mx xin xx? :-)
ETHproductions

@ETHproductions Posso sicuramente, grazie ancora :)
Oliver

2

rubino , 61 55 + 1 = 56 byte

Usa la -nbandiera. Ingresso da STDIN.

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

Provalo online!


Per l'input, 102033il programma stampa 728714mentre è il valore corretto 729702.

NOOOO! SEI MALATTIA DICHIARAZIONI OTTALI! (risolto 02033problema , era il problema)
Value Ink

Supponevo che i numeri ottali fossero il problema, ma non ero sicuro (tra l'altro non conosco il rubino). Grazie per il chiarimento :)

@ThePirateBay nessun problema; Stavo già lavorando su una soluzione alternativa più corta che richiedeva input di stringa e anche con le correzioni necessarie ho effettivamente finito per salvare byte comunque :)
Value Ink

2

JavaScript, 77 74 byte

Risparmiato 3 byte grazie a 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

Pyth , 20 19 byte

Il mio attuale approccio prefisso (speriamo che golf ulteriormente).

+*tlQsQssM+_M.__Q._

Test Suite o prova un approccio alternativo con lo stesso numero di byte .

Spiegazione

+*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.

Per capire meglio il concetto, faremo un esempio, diciamo "123".

  • Prima otteniamo i prefissi dell'input. Quelli sono['1', '12', '123'] .

  • Quindi, otteniamo i prefissi dell'input inverso, ovvero: ['3', '32', '321'] e invertiamo ciascuno, quindi otteniamo ['3', '23', '123'].

  • Concateniamo le due liste e convertiamo ogni elemento in un numero intero, quindi otteniamo [3, 23, 123, 1, 12, 123] .

  • Sommando l'elenco, il risultato è 285 .

  • Il prodotto Pè la lunghezza dell'input - 1 (ovvero 2) moltiplicato per la sua rappresentazione intera ( 2 * 123 = 246).

  • Alla fine, sommiamo i due risultati 285 + 246:, quindi otteniamo 531, che è il risultato corretto.


Pyth , 20 byte

+*hlQsQsm+s>Qds<QdtU

Test Suite.

Spiegazione

Spiegazione a venire dopo ulteriore golf. Per ora non sono riuscito a giocare a golf ulteriormente (ho idee però).

+*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 byte

Soluzione:

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

Esempi:

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

Spiegazione:

{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 byte

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,+))}

Non può essere testato online, perché è lento e scade. Puoi provarlo nei Swift Playgrounds se desideri provarlo.

Esecuzione del campione

Ingresso:

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

Produzione:

531
417
10288049

1

Gelatina , 12 byte

LḶṚ⁶ẋ;€µ;ZVS

Provalo online!

Accetta l'input come stringa. Crea il "parallelogramma" come una matrice di caratteri, quindi valuta ogni riga e colonna per ottenere i numeri da sommare.

Spiegazione

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 byte (78 + -lmflag del compilatore)

Ciao! Questa è la mia prima presentazione, spero di non aver infranto nessuna regola.

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

Provalo online!

Ungolfed, senza avvisi:

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

Mi sembra valido :)
Okx,

Hmm, -lmper le funzioni matematiche è necessario solo per alcuni runtime C come ad es glibc. Compilare ad esempio con MinGW (usando Microsoft msvcrt.dll), non sarebbe necessario. Quindi non sei sicuro di dover aggiungere qui? Ad ogni modo, se lo aggiungi, farebbe 3 byte;)
Felix Palmen

Sfortunatamente, -lmè necessario per la pow()funzione con gcc. Ho provato a lavorare senza di essa ma non sono riuscito a trovare una soluzione usando meno di 6 byte (pow + il flag del compilatore). Non sono riuscito a trovare le regole su come includere le bandiere nel Bytecount e so che ho fatto una falsa ipotesi sul -personaggio che non veniva considerato. Sto aggiungendo un +1 byte in questo momento.
scottinet,

-lmnon è richiesto da gccma dal fatto che glibcnon include le funzioni matematiche nella libreria principale. msvcrt.dlllo fa, quindi compilando su Windows con gccopere senza il -lm. Questo è pignolo e non sono del tutto sicuro di cosa debbano dire le regole al riguardo.
Felix Palmen,

Grazie per il testa a testa :) Non riesco a provare la tua proposta e tio non sembra offrire questa possibilità, sfortunatamente
scottinet

1

Java 8, 147 137 126 116 114 byte

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 byte (137 → 126 e 116 → 114) grazie a @ OlivierGrégoire .

Spiegazione:

Provalo qui.

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 byte: 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;}. È una finestra scorrevole con min-max per ridurre il numero di chiamate al costosonew Integer(....substring(...))
Olivier Grégoire

1
@ OlivierGrégoire Grazie, e puoi anche accorciarne un po 'cambiando Math.max(0,i-l)in 0>i-l?0:i-le Math.min(i,l)in i>l?l:i. Modificandolo ora. Ah, vedo che hai modificato il tuo commento dopo aver copiato la risposta di 126 byte. ;)
Kevin Cruijssen il

Sì, mi dispiace per il montaggio, ma non l'ho verificato;)
Olivier Grégoire

1

R , 168 162 103 byte

-6 byte non usando c ()

-59 byte grazie 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}

Provalo online!

Accetta l'input come stringa.

Sono assolutamente certo che ci sono miglioramenti da apportare, principalmente per sfruttare i punti di forza di R ... ma in una sfida che è fondamentalmente manipolazione delle stringhe, faccio fatica a vedere come.

Modifica: molto meglio ora che non sto ripetendo una cattiva idea!



@Giuseppe Ah grazie! Quello era un sacco di spazio sprecato da quando stavo ancora usando un input intero. Mi piace il modo strtoi (substr ()) e il trucco (a | b) è molto più intelligente di me. Grazie per i miglioramenti! È quasi una risposta diversa a questo punto ...
CriminallyVulgar

Succede quando si aggiunge un altro approccio! Non sono riuscito a capire da solo i cicli, ma penso che potresti essere in grado di costruire gli indici persubstr esplicito anziché in loop, il che risparmierebbe alcuni byte.
Giuseppe,


0

Mathematica, 77 byte

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.