Le nombre final

15

Défi

entrez la description de l'image ici

Écrivez un programme qui prend un tableau de 4 entiers ( qui représente une séquence de nombres générée par un certain algorithme ) et retourne le prochain entier qui suivrait.

Nous n'utiliserons que des algorithmes simples d'addition, de soustraction, de multiplication et de division avec une variation constante (c'est-à-dire non variable).

Pour la division, nous utiliserons les floorvaleurs entières: 133/4 = 33et33/4 = 8

Vous pouvez supposer qu'il y aura toujours une seule valeur de retour valide

Cas de test

[14,24,34,44] devrait renvoyer 54 (algorithme d'addition)

[105,45,-15,-75] devrait retourner -135 (algorithme de soustraction)

[5,25,125,625] devrait retourner 3125 (algorithme multiplicatif)

[256,64,16,4] devrait retourner 1 (algorithme de division)

Règles générales

Daniel
la source
2
Il s'agit d'une version simplifiée de la prochaine étape? et doublon limite.
Peter Taylor
7
À l'avenir, je vous recommande de publier dans Sandbox avant de commencer afin de pouvoir recevoir les commentaires des autres à l'avance.
Leaky Nun
5
Vous devriez vraiment ajouter des cas de tests pour la division entière. Presque toutes les réponses ne donnent pas de résultat correct pour [261,65,16,4], [4,2,1,0] ou [2,1,0,0]
Damien
5
Je ne suis pas d'accord avec les votes en double. Trouver l'algorithme est plus simple dans le sens où il n'y a qu'une seule opération à considérer, mais en même temps, c'est plus difficile car la division entière doit être prise en compte. Je ne pense pas qu'il soit beaucoup plus facile de transférer une réponse de l'autre défi que d'en écrire une à partir de zéro.
Dennis
3
Vous devez probablement spécifier des entiers non négatifs, car lorsqu'une série de divisions est négative, il existe deux interprétations. Par exemple -81/4est soit 21 r 3ou -20 r -1.
Jonathan Allan

Réponses:

6

05AB1E , 18 16 18 octets

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

Explication

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

Essayez-le en ligne!

Emigna
la source
La sortie est incorrecte avec [4,2,1,0] ...
Damien
@Damien: Merci de m'avoir prévenu. Je l'ai corrigé et cela m'a même permis d'économiser quelques octets :)
Emigna
Génial. Maintenant, il valide tous mes cas de test.
Damien
Essayez le cas de bord pour diviser par quatre:[-325, -82, -21, -6]
Jonathan Allan
... en fait, je suppose que la question devrait être uniquement pour les entiers non négatifs ou devrait spécifier quelle convention doit être utilisée.
Jonathan Allan
14

Javascript (ES6),  44   42  44 octets (fixe)

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

Enregistré 2 octets, suivant les conseils d'IsmaelMiguel.
Version fixe pour [2,1,0,0]et [1,0,0,0]comme suggéré par edc65

Version 30 octets

Pour mémoire, ma première tentative était de 32 30 octets mais manquait de support floor () pour la division. Il échoue également pour des cas spéciaux tels que [2,1,0,0]et [1,0,0,0].

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

Démo

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

Arnauld
la source
Wow, je ne savais pas que js avait une correspondance de motifs.
Leaky Nun
@LeakyNun - La mission de destruction a en effet été introduite dans ES6. Notez que vous ne pouvez pas faire [a,b]=>pour les paramètres de fonction. Les parenthèses sont obligatoires.
Arnauld
Bien, mais vous devez gérer la division entière: [260, 65, 16, 4] => 0.9846153846153847. Il devrait donner 1
Damien
@Damien - Ah bien ... je savais que quelqu'un le remarquerait. ;-) C'est fixe.
Arnauld
Qu'en est-il de [2,1,0,0]? Devrait donner 0. Je pense que c'est le seul contre-exemple pour l' b*2==c+aalgorithme <=> d'addition / soustraction
Damien
11

Brachylog , 37 33 27 octets

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

Essayez-le en ligne! ou vérifiez tous les cas de test .

10 octets enregistrés grâce à @LeakyNun .

Explication

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

Comme l'a souligné LeakyNun, nous n'avons pas besoin du cas de soustraction car il Ipeut s'agir de n'importe quel entier.

Fatalize
la source
4
wow, brachylog (& prolog) sont géniaux
Maltysen
2
L'addition et la soustraction sont les mêmes
Leaky Nun
1
@LeakyNun Correct, merci!
Fatalize
3
29 octets
Leaky Nun
3
27 octets
Leaky Nun
6

Haskell, 65 octets

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
Damien
la source
5

Python 2, 40 octets

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

C'est littéralement la réponse JS portée en Python (merci @LeakyNun!). Mon approche précédente était ridiculement longue, mais la voici:

Python 2, 169 166 octets

Les deuxième et troisième niveaux sont un onglet brut et un onglet brut plus un espace, respectivement, qui jouent vraiment mal avec Markdown, donc les onglets ont été remplacés par 2 espaces.

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

Assez simple; essaie chaque constante et opérateur qu'il pense être la constante, puis si la combinaison constante / opérateur fonctionne pour chaque élément de la liste (en utilisant une paire try/ exceptpour éviter ZeroDivisionErrors), il imprime le résultat du dernier élément de la liste.

Je suis sûr qu'il y a une meilleure méthode ici, c'est la méthode naïve.

Cuivre
la source
Vous feriez mieux de simplement porter la réponse js en Python
Leaky Nun
Pauses pour [1,0,0,0]lesquelles devrait sortir0
Jonathan Allan
3

TSQL, 55 octets

Ce script essaie d'ajouter et de soustraire dans la même vérification, puis il essaie de se multiplier, si cela échoue, ce doit être la division.

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(@)))

Violon

t-clausen.dk
la source
3

C #, 63 octets

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

Vérifie si la différence entre le premier et le deuxième élément est la même que la différence entre le deuxième et le troisième élément. Si c'est le cas, il fait l'addition / la soustraction, sinon il fait la multiplication / la division.

Scepheo
la source
2

JavaScript, 73 octets

(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

Tests :

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

Fonctionne pour tous.

Qui donc est cette personne
la source
1
Je n'étais pas sûr de l'étiquette ici. Je sais qu'il y a déjà une autre réponse JS, mais elle ne traite pas des cas marginaux. Le mien est plus long, mais gère tout cela. Faites-moi savoir si je ne l'ai pas fait correctement.
Whothehellisthat
1
Il n'y a rien de mal à publier une réponse dans la même langue qu'une autre réponse, surtout si votre réponse est correcte et que l'autre ne l'est pas. Je ne sais pas si vous avez suffisamment de représentants pour le faire, mais vous voudrez peut-être également commenter cette réponse pour leur faire savoir quels cas marginaux ils manquent.
DJMcMayhem
J'ai en fait pris les cas de bord de cet autre poste, mais ils n'ont pas résolu le problème. ; P
Whothehellisthat
2

Langue GameMaker, 70 octets

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

R, 68 74

Tableau: 68 octets

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 entrées: 45 octets

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

Solution de bonus avec log, exp,var , 71 octets

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

mise à jour: division entière

Vlo
la source
N'est-ce pas prendre quatre variables plutôt qu'un tableau? Sinon, vous pouvez vous débarrasser des parenthèses b-apour enregistrer un octet (et je note que vos appels d'exemple ajoutent des espaces).
Jonathan Allan
@JonathanAllan Vous avez raison. Il ne prend pas de tableau. Le nombre d'octets a été mis à jour. Les parenthèses sont nécessaires pour d'autres raisons, mais nous pouvons enregistrer un octet en ajoutant un espace à la place. Les appels n'ont pas besoin d'espaces supplémentaires.
Vlo
Oui, c'est pourquoi j'ai dit que vous pouviez économiser 1 octet au lieu de 2
Jonathan Allan
Remarque, il ne gère actuellement pas entièrement l'exigence de division entière, par exemple les 261,65,16,4retours 0.9961686plutôt que 1(bien sûr, il devrait y avoir un cas de test pour cela dans la question).
Jonathan Allan
1
Fonction @JonathanAllan (x) si (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] sinon x [4]% / % (x [1]% /% x [2])
Vlo
1

Java, 125 123 octets

Golfé:

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

Non golfé:

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

Ce code a sûrement quelques problèmes car il ne gère pas la division par zéro et de telles choses. Cela ne fonctionnera pas non plus s'il y a plus (ou moins) de 4 entiers dans le tableau d'entréea . Ce qui le rend plus que stupide, mais je me suis amusé :)

Essayez-le: https://ideone.com/nELH5I

peech
la source
1

TI-Basic, 37 octets

Fonctionne sur n'importe quelle calculatrice 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
Timtech
la source
1

Python 2, 75 66 65 61 octets

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

Beaucoup plus long que mon entrée précédente de 38 octets qui ne répondait pas correctement à la série de division (tout comme la plupart des autres).

Les cas de test et plus de cas marginaux sont sur idéone

Remarque: la division entière pour un négatif ici est définie comme ayant un reste avec le même signe que le diviseur, -81/4serait donc -21avec un reste de 3et -81/-4serait 20avec un reste de -1.

Jonathan Allan
la source
1
le nombre négatif divisé par le nombre négatif est positif ...-81/-4 != -21
Destructible Lemon
@DestructibleWatermelon En effet, il l'est. J'ai édité cela et ajouté le cas de test [325, -82,20, -5].
Jonathan Allan
1

Gelée , 14 octets

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

Essayez-le en ligne!

ṪḤ_ṪµṪ²:Ṫµ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)
HyperNeutrino
la source
0

Pyth, 18 octets

?-+vzJEyQ/^E2J-yEJ

Accepte l'entrée comme une liste de valeurs séparées par des sauts de ligne.

Essayez-le en ligne!

Explication:

?                         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
Steven H.
la source