Votre défi, si vous l'acceptez, est de créer une fonction ou un programme qui génère "oui" si un nombre donné est divisible par 13 et génère "non" s'il ne l'est pas.
Règles:
- Vous n'êtes pas autorisé à utiliser le numéro 13 n'importe où.
- Aucun synonyme de sortie pour 13 non plus (comme l'utilisation de 15-2).
- Des points bonus seront attribués pour ne pas utiliser le module, un bonus supplémentaire pour ne pas utiliser la division.
Scoring:
- Votre score sera le nombre d'octets dans votre code (espaces non inclus) multiplié par votre bonus.
- Si vous n'avez pas utilisé de module, ce bonus est de 0,90; si vous n'avez pas utilisé la division, ce bonus est de 0,90.
- Si vous n'avez pas utilisé non plus, ce bonus est de 0,80.
- Plus votre score est bas, mieux c'est.
L'entrée sera toujours un entier supérieur à 0 et inférieur à 2 ^ 32.
Votre sortie doit être un simple «oui» ou «non».
Clarifications:
- L'utilisation d'une méthode détournée pour générer le chiffre 13 à utiliser est acceptable. Les synonymes arithmétiques simples comme (10 + 3) ne sont pas autorisés.
- La fonction ou le programme doit littéralement afficher "oui" ou "non" car si le nombre donné est divisible par 13.
- Comme toujours, des solutions intelligentes sont recommandées, mais pas obligatoires.
la source
function f(n){return "yes"}
. Cela retournera 'oui' pour tous les nombres qui peuvent être divisés par 13Using some roundabout method of generating the number 13 for use is acceptable.
Comment déterminez-vous ce qu'est un «rond-point suffisant»?Réponses:
Java (score
60,859,2)Score: (76 - 2 espaces blancs) caractères * 0,8 = 59,2
la source
println
->print
?ASM - 16 bits x86 sur le shell de commande WinXP
exécutable - 55 octets * 0,8 = 44
source - 288 caractères * 0,8 = 230,4
Le nombre 13 n'apparaît même pas dans le fichier .com assemblé.
Assemblez en utilisant A86.
la source
The input will always be an integer greater than 0 and less than 2^32
. Vous ne pouvez pas utiliser 16 bitsPython 3.x: 54 * 0,8 = 43,2
Ce peut être un cop-out d'avoir une chaîne de longueur 13, mais ici ça va:
Cela fonctionne en construisant une chaîne de n espaces (le choix du délimiteur est arbitraire, mais j'ai choisi l'espace pour des raisons évidentes), et en séparant les sous-chaînes de 13 espaces jusqu'à ce que vous vous retrouvez avec une chaîne contenant n% 13 espaces.
la source
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
par' '*6+' '
pour enregistrer 5 caractères - mais j'ai trouvé que les espaces ne comptaient pas du tout ...GolfScript, 32 caractères
Je voulais essayer quelque chose de différent de tout le monde, donc ma solution calcule la racine numérique de base 14 du nombre, en convertissant à plusieurs reprises le nombre en base 14 et en additionnant les chiffres jusqu'à ce que le résultat ne diminue plus. C'est essentiellement la même chose que le calcul du module 13 restant, sauf que le résultat sera compris entre 1 et 13 au lieu de 0 à 12.
Étant donné qu'il serait difficile de vérifier si la racine numérique est égale à 13 sans utiliser le nombre 13 lui-même (ou une solution de rechange boiteuse comme 12 + 1), ce que je fais en fait, c'est que j'incrémente le nombre d'entrée de un avant la boucle et décrémente le résultat par la suite. De cette façon, le résultat pour les nombres divisibles par 13 sera en fait zéro, ce qui est beaucoup plus facile à vérifier.
Voici une version commentée du programme:
Ce programme gérera en fait toutes les entrées entières non négatives, puisque GolfScript utilise l'arithmétique bignum. Bien entendu, des entrées extrêmement volumineuses peuvent consommer trop de temps et / ou de mémoire.
Le code n'utilise ni module ni division directement, bien qu'il utilise l'opérateur de conversion de base de GolfScipt, qui effectue presque certainement une division et une prise de reste en interne. Je laisse le soin à GigaWatt de décider si cela me donne droit ou non au bonus.
la source
C, 68 * 0,8 = 54,4
Après 24 réponses, personne n'a encore trouvé cet algorithme évident:
la source
JavaScript (27,9)
Version actuelle (31 caractères * 0,90 bonus = 27,9).
Démo: http://jsfiddle.net/9GQ9m/2/
Édition 1: renoncez au deuxième bonus en utilisant le module pour réduire considérablement le score et éviter la
for
boucle. Éliminez~~
et enregistrez également deux caractères (merci@copy
).Version plus ancienne (48 caractères * 0,80 bonus = 38,4)
la source
~~
entrée supposée valide; sinonprompt()<<1
ça marche aussi.BrainFuck
Score: 200 * 0,8 = 160
Lit à partir de stdin. Ce n'est probablement pas la solution la plus intelligente, mais obtenir tout ce qui fonctionne en BF est bien. C'est assez compact cependant.
la source
Scala (38 * 0,9 = 34,2)
Similaire à
0xD
(hex) ou015
(oct).La valeur ASCII de
CR
est 13.la source
Haskell, 28 * 0,8 = 22,4
la source
Python:
Par exemple
donne
la source
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
le corrige, 43 * 0.8 = 34.4C, 54,4 == 68 * .8
80 * .8la source
\r
Bonne utilisation de - je pensais que c'était seulement bon pour le support de Windows. Mais pourquoic>0
quand lec
ferait?>0
n'est pas bon. Mais au lieu de remarquer que votre fonction ne les prend pas en charge, j'ai pensé que c'était==
bien.ECMAScript 6, 25 × 0,9 = 22,5
Oui, c'est une façon ennuyeuse d'avoir 13 ans.
la source
APL ((21 - 1) × 0,8 = 16)
⎕IO
doit être défini sur 0 pour que cela fonctionne correctement dans Dyalog APL. Pour générer 13, nous prenons le plancher (⌊
) du logarithme naturel (⍟
) de 9 à la puissance de 6 (9*6
). Après cela, nous trouvons le GCD (∨
) de notre entrée (⎕
) et 13, et nous testons ensuite si cela est égal à 1. Ceci est utilisé pour indexer ([...]
) le vecteur de réponses.Si quelqu'un veut être pédant sur la mention d' octets dans la spécification de notation, le score de la version codée UTF-8 est
(29 - 1) × 0.8 = 22.4
. :)la source
C, 88
Truc de Fibonacci.
la source
Perl - 44 × 0,8 = 35,2
Compter le shebang comme un octet.
Je suis un peu en retard dans le jeu, mais je pensais partager l'algorithme, car aucun autre message à ce stade ne l'a utilisé.
Cela fonctionne sous l'observation que si n est divisible par 13 , alors ⌊ n / 10 ⌋ + n% 10 * 4 est également divisible par 13 . Les valeurs 13 , 26 et 39 se succèdent. Tous les autres multiples de 13 atteindront finalement l'une de ces valeurs en pas plus de log 10 n itérations.
Dans d'autres bases
Certes,
chop
c'est un peu une dérobade. Avec une représentation en base 10, c'est équivalent àdivmod
. Mais l'algorithme fonctionne parfaitement bien dans d'autres bases, par exemple la base 4 ou 8.Pseudo-code de style Python de l'algorithme ci-dessus (base 10):
En base 2:
En base 4:
En base 8:
etc. Toute base inférieure à 13 fonctionne aussi bien.
la source
Javascript: 59 * 0,8 = 47,2 (?)
violon :
Y compris l'amélioration de mellamokb (57 * 0,8 = 45,6):
la source
return n-c?'no':'yes'
et en omettant le deuxième point-virgule.prompt
pour l'entrée et laalert
sortie, ce qui rend le programme interactif et enregistre quelques caractères.Perl: (51-4 espaces) * 0,9 = 42,3
la source
Perl (19.8)
21 octets * .9
note: Mon tout premier programme Perl. Faiblement tapé est bon pour le golf, je suppose.
la source
en C (K&R): 47 * 0,8 = 37,6
EDIT1: bien supprimé toutes les dépendances sur les fonctions externes, ce qui précède fonctionnera tant que vous mettez cette ligne sur la 13e ligne du fichier! :) Si
__LINE__
est correct d'être remplacé par dire0xd
alors peut enregistrer 5 autres caractères (score: 33,6)la source
J - 22,4 = 28 * 0,8
Basé sur la méthode cyclique intelligente de mxmul .
Exemples:
la source
JavaScript (108 moins 0 pour les espaces blancs) => 108, x 0,8 (pas de module, pas de division) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Cette méthode utilise l'algorithme suivant: 1. Prenez le dernier chiffre, multipliez-le par quatre, ajoutez-le au reste du nombre tronqué. 2. Répétez l'étape 1 pour 99 itérations ... 3. Testez-le une fois de plus en utilisant l'étape 1, si le nombre résultant est lui-même, vous en avez trouvé un multiple de 13.
Mise à jour précédente, suppression
var
et logique inversée à l'alerte pour supprimer plus de caractères en utilisant la soustraction-faux conditionnel.Techniquement, le résultat final est que vous atteindrez finalement un nombre à deux chiffres comme 13, 26 ou 39 qui, lors de l'exécution de l'étape 1, donnera respectivement 13, 26 ou 39. Donc, tester la même itération 100 confirmera la divisibilité.
la source
Cheddar, 20 octets (non compétitif)
Le score est de 20 * 0,9 = 18
Une réponse simple.
la source
Lisp commun (71 octets * 0,8) = 56,8
Récursivité simple, vraiment.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Ungolfed:
la source
Rubis (
5048 * 0,9 = 43,2)Une façon intelligente d'utiliser
eval
la source
D 56 caractères 0,80 bonus = 44,8
cela aurait pu être une sortie avec l'utilisation de 1/13 et un double peut stocker n'importe quel nombre 32 bits exactement
edit: cela fonctionne en multipliant par 1/13 et en vérifiant la partie fractionnaire si elle est différente de 0 (en tenant compte des erreurs d'arrondi) ou en d'autres termes, il vérifie la partie fractionnaire de i / 13
la source
Python 2.7
(20-1 espace blanc) * 0,9 (sans division) = 17,1
oui / non au lieu de vrai / faux: 31 * 0,9 (pas de division) = 27,9
tire parti de python
int
pour convertir d'autres bases de chaînes en entiers de base 10. vous pouvez voir dans les deux versions qu'ils utilisent une base différente (mais la même longueur de caractère)modifier: 1 caractère enregistrer dans la version oui / non
edit2: 2 autres caractères rasés!
edit3: merci encore aux commentaires! encore plus de caractères rasés en utilisant les représentations octales intégrées de python (
015
==13
...) au lieu de la traduction de base intla source
print['no','yes'][input()%int('d',14)==0
14-1
ou26/2
. Je viens de prendre la liberté de création pour représenter 13Perl, 95 * 0,8 = 76
Les sauts de ligne ont été ajoutés pour plus de clarté. J'aurais probablement pu rendre cette réponse beaucoup plus courte, mais je pense que cette réponse représente une façon unique d'aborder le problème.
la source
Python - score 27,9
(31 caractères * 0,90) - renonce à certains bonus pour un code plus court.
ancienne version: (47 caractères * 0,80) - arnaque complète de la réponse Javascript de mellamokb, mais en Python.
ancienne version: (60 caractères * 0,80)
ancienne version: (105 caractères * 0,80)
la source
(1,10,9,12,3,4)
sauverait 1 caractère mais ne se résoudrait pas à une valeur inférieure à 13.En Q:
la source
Grammaire linéaire droite - ∞ points
Ensuite, selon la façon dont vous choisissez de «l'exécuter», il affichera «oui» ou «non».
Pas une entrée sérieuse, juste du plaisir;)
EDIT: Je devrais peut - être expliquer un peu.
UNE grammaire est un ensemble de règles (productions) qui définissent une langue . Une langue peut être considérée comme l'ensemble des chaînes possibles formées par un alphabet, qui sont conformes aux règles de sa grammaire.
Ici, l'alphabet est l'ensemble de tous les chiffres décimaux. Les règles de la grammaire sont que toutes les chaînes doivent former des entiers décimaux divisibles par 13.
Nous pouvons utiliser la grammaire ci-dessus pour tester si une chaîne appartient à notre langue.
Les règles de la grammaire contiennent des symboles terminaux (qui sont des éléments du langage) ainsi que des symboles non terminaux qui sont remplacés récursivement.
Il est plus facile d'expliquer ce qui se passe avec un exemple:
Disons par exemple que la chaîne que nous testons est 71955.
Il y a toujours un symbole de début (qui n'est pas terminal), dans le cas de la grammaire ci-dessus, c'est «S». À ce stade, nous n'avons lu aucun caractère de notre chaîne:
Maintenant, nous lisons le premier symbole de notre chaîne qui est «7», puis nous recherchons une règle dans la grammaire qui a l'un des non-terminaux de notre modèle actuel dans le côté gauche du «->» et que a notre symbole dans le côté droit du '->'. Heureusement, il y en a un (S-> 7G), nous remplaçons donc les symboles non terminaux dans notre modèle actuel par le côté droit de la nouvelle règle:
Maintenant, nous avons le «G» non terminal dans notre modèle, et le prochain symbole à lire est «1». Nous recherchons donc une règle dans notre grammaire qui commence par «G-> 1». Nous en trouvons un (G-> 1F), nous remplaçons donc le non terminal par le RHS de notre nouvelle règle:
Continuez à répéter ce processus:
Règle suivante: F-> 9D
Règle suivante: D-> 5F
Règle suivante: F-> 5S
À ce stade, nous n'avons plus de symboles dans notre chaîne, mais nous avons un autre symbole non terminal là-dedans. Nous voyons à partir de la première règle de la grammaire que nous pouvons remplacer 'S' par la chaîne vide (ε): S-> ε
Cela nous donne le bagout actuel: 71955ε qui est l'équivalent de 71955.
Nous avons lu tous les symboles de notre chaîne et le modèle ne contient aucun symbole non terminal. Ce qui signifie que la chaîne appartient à la langue et donc 71955 est en fait divisible par 13.
C'est-à-dire que le but est d'avoir pattern = string. Si vous vous retrouvez avec des symboles non terminaux, après avoir lu tous les symboles de votre chaîne, la chaîne n'appartient pas à la langue. De même, si vous avez encore plus de symboles à lire dans votre chaîne, mais qu'il n'y a pas de règles dans la grammaire vous permettant d'avancer, alors la chaîne n'appartient pas à la langue.
la source