Considérons un morceau de ficelle (comme dans "corde", pas comme dans "un tas de caractères"), qui est plié dans les deux sens sur la ligne réelle. Nous pouvons décrire la forme de la chaîne avec une liste de points qu'elle traverse (dans l'ordre). Pour simplifier, supposons que tous ces points sont des entiers.
Prenons un exemple [-1, 3, 1, -2, 5, 2, 3, 4]
(notez que chaque entrée n’implique pas un pli):
La chaîne qui s'étend verticalement sert uniquement à la visualisation. Imaginez la chaîne tout aplatie sur la ligne réelle.
Maintenant, voici la question: quel est le plus grand nombre de pièces que cette ficelle peut être découpée en une seule coupe (qui devrait être verticale dans l'image ci-dessus). Dans ce cas, la réponse est 6 avec une coupure comprise entre 2
et 3
:
Pour éviter les ambiguïtés, la coupe doit être effectuée à une position non entière.
Le défi
Étant donné la liste des positions entières par lesquelles une chaîne est pliée, vous devez déterminer le plus grand nombre de pièces dans lesquelles la chaîne peut être coupée en une seule coupe à une position non entière.
Vous pouvez écrire un programme complet ou une fonction. Vous pouvez effectuer une entrée via STDIN, un argument de ligne de commande, une invite ou un paramètre de fonction. Vous pouvez écrire la sortie dans STDOUT, l'afficher dans une boîte de dialogue ou la renvoyer depuis la fonction.
Vous pouvez supposer que la liste est dans un format de liste ou de chaîne approprié.
La liste contiendra au moins 2 et pas plus de 100 entrées. Les entrées seront des entiers, compris entre -2 31 ≤ p i <2 31 . Vous pouvez supposer que deux entrées consécutives ne sont pas identiques.
Votre code doit traiter une telle entrée (y compris les cas de test ci-dessous) en moins de 10 secondes sur un ordinateur de bureau raisonnable.
Cas de test
Tous les cas de test sont simplement entrés, suivis par les résultats.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
la source
a reasonable desktop PC
plutôt ambigu?Réponses:
APL,
16 à14 octetsMerci à @ ngn pour la sauvegarde de 2 octets.
Le
⎕
est en fait un caractère de boîte, pas une erreur de police manquante. Vous pouvez essayer le programme sur tryapl.org , mais comme il⎕
n’est pas totalement pris en charge, vous devez le remplacer par la valeur en entrée:Explication
Le programme s’explique mieux avec l’exemple d’entrée
s = ¯1 3 1 ¯2 5 2 3 4
, tiré de STDIN par⎕
. Premièrement, nous calculons le≤
produit -outer des
avec lui-même en utilisant∘.≤⍨
. Cela donne une matrice booléenne donti
la rangée indique quels élémentss
sont inférieurs ou égaux às[i]
:Les occurrences de
0 1
et1 0
sur la lignei
marquent des endroits où la chaîne passe sur le points[i] + 0.5
. Nous comparons sur ces lignes chaque ligne en utilisant2≠/
"réduire les 2 sous-listes par≠
":Reste à prendre les sommes des lignes avec
+/
et un plus le maximum de ceux-ci avec
1+⌈/
:Le résultat est automatiquement imprimé sur STDOUT dans la plupart des implémentations APL.
la source
×
pour la multiplication, et des règles de syntaxe très simples. Google "mastering Dyalog APL" pour un bon guide.Python,
887573 octetsJuste un simple lambda
Juste pour montrer une autre approche:
Pyth,
28 à27 octetsCelui-ci est à peu près équivalent à
appliqué à la liste d'entrée de STDIN. Essayez-le sur l' interprète en ligne .
la source
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s pour sauvegarder certains caractères. J'ai réalisé qu'ils étaient inutiles dans le mien.a = point + .5
et compte le nombre d'intervalles strictement contenusa
. Sans le,.5
vous aurez des problèmes avec des cas comme l'[1, 0, -1]
exemple.Pyth :
313029282423 caractère (Python 68 caractères)Essayez-le ici: Compilateur / Exécuteur Pyth
Il attend une liste d'entiers en entrée
[-1, 3, 1, -2, 5, 2, 3, 4]
C'est une traduction directe de mon programme Python:
Ancienne solution: Pyth 28 car
Juste pour des raisons d'archivage.
Un code Python correspondant serait:
la source
,QtQ
place de[QtQ)
i
n'est pas la ligne d'intersection,i - 0.5
est. Et donc1
(en fait1 - 0.5 = 0.5
) est à l'intérieur(-1, 1)
.min(a)<i<=max(a)
est équivalent àmin(a) < i - 0.5 < max(a)
, ce qui est résolu en Pyth avecmin(a) < i < max(a)+1
(notez leh
dansheSk
).g
ce qui est>=
, si vous remplacez<dheSk
pargeSkd
.CJam,
36 34 3330 octetsJe crois qu'il existe un meilleur algorithme dans la nature. Néanmoins, cela fonctionne sous la limite requise pour tous les cas de test (même sur le compilateur en ligne).
L'entrée est comme
La sortie (pour le cas ci-dessus) est
Comment ça marche
Supposons maintenant que le tableau en entrée soit
[-1 3 1 -2 5 2 3 4]
, les étapes de compression se présentent comme suit:Le deuxième tableau de la dernière ligne est constitué des plis de la chaîne.
Maintenant, nous parcourons
[-1 3 1 -2 5 2 3 4]
et calculons le nombre d'ensembles dans lesquels chacun se situe. Tirez le maximum de ce nombre, augmentez-le et nous avons notre réponse.Essayez-le en ligne ici
la source
Matlab
(123) (97)(85)Oui, enfin une utilisation de XNOR =), je suis sûr qu’il peut être joué beaucoup plus au golf.
Mais honnêtement, je suis un peu gêné que MatLab devienne la langue que je connais le mieux = /
Le temps d'exécution approximatif est
O(n^2)
.EDIT2:
EDIT: Nouvelle version plus golfée (y compris des astuces de @DennisJaheruddin, merci!)
Ancienne version:
@ MartinBüttner: J'aime beaucoup vos gentils petits défis juste avant d'aller au lit!
la source
c=sort(a)-.5
Bien sûr, le premier point est alors hors de portée, mais il est sûrement plus facile de gérer cela. Dans le pire des cas, vous pouvez le fairec(1)=[];
. - Vous pouvez aussi effacer la commande disp, en calculant que quelque chose l'écrira sur stdout .-- Enfin, dans ce cas,numel
peut être remplacé parnnz
conv
approche ... = D. J'oublie toujours lennz
, merci beaucoup!disp
depuis une personne une fois que la critiquée méthode que vous proposez, vous obtenez également d' autres caractères (nom du var ouans
) par écrit stdout ...Mathematica
134 133104Amusant à résoudre, malgré la taille du code. En outre le golf peut encore être atteint en remplaçant l'idée d'
IntervalMemberQ[Interval[a,b],n]
aveca<n<b
.Explication
list1
Est la liste donnée de pointslist2
est une liste abrégée qui supprime les nombres qui n'étaient pas au plis; ils ne sont pas pertinents. Ce n'est pas nécessaire, mais cela conduit à une solution plus claire et plus efficace.Les intervalles en
list1
etlist2
sont indiqués dans les graphiques ci-dessous:Nous n'avons besoin de tester qu'une seule ligne dans chaque intervalle déterminé par les points de pli. Les lignes de test sont les lignes verticales en pointillés du tracé.
f
trouve le nombre de coupes ou de croisements de chaque ligne de test. La ligne en x = 2,5 fait 5 croisements. Cela laisse 5 + 1 morceaux de ficelle.la source
Pyth, 21 octets
Essayez ici.
Donne une entrée sous forme de liste de style Python, par exemple
[-1, 3, 1, -2, 5, 2, 3, 4]
Étroitement basé sur le programme de @ jakube, mais avec un algorithme central amélioré. Au lieu de faire une
>
vérification et une>=
vérification, je fais un.index()
sur les trois nombres combinés et je m'assure que l'indice est 1, ce qui signifie qu'il est supérieur au minimum et inférieur ou égal au maximum.la source
R,
8683Travaillait à travers cela et ensuite réalisé que j'avais essentiellement trouvé la même solution que Optimizer et d'autres que je soupçonne.
Quoi qu’il en soit ici c’est comme une fonction qui prend un vecteur
la source
R
. FWIW vous pourriez économiser 3 caractères en utilisantT
"TRUE"GolfScript (43 octets)
En termes d'efficacité, il s'agit de O (n ^ 2) en supposant que les comparaisons prennent du temps O (1). Il sépare l'entrée en segments de ligne et compte pour chaque point de départ les segments de ligne semi-ouverts qui le traversent.
Démo en ligne
la source
Python - 161
Cela peut probablement être joué plus au golf. Gnibbler a beaucoup aidé au golf.
la source
Ruby, 63 ans
Similaire aux solutions Python dans le concept.
Ajoutez 2 caractères avant le code, par exemple
f=
si vous voulez une fonction nommée. Merci à MarkReed .la source
C #,
7365 octetsEn lisant les règles, j'ai pensé qu'un C # lambda devrait très bien se débrouiller.
Edit: just found
Count
a une surcharge utile pour le filtrage!Vous pouvez tester cela en définissant le
delegate
type approprié :Et alors
la source
Matlab (
6343)L'entrée est donnée sous la forme d'un vecteur ligne transmis à la fonction
f
. Donc, par exemple,f([-1, 3, 1, -2, 5, 2, 3, 4])
retourne6
.Version plus courte:
Octave (31)
En Octave
bsxfun
peut être supprimé grâce à la diffusion automatique:la source
JavaScript (ES6) 80
82Voir les commentaires - le nombre d'octets n'inclut pas l'affectation à F (cela reste à tester)
Test dans la console FireFox / FireBug
Sortie
la source
lambda
solutions Python , il n'est pas nécessaire d'attribuer la valeur de la fonction à une variable réelle, vous pouvez donc supprimer deux caractères.Gelée , 10 octets
Essayez-le en ligne!
Comment ça marche
la source
05AB1E , 6 octets
Essayez-le en ligne!
Explication:
la source
JavaScript (Node.js) , 71 octets
Essayez-le en ligne!
la source
Ajouter ++ , 27 octets
Essayez-le en ligne!
Merci à Zgarb pour sa réponse APL
L'élément clé de ce défi consiste à mettre en œuvre une commande de produit externe. Malheureusement, Add ++ n’a pas de fonction intégrée pour le faire, pas plus qu’il n’a aucun moyen de définir des fonctions qui prennent d’autres fonctions en tant qu’arguments. Cependant, nous pouvons toujours faire une fonction généralisée de produit extérieur. Comme la seule manière d'accéder à une fonction dans une autre fonction est de référencer une fonction existante, définie par l'utilisateur ou intégrée, nous devons créer un «intégré» qui référence une telle fonction.
Une fonction "table" généralisée ressemblerait à ceci:
Essayez-le en ligne!
où
func
est une fonction dyadique qui contient notre opérande. Vous pouvez voir de légères similitudes de cette structure dans la soumission originale, au début de la fonction w , mais ici, nous voulons avant tout une fonction de produit externe monadique - une fonction de produit externe qui prend le même argument des deux côtés.La fonction de table générale tire parti de la façon dont le très
€
rapide approche les fonctions dyadiques. Si la pile ressemble àQuand
€{func}
est rencontré, le€
pope
, lie cela comme l'argument de gauche à la dyade, et mappe cette fonction partielle sura, b, c, d
. Cependant, les€
cartes rapides sur toute la pile, plutôt que sur les listes. Nous devons donc aplatir d’abord les tableaux passés en arguments.La fonction table fonctionne globalement comme ceci
Cependant, nous pouvons raccourcir beaucoup cela car nous avons besoin que notre table externe soit monadique et que nous n’ayons qu’à s’appliquer à l’argument passé. La
A
commande pousse chaque argument individuellement dans la pile, évitant ainsi toute manipulation inutile de la pile. En bref, si notre argument est le tableau[a b c d]
, nous devons transformer la pile enLa valeur supérieure est, bien sûr, le argument.You peut - être remarqué l'exemple général qui
bU
est le déballer commande -à- dire qu'il Splats le tableau supérieur à la pile. Donc, pour faire la configuration ci-dessus, nous pouvons utiliser le codeEssayez-le en ligne!
Cependant, cela peut être raccourci par un octet. Comme alias pour
L,bU
, nous pouvons utiliser le~
drapeau pour splatter au préalable les arguments dans la pile, transformant ainsi notre exemple de configuration enEssayez-le en ligne!
qui est le début de la deuxième ligne du programme. Maintenant que nous avons mis en place un produit externe monadique, il ne nous reste plus qu'à implémenter le reste de l'algorithme. Une fois que la récupération du résultat de la table avec
<
(inférieur), et compter le nombre de[0 1]
et[1 0]
paires dans chaque rangée. Enfin, nous prenons le maximum de ces comptes et l’augmentons.La marche à suivre complète est la suivante:
la source