پایتون - قانون‌شکن


در شهر انگوتستان داده‌ها تنها به وسیله‌ی JSON منتقل می‌شود. برای نمایش داده‌‌ی یک جدول در این شهر، به ازای هر سطر، یک فایل JSON ذخیره‌ می‌شود؛ در فایل JSON مربوط به هر سطر، به ازای هر ستون، شماره ستون به عنوان key و مقدار موجود در آن سطر و ستون، به عنوان value ذخیره می‌شود.

مثال ذخیره جدول به صورت JSON

برای مثال جدول زیر را در نظر بگیرید:

ستون اول ستون دوم‌ ستون سوم
۳ ۱ ۴
۱ ۳ ۱۳
‌ ۱ ۲ ۳

این جدول در شهر انگوتستان به شکل سه فایل JSON ذخیره می‌شود، فایل مربوط به هر سطر، به ترتیب به شکل زیر می‌شود:

{"1": "3", "2": "1", "3": "4"}
JSON
{"1": "1", "2": "3", "3": "13"}
JSON
{"1": "1", "2": "2", "3": "3"}
JSON

سجاد که از اهالی قانون‌شکن شهر انگوتستان می‌باشد می‌خواهد برعکس کارهای بالا را انجام دهد و با گرفتن تمامی فایل‌های‌ ‍‍JSON مربوط به یک جدول، آن را به صورت یک فایل CSV نمایش دهد. او برای این کار، دقیقا برعکس کارهای بالا را انجام می‌دهد؛ البته چون فقط می‌خواهد جدول را ذخیره کند از index و header در CSV استفاده نمی‌کند.

اما او هر جدولی را دوست ندارد و برای این که جدول بهتر شود؛ ابتدا مقادیر مربوط به هر سطر را از کوچک به بزرگ مرتب ‌می‌کند؛ سپس سطر iiام را i1i - 1 بار شیفت دوری می‌دهد (یعنی سطر اول هیچ تغییری نمی‌کند)؛ در واقع خانه موجود در سطر iiام و ستون jj ام مقدار خانه سطر ii و ستون (i+j1)modn(i+j - 1) \mod n را به خود می‌گیرد (اگر مقدار عبارت گفته شده برابر با صفر بود، nn در نظر گرفته می‌شود).

مثال عملیات روی جدول

برای مثال جدول زیر را در نظر بگیرید:

ستون اول ستون دوم‌ ستون سوم‌
۳ ۱ ۴
۱ ۳ ۱۳
‌ ۱ ۲ ۳

اگر سطرهای این جدول را مرتب کنیم به صورت زیر درمی‌آید:

ستون اول ستون دوم‌ ستون سوم
۱ ۳ ۴
۱ ۳ ۱۳
‌ ۱ ۲ ۳

حال اگر هر سطر را با توجه به روش داده شده تغییر دهیم سطر اول تغییری نمی‌کند؛ ولی سطر دوم، یک شیفت به سمت راست می‌خود و سطر سوم دو شیفت به سمت راست می‌خورد و جدول نهایی به شکل زیر درمی‌آید:

ستون اول ستون دوم‌ ستون سوم
۱ ۳ ۴
۳ ‍۱۳ ۱
۳ ۱ ۲

بررسی دقیق‌تر:

inputs:
3 1 4
1 3 13
1 2 3
-----------------
sort:
1 3 4
1 3 13
1 2 3
---------------
rotate:
1 3 4  (no rotation)
3 13 1 (one left rotation)
3 1 2 (two left rotation)
Plain text

حال سجاد از شما می‌خواهد برایش یک تابع به نام process بنویسید که به عنوان ورودی یک لیست از نام فایل‌های JSON بگیرد (دقت کنید که فایل‌های JSON در این لیست به ترتیب هستند؛ یعنی فایل مربوط به سطر ii در جایگاه i1i-1 در لیست وجود دارد)، و جدول نهایی را در فایلی به نام ans.csv ذخیره کند.

تضمین می‌شود که جدول ورودی داده شده مربعی است و در آن اعداد صحیح قرار دارد.

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید. شما باید تابع ‍‍process در فایل ‍‍solution.py را کامل کنید.

مثال🔗

اگر در کنار فایل solution.py فایل‌های JSON پروژه اولیه وجود داشته باشد، باید خروجی زیر از تابع گرفته شود:

>>> from solution import process
>>> process(['sample1.json', 'sample2.json'])
>>> with open('ans.csv', 'r') as f:
...     print(f.readlines())
... 
['1,3\n', '3,1\n']
Python

نکات🔗

  • دقت کنید که در جداول مثال، ستون اول، به علت فارسی بودن، سمت راست جدول است و اگر CSV را به طور عادی باز کنید باید ترتیب ستون‌های جدول برعکس شود و ستون اون در سمت چپ قرار گیرد.
  • توجه کنید که مقادیر را باید به صورت عددی مرتب کنید؛ یعنی عدد ۲ از عدد ۱۷ کوچک‌تر است (یعنی باید اعداد را هنگام خواندن از فایل به int تبدیل کنید).

آن‌چه باید آپلود کنید🔗

فایل کامل شده solution.py را ارسال کنید؛ همچنین برای استفاده از کتابخانه‌های مختلف می‌توانید همراه فایل ارسالی، فایلی به نام python_requirements.txt در ZIP خود بگذارید که در آن نام کتاب‌خانه‌های مورد نیاز و شماره نسخه‌ی آن‌ها به فرمت زیر در آن موجود باشد: (اگر شماره نسخه را ننویسید آخرین نسخه‌ی آن کتابخانه نصب می‌شود)

firstlib==1.2.3
secondlib==4.5.6
...
Plain text

در نهایت یک فایل ZIP حاوی دو فایل خواسته شده را آپلود کنید.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.