Il numero finale


15

Sfida

inserisci qui la descrizione dell'immagine

Scrivi un programma che accetta una matrice di 4 numeri interi ( che rappresenta una sequenza di numeri generati da un certo algoritmo ) e restituisce il numero intero successivo che seguirà.

Useremo solo algoritmi di addizione, sottrazione, moltiplicazione e divisione con una variazione costante (cioè non variabile).

Per la divisione useremo i floorvalori interi: 133/4 = 33e33/4 = 8

Puoi presumere che ci sarà sempre un singolo valore di ritorno valido

Casi test

[14,24,34,44] dovrebbe restituire 54 (algoritmo di aggiunta)

[105,45,-15,-75] dovrebbe restituire -135 (algoritmo di sottrazione)

[5,25,125,625] dovrebbe restituire 3125 (algoritmo moltiplicativo)

[256,64,16,4] dovrebbe restituire 1 (algoritmo di divisione)

Regole generali


2
Questa è una versione semplificata di Cosa viene dopo? e duplicato limite.
Peter Taylor,

7
In futuro, ti consiglio di pubblicare su Sandbox prima di andare in diretta in modo da poter ricevere in anticipo i commenti di altre persone.
Leaky Nun,

5
Dovresti davvero aggiungere alcuni casi di test per la divisione di numeri interi. Quasi tutte le risposte non danno il risultato corretto per [261,65,16,4], [4,2,1,0] o [2,1,0,0]
Damien,

5
Non sono d'accordo con i voti duplicati. Trovare l'algoritmo è più semplice nel senso che c'è una sola operazione da considerare, ma allo stesso tempo, è più difficile perché la divisione intera deve essere presa in considerazione. Non credo che il porting di una risposta dall'altra sfida sia sostanzialmente più semplice che scriverne una da zero.
Dennis,

3
Probabilmente dovresti specificare numeri interi non negativi, poiché quando una serie di divisioni è negativa ci sono due interpretazioni. Ad esempio -81/4è 21 r 3o -20 r -1.
Jonathan Allan,

Risposte:


6

05AB1E , 18 16 18 byte

D¥¬QPi`+s-ë`r/s\*î

Spiegazione

D                   # duplicate
 ¥                  # delta's
  ¬Q                # compare first delta to the other deltas
    P               # product (1 if all deltas are equal, otherwise 0)
     i              # if 1 (we're dealing with addition or subtraction)
      `+s-          # add the difference between the elements to the last element
          ë         # else (we're dealing with multiplication or division)
           `r/      # divide the 2nd element by the 1st
              s\*   # multiply with the 4th element
                 î  # round up

Provalo online!


L'output è sbagliato con [4,2,1,0] ...
Damien,

@Damien: grazie per avermelo fatto notare. L'ho risolto e mi ha anche salvato un paio di byte :)
Emigna il

Grande. Ora convalida tutti i miei casi di test.
Damien,

Prova il caso limite per dividere per quattro:[-325, -82, -21, -6]
Jonathan Allan il

... in realtà suppongo che la domanda dovrebbe essere solo per numeri interi non negativi o specificare quale convenzione deve essere utilizzata.
Jonathan Allan,

14

Javascript (ES6),  44   42  44 byte (fisso)

(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

Salvato 2 byte, seguendo i consigli di IsmaelMiguel.
Versione fissa per [2,1,0,0]e [1,0,0,0]come suggerito da edc65

Versione 30 byte

Per la cronaca, il mio primo tentativo è stato 32 30 byte ma mancava il supporto floor () per la divisione. Non riesce anche per casi speciali come [2,1,0,0]e [1,0,0,0].

(a,b,c,d)=>c-2*b+a?d*c/b:d+c-b

dimostrazione

var f =
(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

var test = [
  [ 14, 24, 34, 44 ],     // should return 54 (addition Algorithm)
  [ 105, 45, -15, -75 ],  // should return -135 (subtraction algorithm)
  [ 5, 25, 125, 625 ],    // should return 3125 (multiplicative algorithm)
  [ 256, 64, 16, 4 ],     // should return 1 (division algorithm)
  [ 260, 65, 16, 4 ],     // should return 1 (division algorithm with floor())
  [ 2, 1, 0, 0 ],         // should return 0 (special case of division algorithm)
  [ 1, 0, 0, 0 ]          // should return 0 (special case of division algorithm)
];

test.forEach(l => console.log('[' + l.join`, `+ '] => ' + f(...l)));


Wow, non sapevo che js avesse un pattern matching.
Leaky Nun,

@LeakyNun - L' incarico di destrutturazione è stato effettivamente introdotto in ES6. Nota che non puoi fare [a,b]=>per i parametri di funzione. Sono necessarie le parentesi.
Arnauld,

Bene, ma dovresti gestire la divisione intera: [260, 65, 16, 4] => 0.9846153846153847. Dovrebbe dare 1
Damien il

@Damien - Ah bene ... sapevo che qualcuno se ne sarebbe accorto. ;-) È risolto.
Arnauld,

Che dire di [2,1,0,0]? Dovrei dare 0. Penso che sia l'unico contro esempio per b*2==c+a<=> algoritmo di addizione / sottrazione
Damien

11

Brachylog , 37 33 27 byte

b:[E]cL,?:Iz{:+a|:*a|:/a}Lt

Provalo online! o verifica tutti i casi di test .

Salvato 10 byte grazie a @LeakyNun .

Spiegazione

Input = [A:B:C:D]

b:[E]cL,     L = [B:C:D:E]
?:Iz         Create the list [[B:I]:[C:I]:[D:I]:[E:I]]
{            Either…
    :+a          Sum all couples of that list
|            or…
    :*a          Multiply all couples of that list
|            or…
    :/a          Integer divide all couples of that list
}L          The result is L
t           Output is the last element of L

Come ha sottolineato LeakyNun, non abbiamo bisogno del caso di sottrazione perché Ipuò essere qualsiasi numero intero.


4
wow, brachylog (& prolog) sono fantastici
Maltysen,

2
Addizione e sottrazione sono uguali
Leaky Nun,

1
@LeakyNun Corretto, grazie!
Fatalizza il



6

Haskell, 65 byte

f l@[a,b,c,d]|[a,b..d]==l=d+b-a|z<-b+0^b=div(d*b)$a-mod(max b a)z

5

Python 2, 40 byte

lambda(a,b,c,d):[d+c-b,d*c/b][c-2*b+a>0]

È letteralmente la risposta JS trasferita in Python (grazie @LeakyNun!). Il mio approccio precedente era ridicolmente lungo, ma eccolo qui:

Python 2, 169 166 byte

Il secondo e il terzo livello sono una scheda non elaborata e una scheda non elaborata più uno spazio, rispettivamente, che gioca davvero male con Markdown, quindi le schede sono state sostituite da 2 spazi.

x=input()
q='%d%s%d'
for i in range(max(x)):
 for o in'+-*/':
  a=1
  for e,n in zip(x,x[1:]):
   try:1/(eval(q%(e,o,i))==n)
   except:a=0
  if a:print eval(q%(x[-1],o,i))

Abbastanza semplice; prova ogni costante e operatore che ritiene possa essere la costante, quindi se la combinazione costante / operatore funziona per ogni elemento nell'elenco (usando una try/ exceptcoppia per evitareZeroDivisionError s), stampa il risultato per l'ultimo elemento nell'elenco.

Sono sicuro che c'è un metodo migliore qui, questo è il metodo ingenuo.


Faresti meglio a trasferire la risposta js in Python
Leaky Nun il

Pause per le [1,0,0,0]quali dovrebbe uscire0
Jonathan Allan il

3

TSQL, 55 byte

Questo script sta provando ad aggiungere e sottrarre nello stesso controllo, quindi tenta di moltiplicarsi, se fallisce, deve essere una divisione.

DECLARE 
@1 INT=6561,
@2 INT=729,
@3 INT=81,
@  INT=9

PRINT IIF(@2-@1=@-@3,@*2-@3,IIF(@1*@2=@3,@*@1,sqrt(@)))

Violino


3

C #, 63 byte

int f(int[]x)=>2*x[1]-x[0]==x[2]?x[3]+x[1]-x[0]:x[3]*x[1]/x[0];

Verifica se la differenza tra il primo e il secondo elemento è uguale alla differenza tra il secondo e il terzo elemento. Se è così, fa addizione / sottrazione, altrimenti fa moltiplicazione / divisione.


2

JavaScript, 73 byte

(a,b,c,d)=>(x=b-a,c-b==x&&d-c==x)?d+x:(x=b/a,b*x|0==c&&c*x|0==d)?d*x|0:-1

Test :

console.log(s.apply(null,[14,24,34,44]), 54);
console.log(s.apply(null,[105,45,-15,-75]), -135);
console.log(s.apply(null,[5,25,125,625]), 3125);
console.log(s.apply(null,[256,64,16,4]), 1);

console.log(s.apply(null,[2,1,0,0]),0);
console.log(s.apply(null,[1,0,0,0]),0);
console.log(s.apply(null,[-325,-82,-21,-6]),-1);

console.log(s.apply(null,[-1,-1,-1,-1]),-1);
console.log(s.apply(null,[0,0,0,0]),0);

Funziona per tutti loro.


1
Non ero sicuro dell'etichetta qui. So che c'è già un'altra risposta JS, ma non affronta i casi limite. Il mio è più lungo, ma gestisce tutti quelli. Fammi sapere se non ho fatto bene.
Whothehellisthat

1
Non c'è niente di sbagliato nel pubblicare una risposta nella stessa lingua di un'altra risposta, specialmente se la tua risposta è corretta e l'altra no. Non so se hai abbastanza rappresentante per farlo, ma potresti anche voler commentare quella risposta per far loro sapere quali casi marginali mancano.
DJMcMayhem

In realtà ho preso i casi limite da quell'altro post, ma non hanno risolto il problema. ; P
Whothehellisthat

2

Lingua GameMaker, 70 byte

a=argument0;If a[3]+a[1]=a[2]*2return a[4]*2-a[3]return a[4]*a[4]/a[3]

2

R, 68 74

Matrice: 68 byte

function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]%/%(x[1]%/%x[2])

> (function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]*x[2]/x[1])(c(14,24,34,44))
[1] 54

4 ingressi: 45 byte

function(a,b,c,d)if(b-a==c-b)d+b-a else d*b/a

Soluzione di Bonus con log, exp,var , 71 byte

if(var(v<-diff(x<-scan(,1)))==0)x[4]+v[1]else x[4]*exp(diff(log(x)))[1]

aggiornamento: divisione intera


Questo non sta prendendo quattro variabili piuttosto che un array? Altrimenti puoi liberarti delle parentesi b-aper salvare un byte (e noto che le tue chiamate di esempio aggiungono spazi).
Jonathan Allan,

@JonathanAllan Hai ragione. Non richiede un array. Il conteggio dei byte è stato aggiornato. La parentesi è necessaria a causa di altro, ma possiamo salvare un byte aggiungendo invece uno spazio. Le chiamate non hanno bisogno di spazi aggiuntivi.
Vlo,

Sì, è per questo che ho detto che potresti risparmiare 1 byte anziché 2
Jonathan Allan il

Nota, attualmente non gestisce completamente il requisito di divisione intera, ad es. 261,65,16,4Restituisce 0.9961686piuttosto che 1(ovviamente ci dovrebbe essere un caso di prova per questo nella domanda).
Jonathan Allan,

1
Funzione @JonathanAllan (x) if (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] else x [4]% / % (x [1]% /% x [2])
Vlo

1

Java, 125 123 byte

golfed:

int m(int[]a){int r=(a[1]>a[0])?a[1]/a[0]:a[0]/a[1];return(a[0]-a[1]==a[1]-a[2])?a[3]-a[0]+a[1]:(a[0]<a[1])?a[3]*r:a[3]/r;}

Ungolfed:

int m(int[] a)
{
    int r = (a[1] > a[0]) ? a[1] / a[0] : a[0] / a[1];
    return (a[0] - a[1] == a[1] - a[2]) ? a[3] - a[0] + a[1] : (a[0] < a[1]) ? a[3] * r : a[3] / r;
}

Questo codice ha sicuramente alcuni problemi poiché non gestisce la divisione per zero e cose del genere. Inoltre, non funzionerà ovviamente se ci sono più (o meno) di 4 numeri interi nell'array di input a. Il che lo rende oltre stupido, ma mi sono divertito :)

Provalo: https://ideone.com/nELH5I


1

TI-Basic, 37 byte

Funziona su qualsiasi calcolatrice TI-83/84

Input L1                     gets input into an array
L1(4)²/L1(3                  calculate the fifth number in a geometric series
If not(sum(ΔList(ΔList(L1    if ΔList(ΔList(L1)) yields an array of all zeroes
L1(4)2-L1(3                  calculate the fifth number in an arithmetic series
                             Ans is implicitly returned

1

Python 2, 75 66 65 61 byte

lambda(a,b,c,d):d*2-c if d-c==b-a else d*b/a or b and d/(a/b)

Molto più lungo della mia precedente voce da 38 byte che non soddisfaceva correttamente la serie di divisioni (proprio come la maggior parte degli altri non ha fatto).

I casi di test e altri casi limite sono su ideone

Nota: la divisione intera per un negativo qui è definita come avente un resto con lo stesso segno del divisore, quindi -81/4sarebbe -21con un resto di 3e -81/-4sarebbe 20con un resto di -1.


1
il numero negativo diviso per il numero negativo è positivo ...-81/-4 != -21
Limone distruttibile

@DestructibleWatermelon In effetti lo è. L'ho modificato e ho aggiunto il test case [325, -82,20, -5].
Jonathan Allan,

1

Gelatina , 14 byte

ṪḤ_ṪµṪ²:ṪµIE$?

Provalo online!

ṪḤ_ṪµṪ²:ṪµIE$?  Main Link =
             ?  If
          IE$   [condition]
          I     The differences between consecutive elements
           E    Is equal
ṪḤ_Ṫ            [then]
Ṫ               The last element
 Ḥ              Doubled
  _             Minus
   Ṫ            The last element (second-last of original list)
    µṪ²:Ṫµ      [else]
     Ṫ          The last element
      ²         Squared
       :        Divided by
        Ṫ       The last element (second-last of original list)

0

Pyth, 18 byte

?-+vzJEyQ/^E2J-yEJ

Accetta input come un elenco di valori separato da nuova riga.

Provalo online!

Spiegazione:

?                         If
 -                          the following are not equal:
  +vzJE                      the sum of first and third values (and call the third value J)
       yQ                    and the second value * 2;
                            (i.e. if it is not an additive or subtractive formula)
          ^E2             Then: square the fourth value
         /   J              and divide by the third
?                         Else:
               yE           double the fourth value
              -  J          and subtract the third
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.