| f | import sys | f | import sys |
| import struct | | import struct |
| | | |
| n | def parse_fat12_disk(img): | n | def read_fat12_disk_image(image_data): |
| SECTOR = 512 | | sector_size = 512 |
| ROOT_OFFSET = 19 * SECTOR | | root_dir_start = 19 * sector_size |
| entries_list = [] | | root_dir_entries = [] |
| for idx in range(224): | | for i in range(224): |
| start_pos = ROOT_OFFSET + idx * 32 | | entry_start = root_dir_start + i * 32 |
| entry_bytes = img[start_pos:start_pos + 32] | | entry_data = image_data[entry_start:entry_start + 32] |
| if len(entry_bytes) < 32: | | if len(entry_data) < 32: |
| break | | break |
| n | first_char = entry_bytes[0] | n | first_byte = entry_data[0] |
| if first_char == 0: | | if first_byte == 0: |
| break | | break |
| n | if first_char == 229: | n | if first_byte == 229: |
| continue | | continue |
| n | name_part = entry_bytes[0:8] | n | name_bytes = entry_data[0:8] |
| ext_part = entry_bytes[8:11] | | ext_bytes = entry_data[8:11] |
| attributes = entry_bytes[11] | | attr = entry_data[11] |
| if attributes & 8: | | if attr & 8: |
| continue | | continue |
| n | file_size_val = struct.unpack('<I', entry_bytes[28:32])[0] | n | size = struct.unpack('<I', entry_data[28:32])[0] |
| name_str = name_part.decode('cp866', errors='ignore').rstrip() | | name = name_bytes.decode('cp866', errors='replace').rstrip() |
| ext_str = ext_part.decode('cp866', errors='ignore').rstrip() | | ext = ext_bytes.decode('cp866', errors='replace').rstrip() |
| if ext_str: | | if ext: |
| full_name = f'{name_str}.{ext_str}' | | filename = f'{name}.{ext}' |
| else: | | else: |
| n | full_name = name_str | n | filename = name |
| is_dir_flag = attributes & 16 != 0 | | is_directory = attr & 16 != 0 |
| entries_list.append((full_name, file_size_val, is_dir_flag)) | | root_dir_entries.append((filename, size, is_directory)) |
| return entries_list | | return root_dir_entries |
| | | |
| n | def execute_main(): | n | def main(): |
| input_data = sys.stdin.buffer.read() | | image_data = sys.stdin.buffer.read() |
| if len(input_data) != 1474560: | | if len(image_data) != 1474560: |
| return | | return |
| n | disk_entries = parse_fat12_disk(input_data) | n | entries = read_fat12_disk_image(image_data) |
| if not disk_entries: | | if not entries: |
| return | | return |
| n | disk_entries.sort(key=lambda item: item[0].upper()) | n | entries.sort(key=lambda x: x[0].upper()) |
| for entry_name, entry_size, is_dir in disk_entries: | | for filename, size, is_directory in entries: |
| if is_dir: | | if is_directory: |
| print(f'{entry_name:12} dir') | | print(f'{filename:12} dir') |
| else: | | else: |
| n | print(f'{entry_name:12} {entry_size}') | n | print(f'{filename:12} {size}') |
| if __name__ == '__main__': | | if __name__ == '__main__': |
| t | execute_main() | t | main() |