def get_filename( message) :
forbidden= '*|\\ :"<>?/'
while True :
line= input ( message)
for i in forbidden:
if i in line:
print ( 'Symbols {} are forbidden to use' .format ( forbidden) )
break
else :
break
if not line.endswith ( '.lst' ) : line+= '.lst'
return line
def get_int( message, i_c) :
error_line= 'Only numbers {} are allowed' .format ( range ( i_c) )
while True :
try :
i= int ( input ( message) )
if i in range ( i_c+1 ) :
return i
else :
print ( error_line)
except ValueError :
print ( error_line)
def options( changed, empty) :
line= '[A]dd ' +( '[S]ave ' if changed else '' ) +( '[D]elete ' if not empty else '' ) +'[Q]uit [a]: '
answers= 'Aa' +( 'Ss' if changed else '' ) +( 'Dd' if not empty else '' ) +'Qq'
while True :
answer= input ( line)
if answer:
if answer in answers:
return answer.lower ( )
else :
print ( '-Invalid choice. Print one of: \' {}\' -' .format ( answers) )
else :
return 'a'
def options_quit( ) :
line= 'Unsaved changes were made. Do you want to save them?\n [Y]es [N]o [C]ancel: '
answers= 'YyNnCc'
while True :
answer= input ( line)
if answer in answers and answer:
return answer.lower ( )
else :
print ( 'Answer only {}' .format ( answers) )
def save_list( filename, items) :
file = open ( 'data\\ ' +filename, 'w' )
for i in items:
file .write ( i+'\n ' )
def print_list( lst) :
for i, j in enumerate ( lst, start= 1 ) :
print ( '{}: {}' .format ( i, j) )
def add( items) :
items.append ( input ( 'Add item: ' ) )
items.sort ( key= str .lower )
def delete( items) :
item_number= get_int( 'Number of item to delete or 0 to cancel:' , len ( items) )
if item_number== 0 :
return
else :
items.pop ( item_number-1 )
def main( ) :
import os
files= [ i for i in os .listdir ( 'data' ) if i.endswith ( '.lst' ) ]
if files:
print_list( files)
option= get_int( 'Print the number of file to load or 0 to create a new one: ' , len ( files) )
else :
print ( '-No .lst files were found-' )
option= 0
if not option:
filename= get_filename( 'Print name for a new .lst file: ' )
items= [ ]
else :
filename= files[ option-1 ]
items= [ i.rstrip ( '\n ' ) for i in open ( 'data\\ ' +filename, 'r' ) ]
ITEMS, changed= tuple ( items) , 0
print ( filename)
while True :
if items:
print_list( items)
empty= 0
else :
print ( '-list is empty-' )
empty= 1
option= options( changed, empty)
if option== 'a' :
add( items)
changed= 1
elif option== 'd' :
delete( items)
changed= 1
elif option== 's' :
save_list( filename, items)
changed= 0
break
else :
if changed:
option= options_quit( )
if option== 'y' :
save_list( filename, items)
break
elif option== 'n' :
break
else :
break
main( )
ZGVmIGdldF9maWxlbmFtZShtZXNzYWdlKToKICAgIGZvcmJpZGRlbj0nKnxcXDoiPD4/LycKICAgIHdoaWxlIFRydWU6CiAgICAgICAgbGluZT1pbnB1dChtZXNzYWdlKQogICAgICAgIGZvciBpIGluIGZvcmJpZGRlbjoKICAgICAgICAgICAgaWYgaSBpbiBsaW5lOgogICAgICAgICAgICAgICAgcHJpbnQoJ1N5bWJvbHMge30gYXJlIGZvcmJpZGRlbiB0byB1c2UnLmZvcm1hdChmb3JiaWRkZW4pKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBicmVhawogICAgaWYgbm90IGxpbmUuZW5kc3dpdGgoJy5sc3QnKTogbGluZSs9Jy5sc3QnCiAgICByZXR1cm4gbGluZQoKZGVmIGdldF9pbnQobWVzc2FnZSxpX2MpOgogICAgZXJyb3JfbGluZT0nT25seSBudW1iZXJzIHt9IGFyZSBhbGxvd2VkJy5mb3JtYXQocmFuZ2UoaV9jKSkKICAgIHdoaWxlIFRydWU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpPWludChpbnB1dChtZXNzYWdlKSkKICAgICAgICAgICAgaWYgaSBpbiByYW5nZShpX2MrMSk6CiAgICAgICAgICAgICAgICByZXR1cm4gaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoZXJyb3JfbGluZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcHJpbnQoZXJyb3JfbGluZSkKCmRlZiBvcHRpb25zKGNoYW5nZWQsZW1wdHkpOgogICAgbGluZT0nW0FdZGQgJysoJ1tTXWF2ZSAnIGlmIGNoYW5nZWQgZWxzZSAnJykrKCdbRF1lbGV0ZSAnIGlmIG5vdCBlbXB0eSBlbHNlICcnKSsnW1FddWl0IFthXTogJwogICAgYW5zd2Vycz0nQWEnKygnU3MnIGlmIGNoYW5nZWQgZWxzZSAnJykrKCdEZCcgaWYgbm90IGVtcHR5IGVsc2UgJycpKydRcScKICAgIHdoaWxlIFRydWU6CiAgICAgICAgYW5zd2VyPWlucHV0KGxpbmUpCiAgICAgICAgaWYgYW5zd2VyOgogICAgICAgICAgICBpZiBhbnN3ZXIgaW4gYW5zd2VyczoKICAgICAgICAgICAgICAgIHJldHVybiBhbnN3ZXIubG93ZXIoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoJy1JbnZhbGlkIGNob2ljZS4gUHJpbnQgb25lIG9mOiBcJ3t9XCctJy5mb3JtYXQoYW5zd2VycykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICdhJwpkZWYgb3B0aW9uc19xdWl0KCk6CiAgICBsaW5lPSdVbnNhdmVkIGNoYW5nZXMgd2VyZSBtYWRlLiBEbyB5b3Ugd2FudCB0byBzYXZlIHRoZW0/XG5bWV1lcyBbTl1vIFtDXWFuY2VsOiAnCiAgICBhbnN3ZXJzPSdZeU5uQ2MnCiAgICB3aGlsZSBUcnVlOgogICAgICAgIGFuc3dlcj1pbnB1dChsaW5lKQogICAgICAgIGlmIGFuc3dlciBpbiBhbnN3ZXJzIGFuZCBhbnN3ZXI6CiAgICAgICAgICAgIHJldHVybiBhbnN3ZXIubG93ZXIoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCdBbnN3ZXIgb25seSB7fScuZm9ybWF0KGFuc3dlcnMpKQoKZGVmIHNhdmVfbGlzdChmaWxlbmFtZSxpdGVtcyk6CiAgICBmaWxlPW9wZW4oJ2RhdGFcXCcrZmlsZW5hbWUsJ3cnKQogICAgZm9yIGkgaW4gaXRlbXM6CiAgICAgICAgZmlsZS53cml0ZShpKydcbicpCgpkZWYgcHJpbnRfbGlzdChsc3QpOgogICAgZm9yIGksaiBpbiBlbnVtZXJhdGUobHN0LHN0YXJ0PTEpOgogICAgICAgIHByaW50KCd7fToge30nLmZvcm1hdChpLGopKQoKZGVmIGFkZChpdGVtcyk6CiAgICBpdGVtcy5hcHBlbmQoaW5wdXQoJ0FkZCBpdGVtOiAnKSkKICAgIGl0ZW1zLnNvcnQoa2V5PXN0ci5sb3dlcikKCmRlZiBkZWxldGUoaXRlbXMpOgogICAgaXRlbV9udW1iZXI9Z2V0X2ludCgnTnVtYmVyIG9mIGl0ZW0gdG8gZGVsZXRlIG9yIDAgdG8gY2FuY2VsOicsbGVuKGl0ZW1zKSkKICAgIGlmIGl0ZW1fbnVtYmVyPT0wOgogICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICBpdGVtcy5wb3AoaXRlbV9udW1iZXItMSkKCmRlZiBtYWluKCk6CiAgICBpbXBvcnQgb3MKICAgIGZpbGVzPVtpIGZvciBpIGluIG9zLmxpc3RkaXIoJ2RhdGEnKSBpZiBpLmVuZHN3aXRoKCcubHN0JyldCiAgICBpZiBmaWxlczoKICAgICAgICBwcmludF9saXN0KGZpbGVzKQogICAgICAgIG9wdGlvbj1nZXRfaW50KCdQcmludCB0aGUgbnVtYmVyIG9mIGZpbGUgdG8gbG9hZCBvciAwIHRvIGNyZWF0ZSBhIG5ldyBvbmU6ICcsbGVuKGZpbGVzKSkKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJy1ObyAubHN0IGZpbGVzIHdlcmUgZm91bmQtJykKICAgICAgICBvcHRpb249MAogICAgaWYgbm90IG9wdGlvbjoKICAgICAgICBmaWxlbmFtZT1nZXRfZmlsZW5hbWUoJ1ByaW50IG5hbWUgZm9yIGEgbmV3IC5sc3QgZmlsZTogJykKICAgICAgICBpdGVtcz1bXQogICAgZWxzZToKICAgICAgICBmaWxlbmFtZT1maWxlc1tvcHRpb24tMV0KICAgICAgICBpdGVtcz1baS5yc3RyaXAoJ1xuJykgZm9yIGkgaW4gb3BlbignZGF0YVxcJytmaWxlbmFtZSwncicpXQogICAgSVRFTVMsY2hhbmdlZD10dXBsZShpdGVtcyksMAogICAgcHJpbnQoZmlsZW5hbWUpCiAgICB3aGlsZSBUcnVlOgogICAgICAgIGlmIGl0ZW1zOgogICAgICAgICAgICBwcmludF9saXN0KGl0ZW1zKQogICAgICAgICAgICBlbXB0eT0wCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoJy1saXN0IGlzIGVtcHR5LScpCiAgICAgICAgICAgIGVtcHR5PTEKICAgICAgICBvcHRpb249b3B0aW9ucyhjaGFuZ2VkLGVtcHR5KQogICAgICAgIGlmIG9wdGlvbj09J2EnOgogICAgICAgICAgICBhZGQoaXRlbXMpCiAgICAgICAgICAgIGNoYW5nZWQ9MQogICAgICAgIGVsaWYgb3B0aW9uPT0nZCc6CiAgICAgICAgICAgIGRlbGV0ZShpdGVtcykKICAgICAgICAgICAgY2hhbmdlZD0xCiAgICAgICAgZWxpZiBvcHRpb249PSdzJzoKICAgICAgICAgICAgc2F2ZV9saXN0KGZpbGVuYW1lLGl0ZW1zKQogICAgICAgICAgICBjaGFuZ2VkPTAKICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjaGFuZ2VkOgogICAgICAgICAgICAgICAgb3B0aW9uPW9wdGlvbnNfcXVpdCgpCiAgICAgICAgICAgICAgICBpZiBvcHRpb249PSd5JzoKICAgICAgICAgICAgICAgICAgICBzYXZlX2xpc3QoZmlsZW5hbWUsaXRlbXMpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9uPT0nbic6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJyZWFrCgptYWluKCk=