Il y a eu de nombreux défis "Do __ without _ _" auparavant, mais j'espère que c'est l'un des plus difficiles.
Le défi
Vous devez écrire un programme qui prend deux nombres naturels (nombres entiers> 0) de STDIN et imprime la somme des deux nombres dans STDOUT. Le défi est que vous devez utiliser aussi peu +
et -
signes que possible. Vous n'êtes pas autorisé à utiliser des fonctions de somme ou de négation.
Exemples
contribution
123
468
sortie
591
contribution
702
720
sortie
1422
Tie Breaker:
Si deux programmes ont le même nombre de caractères +
et -
, le gagnant est la personne avec moins de caractères /
*
(
)
=
.
,
et 0-9
.
Non autorisé: langues dans lesquelles les opérateurs standard d'addition / soustraction et d'incrémentation / décrémentation sont des symboles différents +
ou -
non autorisés. Cela signifie que les espaces blancs de la langue ne sont pas autorisés.
la source
+
ou-
...+
,-
et les personnages de départage? ... ou avez-vous besoin de changer à nouveau les règles :-)Réponses:
Perl (pas de +/-, pas de bris d'égalité, 29 caractères)
En prime, vous pouvez faire la somme de code plus de deux nombres en ajoutant plus de
x
s aus!!xx!
.Alternativement, voici deux solutions de 21 caractères avec 1 et 3 disjoncteurs respectivement
Remarque: Ces solutions utilisent la
say
fonction, disponible depuis Perl 5.10.0 avec le-E
commutateur de ligne de commande ou avecuse 5.010
. Voir l' historique des modifications de cette réponse pour les versions qui fonctionnent sur les anciennes perls.Comment fonctionne la solution sans bris d'égalité?
s!!xx!
est un opérateur de remplacement d'expression régulière , opérant par défaut sur la$_
variable, qui remplace la chaîne vide par la chaînexx
. (Généralement/
utilisé comme séparateur regexp en Perl, mais vraiment presque tout caractère peut être utilisé que j'ai choisi.!
Car il est pas départager.) Ceci est juste une façon élégante de préfixer"xx"
à$_
- ou, depuis$_
commence vide (non défini, en fait), c'est vraiment un moyen d'écrire$_ = "xx"
sans utiliser le signe égal (et avec un caractère de moins aussi).s!x!$"x<>!eg
est un autre remplacement de l' expression rationnelle, cette fois en remplaçant chaquex
dans$_
la valeur de l'expression$" x <>
. (Leg
commutateur spécifie le remplacement global,e
spécifie que le remplacement doit être évalué en tant que code Perl au lieu d'être utilisé comme chaîne littérale.)$"
Est une variable spéciale dont la valeur par défaut se trouve être un espace unique; l'utiliser au lieu d'" "
enregistrer un caractère. (Toute autre variable connue pour avoir une valeur à un caractère, comme$&
ou$/
, fonctionnerait aussi bien ici, sauf que l'utilisation$/
me coûterait un bris d'égalité.)L'
<>
opérateur d'entrée de ligne , dans un contexte scalaire, lit une ligne à partir de l'entrée standard et la renvoie. L'x
avant c'est l' opérateur de répétition de chaîne Perl , et c'est vraiment le cœur de cette solution: il retourne son opérande gauche (un seul espace) répété le nombre de fois donné par son opérande droit (la ligne que nous venons de lire en entrée).y!!!c
est juste une manière obscure d'utiliser (ab) l' opérateur de translittération pour compter les caractères dans une chaîne ($_
par défaut, encore une fois). J'aurais pu juste écriresay length
, mais la version obscurcie est plus courte d'un caractère. :)la source
code-golf
avec certaines restrictions de source?R (24 caractères)
Ce que cela fait:
scan
lit l'entrée de STDIN (ou d'un fichier)sequence
génère des séquences entières à partir de 1 et concatène les séquences. Par exemple, lessequence(c(2, 3))
résultats dans le vecteur1 2 1 2 3
length
calcule le nombre d'éléments dans le vecteur concaténéExemple 1:
Exemple 2:
la source
ré
peu tordu pour la victoire
en prime, le code compilé ne contient pas d'opération d'ajout (ne peut pas parler pour l'appel readf cependant)
la source
Python 2, 43 octets
la source
print sum(input(),input())
GolfScript
Pas de +/- ou de bris d'égalité:
Version beaucoup plus simple avec deux caractères de départage, utilisant la même astuce de concaténation de liste que d'autres personnes utilisent:
Je suppose que GolfScript n'est pas disqualifié pour avoir
)
un opérateur d'incrémentation, car je ne l'utilise pas réellement.la source
C (32 bits uniquement)
L'arithmétique des pointeurs est tout aussi bonne.
Comment correspond-il aux exigences?
* Non
+
ou-
* Non
/
,=
,.
,0
-9
* Seulement 3 paires de parenthèses, ce qui me semble minime ( dont vous avez besoin
main
,scanf
,printf
).* Un
*
(l'approche par pointeur l'exige).* Quatre
,
(pourrait sauver un en définissant des variables normales, pasac,av
)la source
C ++ 0 +/-, 3 bris d'égalité
la source
Haskell, 0 + 2
Cela utilise non
+
ou des-
caractères, et seulement deux=
de l'ensemble des caractères de départage, dont l'un est obligatoire pour la liaisonmain
. La somme se fait en concaténant des listes des longueurs appropriées.la source
EDIT Ceci a été publié AVANT que les règles ne soient modifiées pour interdire
sum
...Le langage R: pas d'appels à
+
ou-
... Et 9 personnages de départage!Exemple:
le
[1] 579
la réponse 579 ([1]
c'est de garder une trace de l'endroit où vous êtes dans le vecteur de résultat car dans R toutes les valeurs sont des vecteurs - dans ce cas de longueur 1)Notez que R a
+
opérateurs comme la plupart des langages - il se trouve qu'il en asum
aussi qui résume un tas de vecteurs.Dans ce cas,
readLines
retourne un vecteur chaîne de longueur 2. Je le force ensuite à le numérique (double) et le résume ...Juste pour montrer quelques autres fonctionnalités de R:
la source
colSums
place ... Peut-être aussi interdire les "fonctions de négation" pendant que vous y êtes ...Le langage R
Nouvelles règles, nouvelle réponse, même langue. Pas d'appels vers
+
ou-
MISE À JOUR En utilisant
scan
, il tombe à 11 caractères de départage (et 27 caractères en tout).Original: 13 personnages décisifs!
Exemple:
Cette fois, le résultat est obtenu par multiplication matricielle. La réponse est affichée sous forme de matrice 1x1.
la source
scan()
au lieu dereadlines(n=2)
Haskell, 0
+
/-
,62 briseurs d'égalité (=
)(n'utilise pas l'astuce de concaténation chaîne / liste)
la source
Javascript, 56
Merci à @JiminP sur le ~~ tip! Je vais au moins octets, donc la sauvegarde de 1 octet sur l'invite p =; en vaut toujours la peine. Je comprends votre argument sur les caractères de départage, mais pour être honnête, ne préférez-vous pas les moindres octets :-p
Version, 69
Grâce aux commentaires de @Ilmari et @JiminP, j'ai réduit de 13 octets ma solution d'origine.
À l'origine, 82
la source
concat
et la saisie des calculsalert
sont plus courtes.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
BTW, je ne savais pas queArray(n)
renvoie un tableau de longueurn
. La console Google Chrome m'a donné[]
et je pensais qu'il n'y avait rien ...p=prompt
n'est pas bon. Et,parseInt(x)
est presque équivalent à~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 caractères bris d'égalité) PS. Je pourrais l'utiliser comme entrée, mais cela me donne juste l'impression de voler.C
la source
APL (pas de +/-, pas de bris d'égalité, 8 ou 10 caractères)
Cette entrée est similaire aux autres qui concaténent les séquences générées à partir de l'entrée et trouvent la longueur ... mais c'est en APL, ce qui peut sembler déroutant même pour un petit problème comme celui-ci. J'ai utilisé Dyalog APL , qui offre une licence éducative gratuite.
Code:
De droite à gauche:
⎕
) demande l'entrée de l'utilisateur et l'évalue.¨
) applique la fonction de générateur d'index (⍳
) à chacun des éléments du tableau à sa droite./
), qui replie le tableau à l'aide de la fonction de concaténation (,
). Pour relever ce défi, l'opérateur de réduction unidimensionnel (⌿
) est utilisé, ainsi que l'opérateur de concaténation le long du premier axe (⍪
).⊃
) nous donne le contenu du tableau joint (le sac).⍴
) nous donne les longueurs des dimensions d'un tableau. Dans ce cas, nous avons un tableau unidimensionnel, nous obtenons donc le nombre d'éléments dans le tableau, ce qui est notre résultat.Si nous devons afficher explicitement le résultat, nous pouvons le faire comme ceci:
Code Python comparable, avec les symboles APL correspondants ci-dessus:
Je voudrais savoir s'il y a une version plus courte possible dans APL - une autre version plus simple je suis venu avec qui a plus de départage (bien que toujours à 8 caractères) est la suivante :
⍴(⍳⎕),⍳⎕
.la source
Je n'ai vu personne le faire à la manière de l'ingénierie électrique, alors voici mon avis (en rubis):
C'est un peu moche, mais ça fait le boulot. Les deux valeurs sont comparées au niveau du bit
AND
. S'ils n'ont pas de bits en commun, il n'y a pas de "report" dans la colonne binaire suivante, donc l'addition peut être complétée en les binaireXOR
. S'il y a un report, vous devez ajouter le report au bitXOR
. Voici un petit script rubis que j'ai utilisé pour m'assurer que ma logique numérique n'était pas trop rouillée:À votre santé!
la source
Graine ,
3904384611 octets, 0 +/-, 10 disjoncteursla source
Coquille, 52
C'est essentiellement la même réponse que j'ai donnée pour un autre problème.
la source
xargs -n1 jot | wc -l
ce qui prend la même-
réductionawk
mais je ne vois pas comment l'éviter dans lexargs
C
la source
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
C #
Ce n'est pas le plus court par un tronçon:
la source
J,
157 caractères, 1 bris d'égalité, programme incompletCeci est ma tentative J. Ce n'est pas un programme complet, car je n'ai pas encore compris comment en écrire un. Il suffit de mettre cette ligne dans un script pour obtenir la fonction
p
qui peut être utilisée pour ajouter une quantité arbitraire de nombres. C'est une monade et prend une liste de nombres à ajouter (commep 1 2 3 4
):L'idée est très simple. La fonction est écrite dans un style tacite ou inutile. Voici une définition pointue:
Lire de droite à gauche. Dans la version tacite,
@
compose les parties de la fonction. (comme un ∘ en mathématiques [(f∘g) (x) = f (g (x)])y
est le paramètre dep
.~
rend un verbe réflexif. Pour un verbem
,m~ a
est égal àa m a
.#
(copie,a#b
): Chaque élément dansa
est répliquéi
fois, oùi
est l'élément au même index que l'élément actuel dea
ofb
. Ainsi,#~
réplique un élémentn
n
fois.#
(count,#b
): compte le nombre d'éléments dansb
.Conclusion: J est génial et moins lisible que Perl (ce qui le rend encore plus génial)
Modifications
#
au lieu dei.
. Ouais! Moins de caractères que golfscript.Plus d'un programme
Celui-ci demande des entrées, mais ce n'est toujours pas un programme complet: (13 caractères, 3 disjoncteurs)
la source
Javascript (17 caractères de départage)
: P ("Obfuscated" pour réduire le nombre de caractères de départage. En interne, c'est
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)la source
C #,
Le programme fonctionne sur 1 ligne; séparés sur plusieurs lignes pour éviter le défilement horizontal.
la source
Clojure (44 caractères)
Edit: corrigé pour imprimer sur STDOUT au lieu de simplement renvoyer la somme.
la source
Scala
Code:
la source
K, 11
Même astuce de concaténation que la solution R. Lecture de droite à gauche: énumérer les deux variables d'entrée, concaténer puis compter.
la source
PowerShell ,
2742 octets, 0+-
,41 secondaireMerci à Mazzy d'avoir sauvé un
+
et 4 secondairesEssayez-le en ligne! ou Pretty Table pour 3 octets supplémentaires
-Ou- en ajoutant quatre secondaires pour économiser 19 octets:
3223 octets,10+-
,125 secondaires-9 octets grâce à mazzy
Essayez-le en ligne!
Pour chaque argument, nous poussons les
n
éléments du tableau (constitués de[n]
mais ce n'est pas important) vers le pipeline qui sont regroupés par les parenthèses puis comptés.la source
|fl
pour un joli format Essayez-le en ligne!Tonnelet (SBCS sur Keg wiki)
Fondamentalement, un port de la réponse R.
Explication
la source
05AB1E , 2
4octets, 0+
/-
Essayez-le en ligne!
Toutes mes excuses si j'ai mal compris ce défi, mais j'ai été surpris qu'il n'y ait pas de réponse 05AB1E. La réponse la plus courte dans cette langue que je pourrais trouver qui n'utilise pas + ou la fonction somme intégrée.
Explication:
-2 octets grâce à Grimy.
la source
Python 3
Sans compter sur des sommations cachées dans d'autres fonctions.
Essayez-le en ligne!
la source
ré
cette fois en utilisant des longueurs de tableau
la source