Trouver le plus grand nombre n positions loin de n

29

Une suite à cette question .

Tâche

Étant donné un tableau d'entiers positifs, trouvez le plus grand élément k pour lequel:

Il existe une distance entière positive n , de sorte que l'élément du tableau situé n se  situe à gauche ou à droite de k est égal à n .

Le tableau est garanti pour contenir au moins un élément remplissant cette condition.

Le code le plus court (en octets) gagne. Vous pouvez choisir le format d'E / S que vous souhaitez.

Exemple

Compte tenu de l'entrée

[4, 6, 7, 9, 3, 6, 5, 7, 2]

Les valeurs éligibles sont:

  • Le 4, car il y a 77 positions situées à sa droite
  • Le premier 6, car il y a 33 positions situées à sa droite
  • Le 3, car il y a un 44 positions situées à sa gauche
  • Le 5, car il y a un 22 positions situées à sa droite
  • Le second 7, car il y a 33 positions situées à sa gauche.

De ces valeurs, la plus grande est 7.

Cas de test

[1, 13] → 13
[2, 9, 8, 3, 72, 2] → 8
[5, 28, 14, 5, 6, 3, 4, 7] → 14
[1, 3, 5, 15, 4, 1, 2, 6, 7, 7] → 7
[5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3] → 5
[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5] → 10
Lynn
la source
Deux autres cas (quoique légèrement redondants) dans l'exemple: les 6 premiers (encore) car il y a 5 cinq positions à droite; ou le second 7 (encore) car il y a 6 six positions à gauche.
Jonathan Allan
1. Sur mon téléphone, le titre semble être "Rechercher le plus grand nombre de positions loin d'un". 2. La condition énoncée est qu'il existe un certain k tel que (une propriété qui ne dépend pas de k). Cela doit sûrement être faux.
Peter Taylor
@PeterTaylor "this" dans "this element" fait référence à k.
Taemyr
1
@Taemyr, cela n'a pas de sens pour deux raisons: premièrement, parce que k n'est pas déclaré être un élément; et ensuite parce qu'on nous demande de " trouver le plus grand élément satisfaisant " la condition, donc " cet élément " a un antécédent en dehors de la condition.
Peter Taylor
2
Peut-être pourriez-vous éviter toute confusion en disant "trouver le plus grand élément k tel que" et ensuite utiliser k au lieu de cet élément dans la définition?
Martin Ender

Réponses:

3

Gelée , 9 octets

Jạþ`=ḅa¹Ṁ

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

Comment ça marche

Jạþ`=ḅa¹Ṁ  Main link. Argument: A (array)

J          Indices; yield [1, ..., len(A)].
   `       Use the previous return value as left and right argument:
 ạþ        Absolute difference table; take the absolute value of the difference
           of each pair of indices, yielding a 2D array.
    =      Compare each absolute difference with the corresponding item of A.
     ḅ     Base; convert each Boolean list from base i to integer, where i is the
           corresponding item of A. The value of i is not important; we only care
           if the list contains a 1, which will result in a non-zero integer.
       ¹   Identity; yield A.
      a    Logical AND; replace non-zero values with the corresponding items of A.
        Ṁ  Take the maximum.
Dennis
la source
1
Hmm, je ne sais pas quelle est la politique à ce sujet, mais vous avez maintenant deux approches différentes dans des réponses distinctes, dans le même langage de programme par le même utilisateur. Ne serait-il pas plus judicieux de mettre les extraits de 9 et 10 octets dans la même réponse, car c'est le même langage de programmation et les deux par vous? Je peux comprendre plusieurs réponses dans le même langage de programmation par plusieurs utilisateurs, mais je pense personnellement que des approches différentes par le même utilisateur dans le même langage de programmation seraient mieux adaptées en tant que modifications. Juste mon avis.
Kevin Cruijssen
5
C'était ma première méta-question , et le consensus semblait être que différentes approches devraient être affichées dans différentes réponses. Dans ce cas, mes approches n'ont rien d'autre que le maximum à la fin en commun, alors j'ai opté pour un poste séparé.
Dennis
8

05AB1E , 21 octets

vyN+Ny-})¹gL<Ãv¹yè})Z

Explication

v      }               # for each num in input
 yN+                   # push index + num
    Ny-                # push index - num
        )              # wrap stack in a list
         ¹gL<Ã         # remove indices outside the range of input
              v¹yè})   # get list of elements in input at the remaining indices
                    Z  # get max

Essayez-le en ligne!

Emigna
la source
Vous l'utilisez probablement tout le temps, mais je viens de remarquer "empiler la pile dans une liste". Soigné.
GreenAsJade
@GreenAsJade: Oui, c'est l'une des commandes que j'utilise le plus :)
Emigna
7

Haskell, 61 57 55 octets

f x=maximum[a|(n,a)<-x,(i,b)<-x,b==abs(n-i)]
f.zip[0..]

Exemple d'utilisation: (f.zip[0..]) [5,28,14,5,6,3,4,7]-> 14.

(Plus ou moins) une implémentation directe de la définition: pour chaque index nde la liste d'entrée xgarder a := x!!ns'il y a un index ib := x!!iest égal abs(n-i). Trouvez le maximum.

Modifier: @xnor a enregistré deux octets. Merci!

nimi
la source
Puisque vous n'utilisez pas x, il devrait être plus court de définir une fonction dans zet de composer dans zip[0..].
xnor
6

Gelée , 10 octets

,N+JFfJị¹Ṁ

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

Comment ça marche

,N+JFfJị¹Ṁ  Main link. Argument: A (array)

,N          Pair A with -A (element-wise negative).
   J        Yield the indices of A [1, ..., len(A)].
  +         Add the elements of A (and their negatives) with the corr. indices.
    F       Flatten the resulting 2D array.
     fJ     Filter indices; remove invalid indices (not in [1, ..., len(A)]) from
            the generated array. The result is the list of all indices of eligible
            elements of A.
       ị¹   Retrieve the corresponding elements of A.
         Ṁ  Take the maximum.
Dennis
la source
5

Python 3, 85 80 72 octets

lambda l,e=enumerate:max(i for p,i in e(l)for s,j in e(l)if j==abs(s-p))

Edit: -8 octets grâce à @Dennis

Elvorfirilmathredia
la source
5

EXCEL: 32 30 octets

=MAX(IF(A:A-ROW(A:A)<0,A:A,0))

Je n'arrive toujours pas à croire que je sois si court ...

Comment utiliser:
collez-le dans N'IMPORTE QUELLE cellule SAUF les cellules de la colonne A. Après avoir collé, tout en modifiant, appuyez sur control+ shift+ enterpour le saisir correctement.
mettez vos valeurs dans la colonne A, 1 valeur par cellule (selon l'entrée CSV).

Si vous voulez savoir comment cela fonctionne, j'ai publié un conseil supplémentaire dans ma question Conseils pour jouer au golf dans Excel .

Communauté
la source
J'adore ces excellents golfs - qui aurait pensé !!
GreenAsJade
4

JavaScript (ES6), 61 octets

a=>Math.max(...a.filter((_,i)=>a.some((e,j)=>e==i-j|e==j-i)))
Neil
la source
4

Perl, 45 octets

Comprend +2 pour -ap

Donnez des chiffres sur une ligne sur STDIN:

largest.pl <<< "5 12 2 5 4 7 3 3 6 2 10 5 5 5 4 1 8 5"

largest.pl:

#!/usr/bin/perl -ap
($_)=sort{$b-$a}map@F[$^P=$n-$_,$n+++$_],@F

Un octet de plus peut être obtenu en remplaçant ^Ppar le caractère de contrôle littéral, mais cela conduit à un avertissement sur STDERR sur les dernières perls.

Suppose largest number + array length < 2^32

Ton Hospel
la source
3

Pyth, 19 17 octets

Merci à @ Pietu1998 pour -2 octets

eS@[email protected],-kb+b

Un programme qui prend l'entrée d'une liste sur STDIN et imprime le résultat.

Essayez-le en ligne

Comment ça marche

eS@[email protected],-kb+b  Program. Input: Q
         .e        Map over Q (implicit input fill) with elements as b and indices as k:
            -kb     k-b
               +b   k+b (Implicit fill with k)
           ,        2-element list of those (possible indices)
        s          Flatten that
      UQ           Yield [0, 1, 2, 3..., len(Q)-1]
     @             Filter the flattened list by presence in the above, removing invalid
                   indices
  @LQ              Index into Q at those indices
 S                 Sort that
e                  Yield the last element of that, giving the maximum
                   Implicitly print
TheBikingViking
la source
}#est le même que @. De plus, si vous réorganisez le dernier bit, ,-kb+bkvous pouvez supprimer le dernier kcar Pyth l'insère automatiquement.
PurkkaKoodari
@ Pietu1998 Merci. Je ne connaissais pas le remplissage implicite pour énumérer; cela fonctionne-t-il pour d'autres fonctions de type carte?
TheBikingViking
Fonctionne pour n'importe quel lambda, il remplit automatiquement le reste de tout lambda avec la première variable lambda.
PurkkaKoodari
3

MATL, 13 octets

ttn:tYTq=a)X>

L'entrée doit être un vecteur de colonne. C'est-à-dire, l'entrée est séparée par des points-virgules comme [1; 2; 3], ou séparée par des virgules avec une coche de transposition à la fin comme [1,2,3] '.

Essayez-le en ligne!

Tous les cas de test: (A) , (B) , (C) , (D) , (E) , (F)

Merci à Suever pour les suggestions dans le salon MATL pour enregistrer 2 caractères.

Explication:

La stratégie globale est la même que ma réponse Octave / MATLAB, où le concept de base est expliqué: https://codegolf.stackexchange.com/a/94161/42247

Le code spécifique dans cette réponse MATL est construit comme suit:

Le cœur de la méthode est la construction de la matrice de Toeplitz dont la jième entrée est abs (ij). Nous construisons d'abord la matrice de Toeplitz avec les entrées abs (i-1) +1 avec la commande toeplitz YT de MATL comme suit:

n:tYT % Equivalent to @(v)toeplitz(1:length(v))

Pour voir comment cela fonctionne, appelons le vecteur d'entrée à cet extrait de code «v». Le «n» trouve la longueur de v, puis «:» construit le vecteur 1: longueur (v). Ensuite, le «t» fait une autre copie de 1: longueur (v) sur la pile; cette copie supplémentaire est nécessaire en raison d'un bogue bien connu dans la fonction YT dans MATL (l'équivalent MATL de toeplitz ()), dans lequel il attend deux copies de l'entrée au lieu de 1. Ensuite, YT prend les deux copies de ce vecteur 1 : longueur (v) de la pile, et en fait la matrice abs (ij) +1 de Toeplitz.

Maintenant, nous devons soustraire 1 de cette matrice pour obtenir la matrice de Toeplitz avec les entrées abs (ij), et trouver les emplacements ij où cette matrice de abs (ij) Toeplitz est égale à la matrice de tous les vecteurs de colonne contenant des copies de colonne de l'entrée vector v. Cela se fait comme suit:

t n:tYT q=
% t [code] q= is equivalent to @(v) [code](v)-1 == v

Le premier «t» crée une copie supplémentaire de l'entrée et la stocke sur la pile. Le 'n: tYT' crée la matrice de toeplitz comme décrit précédemment et la renvoie dans la pile. Ensuite, 'q' soustrait 1 de la matrice de Toeplitz et '=' fait la comparaison d'égalité par élément entre la matrice abs (ij) et le vecteur dont les colonnes sont des copies de l'entrée. Notez qu'en comparant un vecteur de colonne à une matrice, nous profitons implicitement des règles de diffusion d'opérateur de MATLAB / MATL (le vecteur de colonne dans la comparaison est copié pour créer une matrice sans émettre de commande).

Enfin, nous devons trouver les indices de ligne i où il y a une colonne j telle que la iième entrée dans la différence de matrice construite ci-dessus soit égale à 1, puis obtenir la valeur du vecteur d'entrée correspondant à ces indices, puis prendre le maximum. Ceci dans les trois étapes suivantes:

1) Trouvez les indices pour toute ligne contenant un non nul:

tn:tYTq= a
% [code] a is equivalent to @(v) any([code](v))

2) Extraire les éléments du vecteur d'entrée correspondant à ces indices:

t tn:tYTq= a ) X>
% t [code] ) is equivalent to @(v) v([code](v)]

3) Trouvez et retournez l'élément maximum:

t tn:tYTq= a ) X>
% [code] X> is equivalent to @(v) max(v).
Nick Alger
la source
Le comportement de la fonction YTa changé dans la version 20.2.2 . Maintenant, il utilise 1 entrée par défaut (ce qui est plus utile en général). Bien que cela vous fasse économiser 1 octet ici (supprimer tavant YT), il ne peut pas être exploité car le changement de langue est postérieur au défi. Mais cela a pour effet que votre réponse n'est plus valable dans la nouvelle version, qui est maintenant en direct dans TIO
Luis Mendo
Vous pouvez soit modifier le code lié et laisser une note, soit utiliser ce lien vers l'interpréteur de MATL Online, qui prend en charge les anciennes versions. Malheureusement, vous devez également mettre à jour les autres liens. Désolé pour le dérangement
Luis Mendo
Indépendamment de cela, vous pouvez enregistrer 1 octet en le remplaçant n:parf
Luis Mendo
2

Rubis, 66 octets

->a{i=-1;a.map{|e|i+=1;[a[j=i+e]||0,a[0>(k=i-e)?j:k]||0].max}.max}
cia_rana
la source
2

Octave / MATLAB, 40 octets

@(v)max(v(any(toeplitz(1:nnz(v))-v==1)))

L'entrée doit être un vecteur de colonne.

Merci à Luis Mendo pour les suggestions économisant 3 octets (voir commentaire)

Merci à Suever pour les suggestions permettant d'économiser 4 octets supplémentaires (en remplaçant ~~ (sum ()) par any ())

Explication:

Étant donné un vecteur d'entrée v, ce problème équivaut à trouver toutes les solutions i, j de l'équation discrète suivante,

abs(i-j) = v(i),   i,j both in 1..k,

où abs () est la fonction de valeur absolue. Chaque v (i) pour lequel cette équation est résolue est l'une des solutions candidates sur lesquelles nous pouvons maximiser.

En tant que fonction discrète de i et j, toutes les possibilités pour le côté gauche peuvent être arrangées dans la matrice de toeplitz qui ressemble à ceci:

[0, 1, 2, 3, 4]
[1, 0, 1, 2, 3]
[2, 1, 0, 1, 2]    <--- abs(i-j)
[3, 2, 1, 0, 1]
[4, 3, 2, 1, 0]

Et comme le côté droit ne dépend pas de i, toutes les possibilités peuvent être arrangées dans une matrice où les colonnes sont toutes des copies de l'entrée,

[v(1), v(1), v(1), v(1), v(1)]
[v(2), v(2), v(2), v(2), v(2)]
[v(3), v(3), v(3), v(3), v(3)]   <--- v(i)
[v(4), v(4), v(4), v(4), v(4)]
[v(5), v(5), v(5), v(5), v(5)]

Pour trouver toutes les solutions à l'équation, nous soustrayons ces deux matrices et trouvons les emplacements où il y a un zéro. Les lignes où il y a un zéro correspondent aux indices désirés i où il y a aj tels que abs (ij) = v (i).

Autres astuces:

  • Il faut moins de caractères pour construire la fonction de valeur absolue plus un, abs (ij) +1, puis vérifiez les emplacements où la différence est 1, plutôt que de construire la vraie fonction de valeur absolue (non décalée).
  • Utilise la diffusion automatique de l'opérateur pour faire implicitement des copies de colonne de v
  • Obtient la longueur de l'entrée via nnz () au lieu de length (), ce qui fonctionne puisque les entrées sont dites positives dans l'énoncé du problème.
Nick Alger
la source
Le format d'entrée est flexible par défaut. Vous pouvez prendre vcomme vecteur de colonne, indiquez-le simplement dans la réponse. En outre, vous remplacez findpar ~~pour enregistrer deux octets supplémentaires
Luis Mendo
@LuisMendo Merci, j'ai édité le message pour incorporer vos suggestions!
Nick Alger
Pour différentes langues (ou une approche sensiblement différente dans la même langue), vous devez publier une autre réponse . Il y a un chat MATL si vous avez des questions concernant la langue
Luis Mendo
BTW, en raison d'un bug dans MATL toeplitz( YT), il utilise deux entrées (pas une) par défaut
Luis Mendo
OK cool. Je l'ai traduit en MATL et j'ai posté une autre réponse ici: codegolf.stackexchange.com/a/94183/42247
Nick Alger
1

Mathematica, 69 octets

Max@MapIndexed[{If[#2[[1]]>#,a[[#2-#]],{}],a[[#2+#]]~Check~{}}&,a=#]&

Fonction anonyme. Prend une liste d'entiers en entrée et renvoie un entier en sortie. Ignorez tous les messages générés.

LegionMammal978
la source
1

Scala, 94 octets

a=>a.zipWithIndex.filter(p=>a.zipWithIndex.exists(x=>x._1==Math.abs(p._2-x._2))).unzip._1.max
sprague44
la source
1

PHP, 128 octets

<?foreach(($i=$_GET[i])as$k=>$v){$k-$v<0?:!($i[$k-$v]>$m)?:$m=$i[$k-$v];if($k+$v<count($i))if($i[$k+$v]>$m)$m=$i[$k+$v];}echo$m;
Jörg Hülsermann
la source
1

Java 7, 125 123 octets

int c(int[]a){int r=0,i=0,l=a.length,x;for(;i<l;r=l>(x=i+a[i])?a[x]>r?a[x]:r:r,r=(x=i-a[i++])>0?a[x]>r?a[x]:r:r);return r;}

2 octets enregistrés grâce à @mrco .

Code non testé (en quelque sorte) et de test:

Essayez-le ici.

class M{
  static int c(int[] a){
    int r = 0,
        i = 0,
        l = a.length,
        x;
    for(; i < l; r = l > (x = i + a[i])
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r,
                 r = (x = i - a[i++]) > 0
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r);
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1, 13 }));
    System.out.println(c(new int[]{ 2, 9, 8, 3, 72, 2 }));
    System.out.println(c(new int[]{ 5, 28, 14, 5, 6, 3, 4, 7 }));
    System.out.println(c(new int[]{ 1, 3, 5, 15, 4, 1, 2, 6, 7, 7 }));
    System.out.println(c(new int[]{ 5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3 }));
    System.out.println(c(new int[]{ 5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5 }));
  }
}

Sortie:

13
8
14
7
5
10
Kevin Cruijssen
la source
1
Vous n'avez pas besoin de x & y. Réutilisez simplement l'un d'entre eux (-2). De plus, je ne pense pas que vous puissiez définir r dans un énorme ternaire, car vous devez toujours tester les deux cas, à gauche et à droite.
mrco
1
@mrco Merci, supprimé le ,y. Et je suis en effet arrivé à la même conclusion concernant le ternaire unique si. Bien sûr, c'est possible, mais vous ferez le contrôle deux fois, ce qui le rend beaucoup plus long.
Kevin Cruijssen
1

Java, 118 octets

int f(int[]a){int t=0,i,j,z=0,l=a.length;while(t<l*l){i=t/l;j=t++%l;z=a[i]>z&&((i<j?j-i:i-j)==a[j])?a[i]:z;}return z;}
Ekeko
la source
Bienvenue chez PPCG! :)
Martin Ender
1

Python, 58 octets

Sur la base de la réponse Ruby Tony S. . Cette réponse fonctionne en Python 2 et 3. Les suggestions de golf sont les bienvenues.

lambda n:max([n[i+v]for i,v in enumerate(n)if i+v<len(n)])

Ungolfing

def f(array):
    result = []
    for index, value in enumerate(array):
        if index + value < len(array):
            result.append(array[index + value])
    return max(result)
Sherlock9
la source
1

Ruby 56 octets

Ma plus petite solution de rubis.

->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}

Assez facile à tester dans la console des rails

a = ->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}
a[[1, 13]
=> 13
a[[2, 9, 8, 3, 72, 2]]
=> 8
a[[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5]]
=> 10

Cela a commencé à 63 octets, merci pour les suggestions pour aider à le réduire!

Tony S.
la source
vous pouvez utiliser à la .mapplace de.each
Cyoce
(x) if (y)peut également être remplacé par(y)&&(x)
Cyoce
Vous pouvez utiliser à la a<<bplace dea+=[b]
Sherlock9
@ Sherlock9 j'ai oublié <<. L'utilisation de + = [b] n'a pas fonctionné avec la suggestion de Cyoce en utilisant &&. Maintenant c'est le cas, merci!
Tony S.
1

En fait , 17 octets

Cette réponse est en fait un portage de ma réponse Python . Suggestions de golf bienvenues. Essayez-le en ligne!

;╗ñ♂Σ⌠╜l>⌡░⌠╜E⌡MM

Ungolfing

         Implicit input L.
;╗       Duplicate L and save a copy of L to register 0.
ñ        enumerate() the other copy of L.
♂Σ       sum() all the pairs of [index, value of n]. Call this list Z.
⌠...⌡░   Push values of Z where the following function returns a truthy value. Variable v_i.
  ╜        Push L from register 0.
  l        Push len(L).
  >        Check if len(L) > v_i.
⌠...⌡M   Map the following function over Z_filtered. Variable i.
  ╜        Push L from register 0.
  E        Take the ith index of L.
M        max() the result of the map.
         Implicit return.
Sherlock9
la source
0

T-SQL (sqlserver 2016), 132 octets

Golfé:

;WITH C as(SELECT value*1v,row_number()over(order by 1/0)n FROM STRING_SPLIT(@,','))SELECT max(c.v)FROM C,C D WHERE abs(D.n-C.n)=D.v

Non golfé:

DECLARE @ varchar(max)='2, 9, 8, 3, 72, 2'

;WITH C as
(
  SELECT
    value*1v,
    row_number()over(order by 1/0)n
  FROM
    STRING_SPLIT(@,',')
)
SELECT
  max(c.v)
FROM
  C,C D
WHERE
  abs(D.n-C.n)=D.v

Violon

t-clausen.dk
la source
0

JavaScript (ES6), 56 54 octets

let f =
    
l=>l.map((n,i)=>m=Math.max(m,l[i+n]|0,l[i-n]|0),m=0)|m

console.log(f([1, 13])); // → 13
console.log(f([2, 9, 8, 3, 72, 2])); // → 8
console.log(f([5, 28, 14, 5, 6, 3, 4, 7])); // → 14
console.log(f([1, 3, 5, 15, 4, 1, 2, 6, 7, 7])); // → 7
console.log(f([5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3])); // → 5
console.log(f([5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5])); // → 10

Arnauld
la source
0

Clojure, 68 octets

#(apply max(map(fn[i](get % i 0))(flatten(map-indexed(juxt - +)%))))

Par exemple, (map-indexed (juxt - +) [3 4 1 2])est ([-3 3] [-3 5] [1 3] [1 5])(indexe +/-sa valeur), ceux-ci sont utilisés pour rechercher des valeurs à partir du vecteur d'origine (par défaut hors plage 0) et la valeur maximale est trouvée. Se sent toujours un peu bavard mais au moins j'ai pu utiliser juxt:)

NikoNyrh
la source