Rho là là… Ça bouge trop vite, on n’a plus le temps de répondre/coder ! :P
Bon, d’abord, si tu es sûr que tu n’auras jamais A-B = 0, ça veut dire que la lettre Z est elle encodée par une différence de 26 (et 26%26 = 0), donc le -1, il faut le mettre dans le modulo, pas après (sinon, tu aura des @ à la place des Z): char((A-B-1)%26 + off).
Ensuite, je me suis amusé à faire une petite app avec lecture de fichier en prime, ou directement en ligne de commande, et en utilisant argparse, bien plus sympa que sys.argv à utiliser. Attention, code py3 uniquement (on est moderne ou on ne l’est pas ).
Bon, d’abord, si tu es sûr que tu n’auras jamais A-B = 0, ça veut dire que la lettre Z est elle encodée par une différence de 26 (et 26%26 = 0), donc le -1, il faut le mettre dans le modulo, pas après (sinon, tu aura des @ à la place des Z): char((A-B-1)%26 + off).
Ensuite, je me suis amusé à faire une petite app avec lecture de fichier en prime, ou directement en ligne de commande, et en utilisant argparse, bien plus sympa que sys.argv à utiliser. Attention, code py3 uniquement (on est moderne ou on ne l’est pas ).
Code:
#! /usr/bin/python3 import sys def main(): # The argparse is much nicer than directly using sys.argv... # Try 'modulo.py -h' to see! ;) import argparse parser = argparse.ArgumentParser(description="" \ "Converts modulo 26 of the difference " \ "between each successive numbers in a " \ "letter.") parser.add_argument('-f', '--file', help="A file containing all numbers.") parser.add_argument('-s', '--separator', default=" ", help="A string to use to split the file elements.") parser.add_argument('numbers', nargs='*', type=int, help="The numbers to process, ignored if a valid " \ "file is given.") args = parser.parse_args() # Get all numbers directly given in the command line (they are already # converted in ints). numbers = args.numbers ret = [] off = ord('A') # If a file path was given, try to open it, and use separator (which # defaults to simple space " ") to separate each number, then convert # it into an int, and make a list from all of them, replacing the # cl-given ones (if any). if args.file: with open(args.file, "r") as src: # Read everything, assuming we do not have millions of numbers. # This is a "list-comprehension", i.e. a shortcut for # txt = src.read() # Read the whole file. # txt_nbr = txt.split(args.separator) # Get each number (as text) into a list # numbers = [] # An empty list # for nbr in txt_nbr: # numbers.append(int(nbr)) numbers = [int(i) for i in src.read().split(args.separator)] if len(numbers) < 2: print("Not enough numbers given, aborting!") return -1 B = numbers[0] for A in numbers[1:]: ret.append(chr(((A-B-1) % 26) + off)) B = A # Convert the list f letters (ret) into a single string. print("".join(ret)) return 0 # These lines will only be executed if the script is the main one (i.e. the # one the interpreter was called with.) if __name__ == "__main__": # sys.exit will quit the program, returning the value returned by main # func. sys.exit(main())
Commentaire