Tous les carrés qui correspondent à une séquence générique [fermé]

9

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, 4096correspond à 4**6et 4*9*mais 4114ne 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.

HyperNeutrino
la source
1
Je pense qu'un bon début pour rendre cela plus clair serait de préciser que ?le choix sera fait par le répondeur.
FryAmTheEggman
2
Pourquoi 25une réponse valable est-elle pour ***mais pas pour *2*?
Neil
3
Je pense que ce serait plus propre si les nombres n'avaient jamais de zéros en tête, donc seulement des séquences assorties de leur longueur.
xnor
@Neil Ce serait un problème avec ma propre solution. Je prendrai la suggestion de xnor.
HyperNeutrino
L'entrée peut-elle être un tableau d'entiers à un chiffre et le caractère spécial, tel que {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"}?
Greg Martin

Réponses:

0

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.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

Essayez-le en ligne!

Explication à venir après un nouveau golf.

Emigna
la source
Cela semble fonctionner pour toutes les entrées. Bon travail.
HyperNeutrino
1

Mathematica, 44 octets

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

L'entrée est une liste de chiffres avec un _(sans guillemets) comme caractère générique. par exemple{4, _, _, 6}

Explication

Range@1*^3

Générer une liste {1, 2, 3, ... , 1000}

... ^2

Carré. (liste de tous les carrés de 1 à 1 000 000)

IntegerDigits[ ... ]

Divisez chaque carré en une liste de chiffres.

... ~Cases~#

Trouvez ceux qui correspondent au modèle spécifié par l'entrée.

Print@@@ ...

Imprimez-les.

JungHwan Min
la source
Cela semble fonctionner pour tous les cas de test. Bon travail.
HyperNeutrino
1

Brachylog , 23 octets

@e:{@$|,}a#0:{c.~^#I,}f

Essayez-le en ligne!

Explication

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

Format d'entrée différent, 13 octets

Selon ce que vous considérez comme valide, vous pouvez le faire:

#0:{c.~^#I,}f

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.

Fatalize
la source
Cela semble fonctionner pour toutes les entrées. Bon travail. Cependant, je considérerais cela comme 24 octets car un argument de 1 octet est requis. Je ne sais pas comment cela pourrait fonctionner.
HyperNeutrino
1
@AlexL. L'argument n'est là que pour indiquer le nom de la variable de sortie (vous pouvez utiliser une autre lettre majuscule si vous le souhaitez). Ceci est similaire aux réponses dans Prolog / languages ​​avec des fonctions où le prédicat / fonction est nommé mais vous ne comptez pas réellement les octets que vous utilisez lorsque vous l'appelez.
Fatalize
D'accord. Je ne sais pas si on devrait le marquer comme 24 car l'argument est nécessaire (sinon il revient juste 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à.
HyperNeutrino
1

Perl 6 , 30 26 octets

Merci à @ b2gills pour -4 octets!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

Utilise le point comme caractère générique, de sorte que l'entrée peut être utilisée comme expression régulière:

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

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:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}
smls
la source
J'ai reformulé les règles et vous pouvez choisir n'importe quel caractère générique. Je note cela comme 38 octets.
HyperNeutrino
Hum, comment utilisez-vous cela? Je ne sais rien de Perl.
HyperNeutrino
@AlexL .: Merci, j'ai mis à jour la réponse (et ajouté une explication aussi). C'est un lambda; vous pouvez l'appeler directement (par exemple { ... }("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.
smls
J'avais l'habitude sudo apt-get install rakudod'obtenir un supposé interprète Perl6 ... Quand je mets perl6une 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.
HyperNeutrino
@AlexL .: J'ai ajouté un lien "Essayez-le en ligne" qui le montre comme un script complet que vous pouvez exécuter perl6 foo.p6. Vous pouvez également le tester dans un shell oneliner, commeperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls
1

Rubis, 54 octets

Fonction qui prend un argument de chaîne. Essayez-le en ligne.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}
Encre de valeur
la source
Vous pouvez enregistrer un octet en utilisant i * i au lieu de i ** 2
GB
Cela ne semble pas fonctionner car le second #fait du reste de la ligne un commentaire.
HyperNeutrino
@AlexL Oh, ça marche bien. repl.it/FJCV
Value Ink
ohhhh ok je ne savais pas comment tester Ruby. Mes excuses. Cela semble fonctionner pour toutes les entrées. Bon travail!
HyperNeutrino
0

Lot, 109 octets

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

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, ainsi 1?les deux 1et 16; 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.

Neil
la source
0

JavaScript (ES6), 68 66 octets

EDIT: 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'.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.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

JavaScript (ES7), 71 69 octets

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

Cré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.

George Reith
la source
Je ne pense pas que **ça marche, parce que ça me donne un "SyntaxError: expected expression, got '*'".
HyperNeutrino
@AlexL. Les règles semblent avoir changé. Les règles précédentes suggéraient que je pouvais choisir le caractère générique.
George Reith
Il vous suffit de prendre en charge jusqu'à 1e6...
HyperNeutrino
De plus, j'ai changé les règles en arrière; le problème n'est pas avec les règles, c'est parce que l' **opérateur n'existe pas, du moins pas avec mon système.
HyperNeutrino
@AlexL. Ah désolé, je pensais que vous vouliez dire l'entrée **. 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/…
George Reith
0

Perl, 42 45 38 octets

EDIT: clarification par Alex, nous pouvons utiliser le point comme caractère générique qui supprime l'opération y //.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

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

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

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?).

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"
daniel
la source
La question précise que les caractères génériques sont donnés sous forme d'astérisques. Une révision antérieure de la question a-t-elle permis de choisir votre propre caractère générique?
smls
1
@smls: La question spécifie toujours choisir votre propre caractère générique bien qu'il ne soit pas dans la section des règles: le caractère utilisé comme caractère générique n'a pas nécessairement besoin d'être un astérisque, il peut s'agir de n'importe quel caractère ASCII de votre choix, tant qu'il n'est pas un chiffre, évidemment.
Emigna
Oui, je suis confus par ça. Plus tard, il indique clairement que le caractère générique doit être un astérisque. Je suppose que la définition avec l'expression régulière est en tête. Je réviserai ma solution.
daniel
1
Hm en fait, la phrase citée par @Emigna est assez claire que nous pouvons choisir notre propre caractère générique, n'est-ce pas?
smls
Pour clarifier, le caractère générique peut être ce que vous voulez. J'ai accidentellement bousillé les règles en reformulant l'explication.
HyperNeutrino
0

Python 3-98 97 octets

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

Nécessite une entrée comme «4..6».

Carra
la source
Vous pouvez enregistrer 3 octets en utilisant import reet re.findall; l'optimisation avec le from...import *ne l'optimise pas réellement dans ce cas.
HyperNeutrino
Fourni en entrée 1...., il donne 1 4 9et 16 25comme réponses valides, ce qui n'est pas correct. Veuillez corriger votre programme.
HyperNeutrino
Fixez le cas en vous joignant à "\ n".
Carra
Ça ne marche pas 1....... Il revient [], mais il devrait donner [1000000]. Cela peut être corrigé à un coût de 0 octets en utilisant range(0, 1001)plutôt que range(0, 1000).
HyperNeutrino
Bon point, je viens de vérifier tous les cas de test de la description :)
Carra
0

k - 28 caractères

{s(&:)($:s:s*s:!1001)like x}

Utilise ?comme caractère générique. La likefonction 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.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196
C. Quilley
la source
Je reçois cette erreur pour elle: 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?
HyperNeutrino
@AlexL. Cela fonctionne pour moi en mode k de kdb +
C. Quilley
Hmm. Je vais essayer de le tester avec différents interprètes.
HyperNeutrino
0

utilitaires bash + Unix, 33 octets

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

Cela utilise '.' comme caractère générique.

Le programme DC imprime les nombres carrés dans une boucle infinie:

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

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).

Mitchell Spector
la source
J'exécute cela avec Linux Mint 17.3 Rosa, et cela ne se termine pas. Je pense que le problème est avec la dccommande sans fin .
HyperNeutrino
Je soupçonne que c'est en fait la mise en mémoire tampon qui cause le problème. Je n'ai pas cette version de Linux, mais vous pouvez essayer de remplacer grep par grep --line-buffered (pour faire en sorte que chaque ligne soit imprimée au fur et à mesure). [Bien sûr, cela ajoute un certain nombre d'octets.]
Mitchell Spector
J'ai ajouté l'argument grep, mais cela ne fait aucune différence. J'ai essayé de mettre le --line-bufferedde chaque côté du ^$1$, mais cela ne fonctionne pas dans les deux cas.
HyperNeutrino
@ AlexL.Merci d'avoir essayé. Je ne sais pas si la différence est dans le noyau ou dans la version bash que j'utilise. Je l'ai fait fonctionner dans TIO en forçant la fin de l'entrée de grep en utilisant head, comme suit: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1 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/…
Mitchell Spector
Merci pour la réparation. Je ne pense pas que la solution actuelle fonctionnerait réellement (même si je n'ai pas beaucoup de connaissances sur bash), car il semble qu'elle doive calculer toutes les valeurs avant de les alimenter 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!
HyperNeutrino