Intro
Un ami a posé cette question aujourd'hui d'une manière légèrement différente - "Une seule commande [Python] peut-elle déterminer le plus grand de certains entiers ET qu'ils ne sont pas égaux?".
Bien que nous n'ayons pas trouvé un moyen de le faire dans les définitions raisonnables de "une seule commande", je pensais que cela pourrait être un problème amusant pour le golf.
Défi
" Renvoie le plus grand d'une liste d'entiers si et seulement si ils ne sont pas tous égaux. "
Plus précisement:
Étant donné une chaîne contenant uniquement une liste d'entiers séparés par des virgules:
- S'ils sont tous égaux, rien ne retourne / ne sort
- Sinon, retour / sortie le plus grand
Règles
- L' entrée doit être une chaîne contenant uniquement une liste d'entiers séparés par des virgules
- La sortie doit être soit rien (aucune sortie d'aucune sorte), soit le plus grand élément de l'entrée, représenté tel qu'il est dans l'entrée
Les entrées peuvent être un programme complet ou simplement une fonction, à condition que vous fournissiez un moyen de les tester!
Hypothèses
- Supposons que les éléments de la liste d'entrée peuvent comporter plus d'un chiffre mais pas plus de (2 32 - 1)
- Supposons que la liste d'entrée ne comporte pas plus d'un million d'éléments
- Supposons que l'entrée n'inclura pas de valeurs négatives
- Supposons que l'entrée ne sera jamais vide
Pour éviter tout doute, l'explication de la contestation donnée juste après "Plus spécifiquement" remplacera l'énoncé de la contestation ci-dessus ("Renvoyer le plus grand ...").
Exemples
(1) Tous égaux:
Input: 1,1
Output:
(2) Différent:
Input: 1,2
Output: 2
(3) Zéro!:
Input: 0,0,0,0,0,0,0,1,0,0
Output: 1
(4) Aléatoire:
Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9
(5) Plus grands nombres, plus grande liste:
Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887
Exemples supplémentaires:
(6) Toutes égales, liste plus grande:
Input: 7,7,7,7,7,7,7,7,7
Output:
(7) Tous égaux, liste plus grande, nombres plus grands:
Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:
(8) Pas égal, liste plus grande, plus grands nombres:
Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185
Notation
C'est le cas code-golf
, donc le code avec le plus petit nombre d'octets gagne!
None
en python) plutôt que de ne rien produire? De plus, pourquoi l'entrée doit-elle être une chaîne plutôt qu'une liste? Et qu'entendez-vous par le plus grand élément de l'entrée, représenté tel qu'il est dans l'entrée7,3,7,2
.,
dans l'entrée?Réponses:
R ,
5037 octets-33 octets grâce à digEmAll! -13 octets grâce à rturnbull!
Essayez-le en ligne!
la source
MathGolf , 5 octets
Essayez-le en ligne!
Explication
Cela fonctionne parce que l'opérateur max et le rejet de l'opérateur gauche ne font rien pour les listes vides. Eh bien, l'opérateur max supprime la liste et ne pousse rien pour les listes vides.
Il peut s'agir de 4 octets si l'entrée peut être considérée comme une liste.
la source
Perl 6 ,
26 2322 octets-1 octet grâce à nwellnhof
Essayez-le en ligne!
Renvoie une fiche vide si tout est égal.
Explication
la source
EVAL
astuce est soignée et vous pouvez même enregistrer un octet aveco&EVAL
.if +.Set
marcherait pas ?Gelée , 4 octets
Un programme complet acceptant l'entrée comme argument de ligne de commande (sans guillemets) qui imprime la sortie requise
(Notez qu'il traite de: l'entrée vide comme
, l'entrée d'article unique comme
7
et l'entrée d'article multiple comme7,8,7
comme la spécification semble actuellement exiger.)Essayez-le en ligne!
Comment?
la source
APL (Dyalog Classic) , 6 octets
Essayez-le en ligne!
un train calculant le maximum (
⌈/
) sans (~
) le minium (⌊/
) transformé en matrice (⍪
)si l'entrée ne contient qu'un seul élément distinct,
⌈/~⌊/
sera vide et⍪
renverra une matrice 0 × 1 qui restitue comme rienautrement,
⌈/~⌊/
sera un vecteur à 1 élément et ce⍪
sera une matrice 1x1 (visuellement indiscernable d'un scalaire) qui contient le maximumla source
CJam ,
1613 octetsEssayez-le en ligne!
la source
Python 2 , 37 octets
sorties vers stderr (débogage sur tio).
Essayez-le en ligne!
la source
Python 2 ,
4241 octetsEssayez-le en ligne!
la source
element, element, ...
. c'est-à-dire qu'il n'a pas besoin d'être placé entre crochets.input
par défauteval
de ce que la chaîne est passée de stdin.,
, car votre erreur de solution si l'entrée n'est qu'un seul numéro!=
en a>
car l'entrée ne sera jamais vide?Haskell ,
777561 octetsEssayez-le en ligne!
('[':).(++"]")
prend une chaîne (par exemple"1,2,1,3"
) et la place entre crochets chars ("[1,2,1,3]"
). alorsread
Transforme la chaîne en une liste d'entiers ([1,2,1,3]
).La fonction
f
utilise cette astuce pour un conditionnel plus court si l'un des résultats est la liste vide.any(/=a!!0+0)a
vérifie si la listea
contient un élément différent de son premier élémenta!!0
. (Le+0
est nécessaire de telle sorte qu'ilread
sache qu'il doit rechercher une liste de nombres.) Si tous les éléments sont égaux, ce test aboutitFalse
et la chaîne vide est renvoyée. Sinonshow(maximum a)
, c'est le maximum de la liste convertie en chaîne, qui est retourné.la source
Rouge, 81 octets
Comme la solution R, une énorme partie du code gère la chaîne d'entrée "1,1,2,44,1". Si nous pouvons avoir cela comme un bloc, par exemple:,
x: [1 1 2 44 1]
alors nous pouvons le faire en 41 octets:la source
sort x: unique load replace/all input","" "if 1 <>length? x[last x]
pour 67 octets. Malheureusement,input
ne fonctionne pas dans TIO. Si vous en faites un func, cela fonctionne très bien dans TIO: 73 octetsAPL (Dyalog Unicode) , 12 octets
Programme complet. Demande la chaîne de stdin.
Essayez-le en ligne!
⎕
demander et évaluer l'expression (les virgules concaténent les nombres dans une liste){
…}
Appliquer le lambda anonyme suivant (⍵
est l'argument; la liste des nombres):1≠
[si] 1 est différent de…≢
le décompte de…∪
les numéros uniques dans…⍵
la liste:
ensuite⌈/
renvoyer le max à travers (lit. réduction max)…⍵
la liste[sinon: ne rien faire]
la source
⌈/~⌊/
JavaScript (Node.js) , 49/53 octets
Ma version originale utilisant
.every()
, 53 octetsUne fonction renvoyant '' ne compte-t-elle pas comme sortie? Bien sûr, cela peut être amélioré ...
Essayez-le en ligne!
Version améliorée utilisant
Set()
par Shaggy , 49 octetsEssayez-le en ligne!
la source
Neim , 4 octets
Explication:
Essayez-le en ligne!
la source
Octave , 28 octets
Renvoie le maximum (un nombre, qui est une matrice 1x1) ou une matrice vide (1x0).
Essayez-le en ligne!
la source
Japt, 16 octets
Ce serait 9 si ce n'est pour le format d'entrée inutilement strict, 7 si lancer une erreur ne compte pour rien.
Suppose que la chaîne contient au moins 2 entiers.
Essayez-le
la source
Lisp commun, 102 octets
Essayez-le en ligne!
La taille est principalement due à la saisie des données; avec une entrée en liste régulière, la longueur est réduite à 46 octets:
la source
XPath 3.1, 54 octets
avec la chaîne d'entrée comme élément de contexte:
Peut être réduit d'un caractère si vous autorisez le contexte à lier un préfixe plus court que «xs» à l'espace de noms du schéma XML.
Explication: prend la chaîne d'entrée, effectue un jeton sur le séparateur ",", s'applique
xs:int()
à chaque jeton à convertir en entier, calcule le maximum de la séquence, génère le maximum à condition que le prédicat$t!=$t
soit vrai. Si A et B sont des séquences, alorsA!=B
c'est vrai si il y a une paire d'éléments (a de A, b de B) tels quea!=b
.Si l'entrée peut être fournie sous la forme d'une séquence d'entiers $ s plutôt que d'une chaîne séparée par des virgules, la solution se réduit à
(15 octets - ce qui pourrait bien être la solution la plus courte dans un langage qui n'est pas conçu pour être concis)
REMARQUE : cela ne satisfait pas l'exigence "représentée telle qu'elle est dans l'entrée" - s'il y a un entier avec des zéros en tête ou un signe plus dans l'entrée, ceux-ci seront perdus. Je soupçonne que c'est également le cas pour de nombreuses autres solutions.
la source
K4 ,
3835 octetsCas de test:
Je ne parle pas couramment les k variantes disponibles sur TiO, donc aucun exemple en ligne n'est disponible, je vais essayer d'en trouver une
Explication
Si vous vous demandez pourquoi certaines opérations sont effectuées avant d'autres, K4 n'a pas de priorité d'opérateur, il interprète plutôt de droite à gauche (bien que vous puissiez utiliser des parenthèses pour la priorité). Expressions séparées par des points-virgules.
Peut probablement être joué plus bas, pas fan de devoir utiliser cette fonction max de fortune à la fin.
EDIT: Si les virgules en sortie sont un problème, il peut être corrigé avec deux octets supplémentaires:
Prendre le total à
4037, mais la virgule avant le nombre signifie simplement qu'il s'agit d'une liste d'éléments unique par opposition à un atome.la source
PHP (<= 5,6)
6474 octetsExécuter en tant que pipe avec
-nR
ou tester en lignesplit
a été supprimé en PHP7, mais comme j'ai dû en ajouter 10 pour résoudre quelques problèmes, cela valait la peine d'être utilisé au lieu deexplode
ce qui est à peu près équivalent dans ce cas.la source
Also this doesn't work when there are more than one element with the max value
Je missread leIf they are all equal, return/output nothing
àIf they are equal, return/output nothing
sens que s'il y a plus d' un à la sortie à vide. L'ajout le==count($a)
corrige. Parce quearray_count_values
compte le nombre de fois où il apparaît dans le tableau, si cela équivaut à la quantité totale d'éléments dans le tableau, puis affichez '' sinon affichez le max$argn
prend depuis stdin (cela a été utilisé dans plusieurs réponses de golf) Je peux donner des exemples non seulement des miens mais d'autres utilisateurs.Japt
-hF
, 8 octetsEssayez-le
-3
octets si l'entrée peut être considérée comme un tableau.la source
05AB1E ,
98 octets-1 octet grâce à @Cowabunghole .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
',¡ZsËiõ
, en économisant 1 octetPython 2 , 44 octets
Essayez-le en ligne!
la source
eval
Python convertit une chaîne séparée par des virgules en une liste?k=input()
et obtenir le même résultat.Ohm v2 , 9 octets
Essayez-le en ligne! Explication:
la source
Fusain , 15 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Divisez l'entrée sur des virgules et convertissez chaque valeur en entier.
Testez si la valeur maximale est supérieure à la valeur minimale.
Si c'est le cas, convertissez la valeur maximale en chaîne et imprimez.
la source
Mathematica, 43 octets
Fonction pure. Prend une chaîne séparée par des virgules en entrée et retourne un nombre ou
Null
. Je crois que cela est valide, car ilNull
n'est pas affiché graphiquement:la source
C (gcc) , 91 octets
Essayez-le en ligne!
Degolf
la source
M(char*s)
au lieu deM(s)char*s;
etindex()
au lieu destrchr()
Pyth, 7 octets
Essayez-le en ligne!
Tous les cas de test (code légèrement différent pour un meilleur formatage de sortie)
Comme Pyth est basé sur Python, l'entrée utilisateur est toujours interprétée comme une chaîne, qui peut ensuite être transmise
Explication:eval()
. Tous les programmes Pyth s'exécutent automatiquementQ=eval(input())
comme leur première instruction.la source
Java (JDK) , 101 octets
Essayez-le en ligne!
Expliqué
Solution bonus!
Malgré tous mes efforts, je n'ai pas pu obtenir cette solution en utilisant des expressions rationnelles et des flux à moins de 105 octets, mais j'ai vraiment aimé son élégance, j'ai donc dû lui donner une mention honorifique;
la source
?
régulière (moins le ) et une boucle régulière et retour (au lieu de flux).MATL ,
159 octetsEssayez-le en ligne!
Plusieurs cas de test
J'essaie juste d'empêcher mes côtelettes MATL de devenir trop rouillées!
Éditer : rouillé après tout; sauvé 6 octets, grâce à @LuisMendo.
Explication
la source
Pip , 13 octets
Essayez-le en ligne!
Utilise l'approche de la solution APL de ngn :
Les 5 premiers octets
a^:',
divisent la chaîne d'entrée par des virgules.Solutions alternatives à 13 octets:
la source