Je travaille depuis longtemps sur une fonction J, qui est supposée balayer une liste et placer des copies consécutives d'un élément dans des boîtes séparées et concaténées. Mes efforts me ont pris dans la mesure où la fonctionRésumé des structures matricielles encadrées dans J
(<;. 2) ((2&(~:/\)),1:)
qui teste les entrées de liste successives pour l'inégalité, renvoie une liste de valeurs booléennes, et coupe la liste dans des boîtes qui se terminent à chaque fois que le numéro 1 apparaît. Voici un exemple d'application:
(<;. 2) ((2&(~:/\)),1:) 1 2 3 3 3 4 1 1 1
+-+-+-----+-+-----+
|1|1|0 0 1|1|0 0 1|
+-+-+-----+-+-----+
La tâche serait terminée si je pouvais alors remplacer tous les booléens avec leurs valeurs correspondantes dans l'argument d'entrée. J'ai cherché une sorte de fonction de mystère qui me permettrait de faire quelque chose comme
final =: mysteryfunction @ (<;. 2) ((2&(~:/\)),1:)
final 1 2 3 3 3 4 1 1 1
+-+-+-----+-+-----+
|1|2|3 3 3|4|1 1 1|
+-+-+-----+-+-----+
Dans une situation idéale, il y aurait un moyen de représenter abstraitement le modèle de nidification généré par (<;. 2) ((2&(~:/\)),1:)
et l'appliquer à l'original liste d'entrée. (c'est-à-dire "Ce tableau contient le premier élément encadré en profondeur un, le deuxième élément encadré en profondeur un, les troisième, quatrième et cinquième éléments encadrés en profondeur un, ..., alors prenez cette liste sans boîte ») J'ai essayé de tromper avec ;.
, S:
, L:
, L.
et &.
pour produire ce comportement, mais je n'ai pas eu beaucoup de chance. Y a-t-il une sorte d'opérateur ou de principe qui me manque pour que cela se produise? Cela ne me surprendrait pas si je réfléchissais à toute la question, mais je suis à court d'idées.
EDIT:
À l'heure actuelle, la seule solution de travail que j'ai est celui-ci:
isduplicate =: ((2&(~:/\)),1:)
testfun =: 3 : 0
numduplicates =. #S:0 ((<;.2) isduplicate y)
distinctboxes =. <"0 (isduplicate#]) y
numduplicates # each distinctboxes
)
C'est un processus en deux étapes de génération du codage de longueur d'exécution de la liste, puis défaisant l'encodage sans se débarrasser des boîtes. Comme je le fais à l'origine dans le but de résoudre le 99 problems en tandem en utilisant J et Haskell, je me demande si je résous le problème 9 en résolvant d'abord le problème 12.
Voilà comment vous faites cela! J'ai passé des jours à fouiller dans la documentation, essayant de faire en sorte que J applique des boîtes aux éléments en utilisant une sortie booléenne. Merci pour l'aide. – estanford
De rien. En regardant par-dessus, j'ai probablement * devrait * avoir mentionné que cela utilise __dyadic__ cut ('; .2) au lieu de l'utilisation monadique de couper dans votre code d'origine. Et une dernière remarque: si nous allions chercher la brièveté du code (et aussi la clarté, imo) je l'écrirais probablement en utilisant la variante cut-1 (au lieu de cut-2), qui se scinde en 1: '(<;. 1 ~ 1,2 & (~:/\)) '- agréable et juteuse! – earl