Défi
Votre tâche pour cette question consiste à diviser un tableau d'entrée d'entiers à la deuxième occurrence de chaque entier de ce tableau.
Pas assez clair? Voici un exemple pour vous aider
Tableau d'entrée:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5]
Production:
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Explication:
Voici le tableau avec juste le deuxième élément mis en évidence en gras:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5 ]
Maintenant, nous plaçons les blocs de tableau de fractionnement autour de ces secondes occurrences en gras:
[2 1] 1 [] 2 [3 2 2 4 5 6 7] 3 [] 7 [0] 5 []
et envelopper ces tableaux fractionnés dans un tableau pour obtenir la finale
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Notez que lorsque des secondes occurrences adjacentes se produisent, il y aura des tableaux vides.
Règles
Comme d'habitude, vous devez écrire un programme complet ou une fonction prenant le tableau d'entrée via STDIN, ARGV ou un argument de fonction.
Contribution
L'entrée se compose de n'importe quel format de tableau (ou de type tableau) d'entiers.
Par exemple, l'un des éléments suivants serait acceptable:
2 1 1 1 4 5 6
[2 1 1 1 4 5 6]
[2, 1, 1, 1, 4, 5, 6]
Production
Lors de la sortie vers STDOUT, votre tableau peut également être imprimé dans n'importe quel format de tableau (imbriqué) pratique, par exemple l'un des
[[2 1] [1 4 5 6]]
[[2, 1], [1, 4, 5, 6]]
{{2, 1}, {1, 4, 5, 6}}
(Ce sera généralement la représentation sous forme de chaîne native des tableaux dans votre langue.)
Notez également que les tableaux vides de fin doivent être imprimés en tant que partie du tableau.
Notation
C'est le code-golf donc le code le plus court en octets gagne!
la source
""
le tableau vide? Cela sent le favoritisme envers une langue de golf spécifique.2 1, 1 4 5 6
?Réponses:
APL 25
Exemple:
Le vieux:
C'est une belle question pour l'opérateur clé (⌸) qui a été introduit avec Dyalog APL v14. Il prend la fonction d'argument de gauche ({1 ↑ 1 ↓ ⍵}) et lui donne pour chaque argument unique, les indices dans le vecteur de cet argument. Ici, je prends le deuxième indice, puis je vérifie lequel des indices est présent dans cette liste ((⍳⍴⍵) ∊) et utilise le booléen résultant pour diviser le vecteur d'origine.
Peut être essayé en ligne ici:
http://tryapl.org
la source
1↓¨{1,∨⌿<\2=+\∘.=⍨⍵}⊂1∘,
APL (Dyalog 14) (31)
Il s'agit d'une fonction qui prend un tableau et renvoie un tableau imbriqué.
Tester:
Explication:
0,⍵
: Ajoutez un0
à l'avant de⍵
, pour un traitement plus facile. (Cela ne compte pas comme une occurrence.)(
...)⊂
: divise le tableau en fonction du masque de bits donné. Un nouveau groupe commence à chacun1
dans le masque de bits.+\∘.=⍨⍵
: pour chaque valeur dans (l'original)⍵
, recherchez toutes les occurrences dans⍵
. Ensuite, faites une somme cumulée pour chaque valeur, donnant une matrice carrée montrant pour chaque position⍵
le nombre de chaque valeur qui s'est déjà produite.↓
: Divise la matrice par ses lignes, donnant pour chaque valeur un tableau indiquant le nombre de fois où elle s'est produite pour chaque position.2⍳⍨¨
: Dans chacun de ces tableaux, recherchez l'index du premier2
.(⍳⍴⍵)∊
: Pour chaque index possible dans⍵
, voir s'il est contenu dans la liste des index des secondes occurrences. (Ceux-ci commencent chaque groupe, sauf le premier.)1,
: Ajoutez un1
à l'avant, marquant le début du premier groupe.1↓¨
: Supprimez le premier élément de chaque groupe. (Ce sont l'ajout0
et la deuxième occurrence de chaque valeur.)la source
J,
2824 carUn merci spécial à randomra .
Cela fonctionne comme ça. Sur tous les préfixes (
\
) du tableau d'entrée, nous regardons combien d'+/@
éléments ( ) du préfixe sont égaux au dernier élément (={:
) de ce préfixe. Lorsque ce nombre est 2, nous savons que c'est la deuxième occurrence de cet élément dans le tableau, nous avons donc divisé le tableau à l'aide de<;._1
.Old chose en utilisant des tours de tri:
(1&,<;._1~1,1=i.~(]-{)/:@/:)
.la source
(1&,<;._1~1,2=+/@(={:)\)
est de 4 octets plus court et beaucoup plus simple. (/:@/:
c'est un bon truc cependant.)Mathematica,
585149 octetsCeci est une fonction sans nom qui prend une liste comme
et renvoie une liste imbriquée comme
Comment ça fonctionne
Cela utilise une magie assez obscure avec
SplitBy
.Je garde une trace des occurrences de chaque nombre dans une fonction
f
. Dans Mathematica, vous pouvez définir la valeur d'une fonction pour chaque entrée séparément, et vous n'avez pas besoin de spécifier la valeur pour toutes les entrées possibles (c'est plus comme une table de hachage sur les stéroïdes).Je commence donc par initialiser
f
à 0 pour les valeurs présentes dans l'entrée avec(f@#=0;#)&/@
.Prend maintenant
SplitBy
une liste et une fonction et "divise la liste en sous-listes constituées d'exécutions d'éléments successifs qui donnent la même valeur lorsqu'ellef
est appliquée" (notez queSplitBy
cela ne supprime aucun élément). Mais la capture (non documentée) est, quif
est appelée deux fois sur chaque élément - lors de la comparaison avec son prédécesseur et son successeur. Donc, si nous le faisonsnous n'obtenons pas seulement chaque numéro une fois, mais à la place, cela imprime
soit 6 appels pour 3 comparaisons.
Nous pouvons diviser la liste avant chaque seconde occurrence, si nous écrivons une fonction qui retourne toujours
False
mais revientTrue
quand une deuxième occurrence est comparée à l'élément précédent. Il s'agit du troisième contrôle sur cet élément (deux contrôles sur la première occurrence, plus le premier contrôle sur la deuxième occurrence). Par conséquent, nous utilisons++f[#]==3&
. La bonne chose est que cela revient déjà àFalse
nouveau lors de la deuxième vérification de la deuxième occurrence, de sorte que je peux revenirTrue
pour des secondes occurrences consécutives, mais toujours réparties entre elles . De même, cela ne se divisera pas après les secondes occurrences, car la fonction revient déjà àFalse
nouveau lors de la deuxième vérification.Maintenant, la question veut que nous supprimions également ces secondes occurrences, donc nous supprimons le premier élément de chaque liste, avec
Rest/@
. Mais bien sûr, nous ne voulons pas supprimer le tout premier élément dans l'entrée, donc nous commençons en fait, en ajoutant un élémenta
au début de la liste avec{a}~Join~#
.a
est une variable non définie, que Mathematica considère comme une inconnue, de sorte qu'elle n'affectera aucune autre valeur def
. Cela garantit également que le premier élément réel dans l'entrée obtient ses deux contrôles comme tous les autres éléments.la source
Boole
.Python, 148 octets
Solution assez horrible. Il doit y avoir un meilleur moyen ...
Appelez avec
s([2, 1, 1, 1, 4, 5, 6])
.Version non golfée
la source
Haskell,
11511310688cela stocke le montant que chaque élément est apparu en fonction des éléments à leur montant respectif, ce qui est une astuce intéressante.
cela fonctionne en utilisant
%
, une fonction qui a donné une fonction f et un argumentx
renvoie une nouvelle fonction qui retournef
appliquée à son argument s'il est différent dex
, et1 + f x
sinon.par exemple,
3 % const 0
est une fonction qui retourne 0 pour chaque argument sauf 3, pour laquelle elle retourne 1. update: a fusionné lefoldl
pour obtenir un programme beaucoup plus petit.la source
Démo Ruby 66
Ruby stabby lambda qui prend un tableau en paramètre et renvoie un tableau de tableaux.
la source
Python: 100 octets
Solution simple. Je parcourt la liste, compte le nombre de fois qu'un personnage est apparu avant et ajoute la partie depuis la dernière vérification à la liste de sortie.
la source
Rubis, 66
Explication
e
est un hachage d'occurrence compte pour chaque élément,r
est un tableau dans lequel le résultat est stocké.1
.2
, nous devons nous séparer. Ajoutez un videArray
au résultat.Array
résultat.la source
CJam,
2524 octetsPrend l'entrée de STDIN comme
et des sorties comme
Je suis essentiellement en train d'itérer sur tous les éléments du tableau, un par un en les plaçant dans un autre tableau. Ensuite, j'obtiens le nombre de l'élément actuel dans l'autre tableau. Si c'est 2, je démarre un autre tableau à partir de cet emplacement. Ce type de démarrage de tableau aléatoire ne peut être réalisé que dans un langage basé sur la pile.
Expansion du code :
Essayez-le en ligne ici
1 octet enregistré à partir du conseil de Martin sur le chat
la source
Ruby, 64 octets
la source
Perl 5: 36
Je ne sais pas si cela est acceptable car aucun fractionnement réel ne se produit ici.
Exemple:
la source
-pa
comme deux octets supplémentaires (car cela "ne coûte" que deux octets, puisque vous pouvez l'écrire comme-pae
au lieu de-e
). Ce serait donc 38, pas 36.CJam, 28 octets
Prend des entrées sur STDIN comme
et imprime la sortie sur STDOUT comme
Notez que les chaînes vides et les tableaux vides sont la même chose dans CJam et sont affichés comme
""
par défaut ( c'est la représentation native des tableaux vides).(J'ai commencé à y travailler un peu avant la publication du défi, car nous discutions de la difficulté du défi.)
Explication
Fondamentalement, je duplique chaque élément du tableau, sauf s'il s'agit de la deuxième occurrence, auquel cas je remplace la première copie par un espace. Pour des raisons de golf, ce tableau modifié est construit à l'envers. Devient
[2 1 1 2 3 2 3]
ainsiEnsuite, je choisis chaque deuxième élément de la fin, qui est le tableau d'origine, mais avec les secondes occurrences remplacées par des espaces, c'est-à-dire
Enfin, je divise simplement le tableau sur les espaces. Voici une ventilation du code:
la source
""
est explicitement autorisé dans la première révision de la question. La révision actuelle indique "n'importe quel format pratique ... généralement une represtation de chaîne native des tableaux".Outils Unix, 100 octets
Exclut l'entrée via stdin. Il remplace simplement chaque seconde occurrence par
"] ["
. Ne fonctionne pas avec des chaînes vides,[]
donnera une chaîne vide, qui je pense est une représentation pratique d'un tableau vide :)la source
11
? sera-t-il converti1][
?APL, 42 caractères
Exemple:
Production:
Testé ici.
Si je dois produire une chaîne qui est interprétée exactement comme la bonne structure en APL ... 49 caractères
la source
1↓1
semble résoudre le problème, mais cela semble trop bizarre.Java, 223
Cela ne fonctionne que sur Oracle ou OpenJDK JRE, car j'utilise cette bizarrerie dans leur implémentation du quantificateur et de la vérification de la longueur en regard pour implémenter le regard de longueur variable.
La plupart du travail est effectué dans l'expression régulière, qui est présentée ci-dessous sous forme brute:
Avant de regarder l'expression régulière ci-dessus, examinons l'expression régulière .NET équivalente, qui est plus simple, car elle prend directement en charge la recherche de longueur variable (la recherche de .NET est très probablement effectuée par le mode de correspondance de droite à gauche) :
*\b(\d+)\b
et*
à la fin correspond à un nombre et aux espaces environnants (le cas échéant). Les vérifications liées visent à empêcher la correspondance d'un nombre partiel, car les espaces des deux côtés sont facultatifs. Il capture également le nombre pour vérifier s'il s'agit de la 2e apparition dans le tableau.(?<=(.*\b\1\b){2})
vérifie que 2 instances du nombre capturé ci-dessus peuvent être trouvées.(?<!(.*\b\1\b){3})
vérifie qu'aucune instance du nombre capturé ne peut être trouvée. Les deux conditions combinées affirment qu'il n'y a jusqu'à présent que 2 instances du nombre. Les vérifications liées sont là pour s'assurer que le nombre entier est testé.Retour à la version Java. Pour implémenter un look de longueur variable derrière, nous transformons
à
Je suis un peu en train de saluer le fait que
.
les séparateurs de lignes sont exclus, mais cela peut être corrigé facilement et je ne veux pas compliquer davantage la syntaxe.L’anticipation a toujours une longueur de 0 et le contrôle de longueur passe en raison de la mise en œuvre de
*
quantificateur.Il
^
n'est pas nécessaire de le faire fonctionner, mais il est là pour accélérer l'échec du cas défaillant. L'arrière-plan dans l'implémentation Oracle / OpenJDK se fait en reculant de la longueur minimale du modèle, puis en faisant correspondre, puis en rinçant et en répétant en incrémentant la longueur jusqu'à ce qu'une correspondance soit trouvée, ou dans le pire des cas, à la longueur maximale du modèle . Avec^
, je m'assure que la chaîne de préfixe ne correspond qu'une seule fois.Cependant, l'anticipation à l'intérieur de l'observation n'est pas limitée par la limite droite de l'observation, de sorte qu'elle peut correspondre jusqu'à la fin de la chaîne. Afin d'affirmer la frontière, je capture le reste de la chaîne dans un autre groupe de capture à l'intérieur d'un regard en avant, et je l'utilise pour limiter le règne du modèle de longueur variable.
Puisque mon motif commence déjà
.*
, je n'ai pas besoin d'en ajouter un autre.*
devant.la source
Perl 108
En action:
Nota: Les deux premières lignes ne
$Data::...
sont là que pour une présentation plus agréable et la troisième ligne@a=@b=@e=();
est là pour faire fonctionner l'outil sur plusieurs lignes.la source
R, 76
Sortie pour l'exemple: Une liste de cinq éléments, dont trois vecteurs vides. (
numeric(0)
).Soit dit en passant: le code génère un message d'avertissement qui peut être ignoré.
la source
awk 29
Cela prend un peu de liberté avec les formats d'entrée et de sortie. Le "tableau" d'entrée est vertical, un nombre par ligne. La sortie est également verticale, un nombre par ligne, avec des tirets séparant les tableaux.
Contribution:
Production:
la source
Pyth 30
32C'est ma première expérience avec Pyth. C'est la même solution que dans ma solution Python.
Vous pouvez l'essayer en ligne: Pyth Compiler / Executor
Par exemple, l'entrée
imprimera
Explication:
la source
=Y+Y...
?~Y...
Python 2, 84
La liste
l
est la sortie jusqu'à présent. Nous parcourons les éléments. Si l'actuelle est la deuxième apparition, nous commençons une nouvelle sous-liste vide; sinon, nous l'ajoutons à la dernière sous-liste. La liste des éléments vus jusqu'à présent est stockée dansp
. Curieusement, la reconstruction de la liste semble plus courte que la découpe de l'entrée.la source
Pure bash
1119481 pour seulement le fractionnement:
La deuxième ligne
declare -p c
vient de vider la variableÉchantillon:
Nota: la ligne
local b c d i
n'est requise que pour exécuter la fonction plusieurs fois.Pour la présentation la plus sexy (+26)
Rendra quelque chose comme:
la source
Scala,
122111Prendre la collection de caractères, imprimer sous forme de
[21][][3224567][][0][]
,122111:... ou prenez une collection de caractères et retournez des listes imbriquées,
135129:Je suis sûr qu'il y a des économies à réaliser, je n'ai pas trop cherché.
la source
Python 220 octets
Ce qui suit est de 220 octets, ce qui n'est pas génial par rapport à la plupart des autres mais il fonctionne assez rapidement avec des entiers plus grands!
la source
=
, le changementxlist
etresult
à des noms plus courts, et supprimer les espaces autour==
,;
et:
. Si vous avez besoin de plus d'aide, tapez simplement@NoOneIsHere
(ou n'importe quel nom d'utilisateur) et je / l'utilisateur essaiera d'aider.Java: 563 octets
notez que cela utilise Java 8, le pré-JDK8 serait plus long de quelques octets en raison de foreach.
la source
Integer.MAX_VALUE
de2147483647
? C'est la même valeur avec moins d'octets. En outre,IndexOutOfBoundsException
peut être raccourci àException