Vous devez prendre 2 entrées de chaîne et produire la somme de ces deux chaînes sans les convertir en int ou en utilisant un type de données numérique.
ex.
string one = "123";
string two = "456";
string sum = "579";
Supposons que les chaînes ne dépassent pas 10 chiffres.
C'est le golf de code et la réponse la plus courte dans les victoires de caractères. Une modification de la réponse en C # me fera sourire :).
Edit: la conversion en int peut être définie comme n'importe quoi de cette nature
Int.TryParse
, (int)
, Convert.ToInt
Etc.
code-golf
string
arithmetic
CSharper
la source
la source
Réponses:
80836 Assembly (
5753 octets)Cela ajoute, chiffre par chiffre, de droite à gauche, sans convertir les chiffres ascii
'0'-'9'
en nombres entiers0-9
, et reporter si nécessaire. Le bytecode est le code d'une fonction, qui peut être appelée en C (voir ci-dessous).Le bytecode ci-dessus a été écrit à la main, à partir de l'assemblage suivant (style NASM, commenté):
Pour essayer ceci en C (gcc, linux, processeur Intel):
la source
Rubis,
10971Ringard. Si vous ne pouvez pas amener Mohammad à la montagne ...
Algorithme:
Changelog
71 plus court sous forme de tableau.
85 Suppression de la déclaration de méthode et consolidation des appels à
n.to_s
92 ont appliqué quelques conseils
101 enregistrer un char
102 utiliser x pour incrémenter
109 commit initial
la source
succ
ouprev
.... mais ce n'est même pas amusant pour le golf.sed, 359 octets (sans le formatage de fantaisie)
Je ne sais toujours pas s'il s'agit d'un dup d' Add sans addition (ou l'un des 4 opérateurs arithmétiques de base) . En attendant, permettez-moi de poster ma réponse pour cette question. Ça ne va pas gagner de golf, mais c'est un début, et je pense qu'il répond facilement à la spécification:
L'entrée provient de STDIN sous la forme "x y". Cela est d'abord transformé en "x: 0 :: y:". Ensuite, nous incrémentons tous les nombres qui viennent après les caractères ":", jusqu'à ce que nous obtenions "x: x: :( x + y):". Ensuite, nous revenons finalement (x + y).
Production
Notez que cela ne fonctionne que pour les nombres naturels. Cependant (en théorie du moins), cela fonctionne pour des entiers arbitrairement grands. Parce que nous effectuons x opérations d'incrémentation sur y, la commande peut faire une grande différence dans la vitesse: x <y sera plus rapide que x> y.
la source
y
Est donc converti eny+1
utilisant simplement regex? et aucun ajout réel? Agréable!Rubis -
485432265Cela semble plus dans l'esprit de ce que vous cherchiez dans la question.
Il résout fondamentalement le problème de la façon dont un humain le ferait sur papier - en «mémorisant» tous les résultats d'addition à un chiffre, en ajoutant chaque colonne et en comprenant comment «porter celui» si nécessaire.
Cela utilise également un "type de données numériques" (variable i), ce qui est interdit par la question, mais ce n'est que pour l'indexation des chaînes. Je vais essayer de supprimer cela et de modifier ma réponse.
Assez peu golfé:
EDIT: Utilisé quelques idées des commentaires pour générer la table de mappage "mémorisée" au lieu de simplement la coder en dur.
la source
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
est mieux quezip
/#{x+y}/
est plus court queRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
vous donne votre tableau regex.i
) ... il doit y avoir un autre moyen de contourner cela ... peut-être simplement utilisereach_cons(10)
comme énumérateur et ànext
travers l'ensemble?CJam,
95 92 80 72 7044 caractèresce qui se traduit par
Cela peut certainement être beaucoup joué au golf. Je ne sais vraiment pas si mon approche est optimale ou pas encore.
UPDATE - Inline la création de la matrice de somme pour économiser les octets. Pour cette raison, le programme s'exécute maintenant 10 fois plus lentement, mais toujours un temps constant pour tout type d'entrée.
Essayez-le en ligne ici
Lit la ligne contenant deux nombres de STDIN sous forme de chaîne et affiche un tableau de caractères qui est une chaîne elle-même.
Par exemple:
La sortie contient le précédent
0
. Faites-moi savoir si c'est un problème.la source
C # -
128108104Merci à Compass, BMac et Shawn d'avoir suggéré des améliorations.
Essayez d'abord sur Code Golf, et l'utilisation de C # semble être un handicap ici ...
En utilisant,
.Compute()
vous pouvez utiliser les valeurs de chaîne et les additionner directement. En prime, cela fonctionne pour les autres opérateurs en plus du "+".Golfé:
Non golfé:
L'appel
t("123","456");
vous donne 579.la source
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
pour économiser 4 octetsGNU sed, 266 octets
Utilise une approche différente de la solution de DigitalTrauma. En effet, celui-ci fonctionne encore plus mal, en utilisant O (m + n) . Convertir les deux opérandes en unaire, concaténer, reconvertir en décimal (tout en utilisant l'expression régulière bien sûr — sed n'a pas le concept d'un entier).
En bonus, ce programme résume tous les entiers naturels donnés sur stdin (dans la première ligne), ce qui signifie que vous ne pouvez rien lui donner, un ou dix chiffres et qu'il fera la bonne chose malgré tout.
L'idée derrière ce code est vaguement inspirée d'une ancienne soumission de PPCG sed, bien que je ne me souvienne pas pour quelle question c'est une réponse.
La voici, "jolie" - imprimée pour votre "commodité", pour emprunter une autre idée à DigitalTrauma. :RÉ
(Pour obtenir la version 266 octets, supprimez les points-virgules de fin, les espaces blancs de tête et le commentaire final, de préférence à l'aide de sed.)
Emprunter certains tests de DigitalTrauma:
J'ai légèrement modifié les très gros tests en raison de la terrible efficacité (in) de l'espace. En raison de l'utilisation de
q
seulement la première ligne est traitée, d'où lawhile
boucle dans le test.la source
Java 6 (181 caractères)
Ne pas être surpassé par le handicap connu sous le nom de C # , Java dans toute sa splendeur. Tant de passe-partout! L'utilisation fournit les arguments séparés par un espace, c'est-à-dire
123 456
Non golfé:
En utilisant le moteur JavaScript disponible en
javax
, nous pouvons faire en sorte qu'une autre langue fasse le travail pour nous et suivre techniquement les règles de ne pas utiliser de types numériques dans la langue maternelle ou de convertir.Justification de l'utilisation
eval
Nous n'avons pas converti les valeurs en int pour JavaScript en eval. Nous avons créé une chaîne
"123+456"
qui n'est pas un nombre. JS Engine digère la formule et évalue la chaîne sous forme de littéraux numériques, qui ne sont pas des types de données numériques. Logique de fromage Java! En passant, cela fonctionne également pour lesdouble
mathématiques.la source
dc -e"$1 $2+p"
techniquement je n'ai pas utilisé de type de nombre dans le bash natif c'est juste passer une chaîne à un détail d'implémentationAPL (61)
Je pense que cela relève des règles.
Il s'agit d'une fonction qui prend deux arguments de chaîne et renvoie une chaîne:
C'est aussi assez rapide, il ajoute le nombre formé par 999999
9
s à lui-même en un instant.Il trouve l'index de chaque caractère dans
⎕D
(qui est la chaîne '0123456789'), puis ajoute des notes d'école sur chaque index séparément, transportant au besoin, puis recherche les chiffres résultants⎕D
. (Je pense que la⎕D
recherche est conforme aux règles, elle ne fait que le faire'x'-48
).Explication:
⎕D∘⍳¨⍺⍵
: recherchez les indices⎕D
pour chaque caractère dans les deux chaînes.¯1+
: soustrayez1
de chacun, car les tableaux sont basés sur 1 par défaut.⌽↑⌽¨
: inversez les deux, transformez-vous en matrice (remplissez les carrés vides de zéros), puis inversez la matrice.+⌿
: somme les colonnes de la matrice{
...}
: report:∨/T←9<Z←0,⍵
: ajoutez un extra0
devant la liste. Découvrez quels «chiffres» sont supérieurs à 9 et stockez-les dansT
. Si des chiffres étaient supérieurs à 10:Z-10×T
: soustraire10
de chaque position supérieure à 10,T←(1⌽T)+
: ajoutez1
à chaque position à côté de chaque position supérieure à 10 et enregistrez-laT
.T↓⍨~×⊃T
: siT
commence par un zéro, supprimez-le,∇
: applique la fonction de report au résultat.⋄⍵
: sinon, retourne la valeur inchangée1+
: ajoutez un à chaque position (car le tableau est indexé 1)⎕D[
...]
: utilisez le résultat comme index dans⎕D
.la source
Perl -
136119115 115 octetsJ'apprends Perl, cela semblait être une bonne pratique. Les pourboires sont appréciés!
Réponse ringarde, pour éliminer cela:
Réponse réelle:
Non compressé:
la source
($x,$y)=@ARGV
et en utilisantsay
au lieu deprint
va raser quelques caractères.say
est une chose Perl 6 (ou vous pouvez l'utiliser en Perl 5 avec ces instructions, mais ce serait trop long). Au lieu desay
, utilisezwarn
pour raser un personnage. Cela sortira vers STDERR au lieu de STDOUT, mais ce n'est pas contraire aux règles de celui-ci. :-)Java 7, score = 252
N'utilise aucun entier, long, octet, short, double, float ou aucune fonction de bibliothèque intégrée pour l'ajout. Enveloppez dans un corps de classe et appelez avec
t(String1,String2)
. Veuillez remplir les chaînes avec des 0 afin qu'elles aient une longueur égale.t("123","234")
retourne"0357"
.Golfé:
Golfed Développé avec classe:
Golf partiellement élargi:
100% étendu:
la source
char
est un type de données numérique ._.\u0030
caractère en chaîne, je"0"
ne reçois pas"48"
.Java - 257 caractères
comme tout le monde connaît java, il n'y a pas de meilleur langage pour le golf que java
c'est une solution non golfée
la source
Haskell -
9894 octetsla source
JavaScript (ES6),
55 6659 ** Cela fait quelques hypothèses:
L'entrée est définie dans les variables a et b, ex:modifié pour obtenir l'entrée de l'invite (+11).var a='123',b=321';
la source
Python 2.7,
196137caractèresversion 2 (plus courte en initialisant le dictionnaire avec le code):
Version précédente 1 (196 caractères):
par exemple
Les clés du dictionnaire sont des chaînes, les valeurs du dictionnaire incluent uniquement des constantes numériques pour raccourcir le code, et le calcul se fait en concaténant deux chaînes et en obtenant la longueur résultante, donc j'espère que cela compte comme "ne pas les convertir en ints".
Version de tricheur de règles en petit caractères Python
Remarque:
Le type z est un type personnalisé que je définis comme: certainement pas un type numérique quelle que soit la définition utilisée par le questionneur, mais se comporte suffisamment près d'un type numérique pour être utile dans des circonstances limitées . Les comportements de type z ne sont que partiellement implémentés dans cet exemple de code, et si l'interpréteur CPython utilise 'int' pour implémenter z , il s'agit simplement d'un détail d'implémentation et non lié au problème à résoudre.
la source