Considérez un tableau d'entiers:
[1, 0, 9, 1, 3, 8]
Il existe de nombreuses façons de partitionner cette liste en sous-listes consécutives. En voici trois:
A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]
Nous appellerons une partition Y et affinerons une autre partition X si X peut être obtenu à partir de Y en réunissant certaines de ses sous-listes.
Il en B
est de même pour le raffinement A
: si nous joignons les deux premières et les deux dernières sous-listes, nous obtenons A
. Mais ce C
n'est pas un raffinement de A
: il faudrait diviser le 9
et le 1
pour s'en remettre A
. De plus, toute partition est trivialement un raffinement d'elle-même.
Notez que nous ne sommes pas autorisés à réorganiser les sous-listes ou les éléments à tout moment.
Le défi
Étant donné deux partitions (listes de listes d'entiers) X
et Y
, déterminer s'il Y
s'agit d'un raffinement de X
.
Vous pouvez supposer que les partitions ne contiendront que des entiers de 0
à 9
, inclus. Vous ne devez pas supposer cela X
et ce Y
sont des partitions de la même liste (si elles ne le sont pas, elles ne sont pas non plus des raffinements les unes des autres). X
et / ou Y
peut être vide mais ne contiendra jamais de sous-listes vides.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
L'entrée peut être prise dans n'importe quel format de chaîne ou de liste. Étant donné que les éléments ne seront que des entiers à un chiffre, vous pouvez choisir d'omettre un délimiteur dans les sous-listes, mais assurez-vous que les 0
s de tête sont possibles. Vous pouvez choisir de prendre X
et Y
dans l'ordre inverse.
La sortie doit être vraie si Y
c'est un raffinement X
et fausse sinon.
Votre code doit être capable de résoudre chacun des cas de test ci-dessous en 1 seconde sur une machine de bureau raisonnable. (Il s'agit simplement d'une vérification d'esprit pour éviter de simples solutions de force brute.)
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Cas de test
Chaque cas de test est sur sa propre ligne, écrit comme X Y
. J'utilise la notation de tableau de style GolfScript / CJam pour économiser de l'espace horizontal:
Vérité:
[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Faux:
[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Défis liés
la source
[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]
ou[["109" "138"] ["1" "09" "13" "8"]]
serait un format d'entrée acceptable?Réponses:
CJam,
13109 octetsEssayez-le en ligne dans l' interpréteur CJam .
Merci à @ MartinBüttner d'avoir suggéré le format d'entrée ingénieux de @ edc65 .
Merci à @ jimmy23013 pour l'amélioration du format d'entrée et le démarrage de 3 octets supplémentaires.
E / S
Contribution
Les sous-listes sont séparées les
;
unes des autres par,
:Production
Comment ça fonctionne
Pour les chaînes de longueur différente,
.-
laissera des caractères dans le tableau, qui ne peuvent pas être égaux aux entiers 0 ou 15.la source
;
comme séparateur ...ll.m27m0-!
.,
et;
sont tous deux une syntaxe de tableau commune (et aucune d'entre elles n'est utilisée par CJam). Merci!Pyth, 19 octets
Essayez-le en ligne: démonstration ou test de harnais
J'utilise le format de liste / tuple de Pyth comme entrée. Remplacez simplement les espaces des cas de test par des virgules.
Explication:
Étant donné que le pseudo-code est toujours un peu déroutant, je vais démontrer l'algorithme en utilisant un exemple d'entrée.
La
.u+NYdY
pièce calcule toutes les sous-listes continues, qui contiennent le premier élément.B
est un raffinement deA
, si chaque sous-liste continue deA
est également une sous-liste continue deB
(il n'y a qu'une seule exception).Je vérifie donc simplement si l'ensemble des sous-listes continues de
A
est un sous-ensemble de l'ensemble des sous-listes continues deB
(gF_m.u+NYdYQ
).La seule exception est, si la première liste d'entrée contient moins d'éléments que la deuxième liste d'entrée. Par exemple
<Fm.u+YdYQ
, reviendraitTrue
pour l'entrée[[1]],[[1],[2]]
.Par conséquent, je vérifie également si les listes jointes sont également égales
&...qFsMQ
.la source
JavaScript ( ES6 ), 67
70Modifier 3 octets enregistrés thx @apsillers
Exécutez l'extrait ci-dessous dans Firefox pour tester
la source
OK
etKO
.C, 69
75Une fonction avec 2 paramètres de chaîne, retournant 0 ou 1.
Format des paramètres: sous-liste séparée par des espaces (''), liste des éléments séparés par des virgules.
Exemple:
"1,0,9 1,3,8"
"1,0 9,1,3,8"
Moins golfé
Test Ideone (obsolète)
la source
Haskell, 76 octets
Renvoie
True
ouFalse
. Exemple d'utilisation:[[1,0,9],[1,3,8]] # [[1,0],[9]]
->False
.Approche récursive simple: si les premiers éléments correspondent, continuez avec les queues, sinon recommencez mais concaténez les deux éléments en tête de la deuxième liste. Les cas de base sont: les deux listes vides ->
True
; les deux listes avec un seul élément -> les comparer; une seule liste vide ->False
.la source
CJam, 19 octets
Essayez-le en ligne.
E / S
Contribution
Production
Idée
Chaque partition peut être identifiée de manière unique en observant les deux propriétés suivantes:
La liste s'est formée en concaténant toutes les sous-listes.
Les "points de coupure", y compris les extrêmes de la liste.
Nous pouvons combiner les deux critères en un seul en remplaçant chaque point de coupe par la sous-liste des éléments du point de coupe à la fin de la liste.
Pour vérifier qu'une partition donnée est plus fine qu'une autre, il suffit de vérifier si la partition la plus grossière, représentée comme ci-dessus, est un sous-ensemble de la plus fine et que les plus grandes listes des deux partitions correspondent.
Code
Pour la forme d'entrée de l'exemple d'E / S, la pile contient
avant d'exécuter
-!
.Notez que le premier élément de chaque tableau a un espace de fin. Cela garantit que nous comparons la liste complète de la première entrée avec la liste complète de la seconde.
la source
CJam, 24 octets
Algorithme
Ici, nous utilisons simplement un algorithme gourmand pour voir si les premières
N
sous-listes de la deuxième liste peuvent être fusionnées pour former la première sous-liste de la première liste. Une foisN
trouvé, nous supprimons le premierN
sous-listes de la deuxième liste et la première sous-liste de la première liste et répétons le processus.Idéalement, si la deuxième liste était un raffinement de la première, nous devrions nous retrouver avec 2 listes vides sur la pile. Nous vérifions simplement cela et imprimons
1
si tel est le cas. Dans toute autre combinaison, après avoir entièrement itéré les sous-listes de la deuxième liste, nous ne nous retrouverons pas avec 2 listes vides. Ainsi, un0
sera imprimé pour de tels cas.Expansion du code
Essayez-le en ligne ici ou exécutez la suite de tests complète ici
la source
C,
120114 bytesJe n'ai pas beaucoup joué au golf récemment, alors j'ai pensé essayer celui-ci.
Nous définissons une fonction
R(char* s, char* t)
qui retourne1
sit
est une partition raffinée des
, et0
sinon.s
ett
devraient être dans le format[DDDD...][DDDD...]...
où chaqueD
est un autre élément à un chiffre.Code de test:
Ce qui précède imprime les éléments suivants:
Cela semble fonctionner, au moins.
la source
Haskell,
525053 octetsComplètement différent de mon autre solution . Utilise le même format d'entrée intelligent que la réponse de @ edc65 , c'est-à-dire que les éléments sont séparés par
,
et les listes avec.
Exemple d'utilisation:
"1,0,9,1,3,8" # "1,0,9 1,3,8"
->True
.Le second paramètre est un raffinement du premier, s'ils ont des éléments égaux à chaque position ou si le premier l'est
,
. Je dois ajouter un jeton de fin unique (->..
) aux deux paramètres, carzipWith
tronque le paramètre le plus long et, par exemple, le"1,2,3" # "1,2"
serait égalementTrue
.la source
(\a b->a==b||a>b)
est juste(>=)
."."
au lieu de".."
travailler aussi?"2"#"1"
car les fonctions vérifient uniquement si les valeurs sont plus grandes, pas égales"."
ne fonctionnera pas, car il donnerait un faux positif pour"2,1" # "2"
lequel serait d'abord étendu à"2,1." # "2."
puis tronqué parzipWith
à"2," # "2."
. Une virgule dans la première chaîne correspond à tout.Mathematica, 65 octets
la source
Les mathématiques avec des expressions régulières sont amusantes!
ES6 Javascript, 53 caractères
Javascript vintage, 70 caractères
Utilise le même format d'entrée que la réponse d'edc65 .
Démo complète comprenant tous les cas de test ici.
la source
Mathematica, 55 octets
Cela définit une fonction sans nom, prenant les deux partitions dans une seule liste , dans l'ordre inverse (c'est-à-dire
Y
première,X
seconde).Explication
Cela vérifie que les deux partitions sont bien des partitions de la même liste.
C'est une forme golfique de mon approche dans cette question sur Mathematica.SE , qui a inspiré ce défi. Fondamentalement, une partition est définie comme un certain nombre d'indices dans lesquels des séparations sont insérées, ce qui vérifie que toutes les positions de fractionnement dans
X
apparaissent également dansY
accumulant les longueurs des sous-listes.la source
Python 2,
6851 octetsMerci à xnor pour des économies d'octets considérables!
Fonction anonyme qui prend deux chaînes de la forme
"1,0,9 1,3,8"
(tirée de la réponse C d' edc65 ) et retourneTrue
ouFalse
. Nouvelle version avecmap(None)
ne fonctionne plus dans Python 3.Suite de tests:
Solution précédente de 92 octets qui prend en entrée
"109 138"
:la source
None
mais l'autre index a un numéro, cari==j or"0">i>j
ne peut pas tenir.i==','
. Cela vous permet de combiner les tests commei in[',',j]
(nous ne pouvons pas le fairei in ','+j
) car celaj
pourrait l'êtreNone
.b
a un numéro à cet endroit?" ... oubliant qu'avec ce format d'entrée, ce n'est pas possible.