Cela a été inspiré par une partie du problème d'équipe n ° 6 du concours ARML 2016.
Voici le défi:
Vous obtenez une "séquence générique", qui est une séquence de chiffres et un autre caractère. Une chaîne correspond à cette séquence générique par le pseudocode suivant:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Où '?' est un personnage de votre choix.
En termes de regex, imaginez juste l' '?'
être '.'
.
Le défi consiste à trouver tous les nombres carrés (l'exigence est jusqu'à 1 million) dont les représentations de chaînes décimales correspondent à cette séquence générique. Le "caractère générique" peut être n'importe quel caractère ASCII de votre choix, tant qu'il ne s'agit pas d'un chiffre, évidemment.
Par exemple, 4096
correspond à 4**6
et 4*9*
mais 4114
ne correspond pas non plus.
Contribution
L'entrée sera donnée sous la forme d'une séquence correspondant à l'expression régulière [0-9?]+
. Il peut s'agir d'une chaîne, d'un tableau de caractères ou d'un tableau d'octets de caractères en ASCII.
Production
La sortie sera une liste / ensemble / tableau de nombres que vous voulez, qui sont des carrés parfaits et correspondent à la séquence générique.
Exemples d'entrées valides:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Exemples de sorties valides:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
etc.
Caractéristiques
- Vous ne pouvez pas utiliser les fonctions intégrées pour trouver une liste de carrés dans une certaine plage
- Les échappatoires standard s'appliquent
- Vous devez être capable de gérer jusqu'à 1 000 000 (1 million)
- S'il est fourni avec l'entrée
1******
, il est correct d'imprimer[1000000]
. Il est également correct d'imprimer[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Les séquences génériques ne commenceront jamais par le caractère générique; c'est-à-dire qu'ils correspondront toujours à des chaînes de même longueur.
Cas de test
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Gagnant
Soumission la plus courte (valide) (en état de fonctionnement) avant le 14 février, départage par la première soumission gagnante.
?
le choix sera fait par le répondeur.25
une réponse valable est-elle pour***
mais pas pour*2*
?{4, "w", "w", 6}
(ou mieux encore,{4, w, w, 6}
), plutôt qu'un tableau de caractères, tel que{"4", "w", "w", "6"}
?Réponses:
05AB1E , 22 octets
Probablement beaucoup de place pour l'amélioration ici.
Tout non-chiffre est correct en tant que caractère générique.
Essayez-le en ligne!
Explication à venir après un nouveau golf.
la source
Mathematica, 44 octets
L'entrée est une liste de chiffres avec un
_
(sans guillemets) comme caractère générique. par exemple{4, _, _, 6}
Explication
Générer une liste
{1, 2, 3, ... , 1000}
Carré. (liste de tous les carrés de 1 à 1 000 000)
Divisez chaque carré en une liste de chiffres.
Trouvez ceux qui correspondent au modèle spécifié par l'entrée.
Imprimez-les.
la source
Brachylog , 23 octets
Essayez-le en ligne!
Explication
Format d'entrée différent, 13 octets
Selon ce que vous considérez comme valide, vous pouvez le faire:
Essayez-le en ligne!
qui est fondamentalement la deuxième partie de la réponse ci-dessus, avec une liste en entrée contenant des chiffres et des variables où se trouvent les caractères génériques.
Je ne considère pas cela comme valide car il n'y a que 26 noms de variables dans Brachylog (les lettres majuscules), donc cela ne fonctionnerait pas si vous aviez plus de 26 wilcards.
la source
true.
), mais je n'ai pas utilisé de langues qui le nécessitent auparavant. J'essaierai de trouver une référence pour déterminer comment je devrais marquer ceci, mais il serait logique de le noter comme 23, donc je vais en rester là.Perl 6 ,
3026 octetsMerci à @ b2gills pour -4 octets!
Utilise le point comme caractère générique, de sorte que l'entrée peut être utilisée comme expression régulière:
Essayez-le en ligne .
Une variante qui accepte l'astérisque comme caractère générique (comme suggéré par une révision précédente de la description de la tâche) serait de 42 octets:
la source
{ ... }("9*9***")
) ou l'affecter à une variable / symbole pour une utilisation ultérieure. Notez que Perl 6 est un langage distinct de Perl, donc il ne fonctionnera pas avec un interpréteur Perl.sudo apt-get install rakudo
d'obtenir un supposé interprète Perl6 ... Quand je metsperl6
une commande dans mon terminal, il démarre ce qui semble être un interprète Perl6, mais je ne sais pas comment l'utiliser. Je sais que c'est une lambda, mais je ne sais pas comment l'appeler.perl6 foo.p6
. Vous pouvez également le tester dans un shell oneliner, commeperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Rubis, 54 octets
Fonction qui prend un argument de chaîne. Essayez-le en ligne.
la source
#
fait du reste de la ligne un commentaire.Lot, 109 octets
Utilise
?
comme caractère générique. Fonctionne en créant 1000 fichiers. Le nom du fichier est le numéro carré et l'extension du fichier est le numéro carré avec un$
suffixe. Cela est dû au fait que la correspondance de motifs de Batch compte les?
s de fin comme facultatifs, ainsi1?
les deux1
et16
; la$
force donc la correspondance à être exacte. Cependant, nous ne voulons pas sortir le$
, donc nous ne faisons que sortir le nom du fichier sans extension.la source
JavaScript (ES6),
6866 octetsEDIT: J'ai mis à jour ma solution ci-dessous après avoir été inspiré par la réponse de JungHwan Min . Il est désormais compatible ES6.
Prend l'entrée au format
'1..4'
où.
est le caractère générique.Au lieu d'itérer à 1e6 et d'enracinement carré celui-ci itère à 1e3 et carrés.
Afficher l'extrait de code
JavaScript (ES7),
7169 octetsCrée un tableau de nombres de 0 à 1e6, puis le filtre par des nombres carrés et correspondant au modèle.
Il est horriblement lent car il itère toujours à 1e6.
Afficher l'extrait de code
la source
**
ça marche, parce que ça me donne un"SyntaxError: expected expression, got '*'"
.1e6
...**
opérateur n'existe pas, du moins pas avec mon système.**
. Oui c'est ES7 Je mettrai à jour le titre voici une liste des navigateurs actuellement supportés developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Perl,
424538 octetsEDIT: clarification par Alex, nous pouvons utiliser le point comme caractère générique qui supprime l'opération y //.
EDIT: solution qui utilise l'astérisque comme caractère générique et attend la séquence de caractères génériques sur STDIN
Celui-ci laisse sans aucun doute beaucoup de place à l'amélioration, c'est assez simple. L'expression générique est attendue comme argument de ligne de commande, avec le caractère générique point (quoi d'autre?).
la source
Python
3-9897 octetsNécessite une entrée comme «4..6».
la source
import re
etre.findall
; l'optimisation avec lefrom...import *
ne l'optimise pas réellement dans ce cas.1....
, il donne1 4 9
et16 25
comme réponses valides, ce qui n'est pas correct. Veuillez corriger votre programme.1......
. Il revient[]
, mais il devrait donner[1000000]
. Cela peut être corrigé à un coût de 0 octets en utilisantrange(0, 1001)
plutôt querange(0, 1000)
.k - 28 caractères
Utilise
?
comme caractère générique. Lalike
fonction utilise?
comme caractère générique, et cette fonction fait une liste des 1001 premiers carrés (à inclure dans 1M), les convertit tous en chaînes, puis vérifie où ils correspondent au modèle.la source
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Pourriez-vous fournir un lien vers une suite de tests fonctionnelle ou voir s'il y a un problème?utilitaires bash + Unix, 33 octets
Cela utilise '.' comme caractère générique.
Le programme DC imprime les nombres carrés dans une boucle infinie:
La sortie cc est dirigée vers grep, qui imprime uniquement les carrés qui correspondent au modèle requis.
Cela fonctionne lorsque je l'exécute sur un système Linux ou OS X réel (mais cela ne fonctionne pas sur TIO, probablement parce que le programme dc essaie de récurer pour toujours, et je soupçonne que TIO manque d'espace sur la pile pour la récursivité et / ou a un problème avec le tuyau sans fin).
la source
dc
commande sans fin .--line-buffered
de chaque côté du^$1$
, mais cela ne fonctionne pas dans les deux cas.sed s/./0/g<<<$1
| grep ^ $ 1 $ Ceci utilise la longueur du modèle pour limiter les nombres testés (les modèles à 4 caractères ne vérifient que jusqu'à 9 999, etc.). Voici un lien TIO: tio.run/nexus/…grep
. Cependant, comme ce n'est pas actuellement la solution la plus courte, je la garderai à 33 octets pour la notation. Il semble fonctionner pour toutes les entrées, donc bon travail!