2010-06-24 16 views
3

Je sais que l'arithmétique sur grands entiers dans brainfuck, bien que parfois assez fastidieux, est tout à fait possible. Cependant, ce que je m'interroge sur ce que les meilleures pratiques généralement acceptées sont pour prendre de grands entiers (ou même des chaînes, je suppose) comme entrée.Comment obtenir un grand entier en entrée et le stocker en mémoire

La plupart des compilateurs/interprètes vous permettent de fournir des chaînes complètes en entrée (et chaque caractère est lu individuellement avec un ,). Mais ce que je me demande est-ce - comment pouvez-vous en lire un si vous ne savez pas quand le flux d'entrée va s'arrêter? Je suppose que l'one-way est d'indiquer à l'utilisateur d'ajouter un certain caractère/chaîne de caractères à leur nombre pour indiquer que c'est fini, mais cela semble un peu non-convivial.

Je préférerais une réponse qui garde la portabilité à l'esprit (les solutions spécifiques à l'implémentation sont intéressantes, mais ne sont pas l'objet principal de cette question). S'il n'y a pas de moyen totalement indépendant de l'implémentation de faire cela, celui qui fonctionnera sur la plupart des implémentations et échouera gracieusement autrement serait la meilleure chose suivante.

Merci d'avance.

+1

vous écrivez du code brainfuck et êtes préoccupé par la convivialité ?? – msw

+0

N'entrerait-il pas un caractère raisonnable pour identifier la fin de l'entrée? – Mau

+0

@msw un brainfuck vaut mille mots. – Mau

Répondre

2

La plupart des langues permettent de lire une ligne depuis l'entrée (par exemple, obtient() dans C, ReadLine() dans C#, etc.). Pourquoi ne pas demander à l'utilisateur d'entrer chaque valeur sous forme de ligne (c'est-à-dire séparée par entrée)?

0

En fait, j'avais posté le même code pour une question différente dans un but différent. Ici le code suivant continuera à accepter l'ASCII de tout ce que vous tapez à moins qu'un caractère de nouvelle ligne soit rencontré. Ensuite, imprime ce que vous avez tapé.

Ne vous inquiétez pas de la portabilité; J'ai déjà implémenté l'addition de deux nombres à n chiffres avec cette stratégie de lecture des nombres, vous pouvez trouver here.

> + 
[ - >,>+< 
    ----- ----- ; minus 10 
    [    ; if enters means it is not a \n 
    +++++ +++++ ; restore prev value 
    < 
    ] >>   ; moving forward 
] 
       ; numbers are 0 0 49 0 50 0 51 
       ; for input 123 
<<<<[<<]   ; moving to the beginning 
>>    ; reaching first char 
[.>>]   ; just printing till end