سلام کدکاپ!


در این مسئله برای آشنایی بیشتر شما با سیستم داوری جاوا کوئرا، مسئله‌ای ساده تهیه کرده‌ایم. در این مسئله تنها کاری که باید انجام دهید پیاده سازی یک تابع برای سلام کردن به کدکاپ است! البته با این کد شما به تمامی کدکاپ‌های گذشته حال و اینده کوئرا تا ابد سلام می‌کنید ^_^ در ادامه با جزئیات بیشتر مسئله آشنا می‌شویم.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید.

ساختار فایل‌های پروژه به‌صورت زیر است:

HelloCodeCup/
├── HelloCodeCup.java
└── test
    └── HelloCodeCupSampleTest.java
Plain text

شما باید تابع sayHelloToCodeCup موجود در فایل HelloCodeCup.java را مطابق با خواست مسئله پیاده‌سازی کنید. امضای تابع مورد نظر به شکل زیر است:

extensionFromNameHelloCodeCup.java
public class HelloCodeCup {

    public static String sayHelloToCodeCup(int n) {
        // TODO: Implement
    }

    public static void main(String[] args) {
        System.out.println(sayHelloToCodeCup(7)); // Hello CodeCup 7
    }
}
Java

تابع sayHelloToCodeCup:🔗

این تابع یک عدد به با نام n به عنوان ورودی دریافت می‌کند و در خروجی رشته‌ای به فرمت زیر باز می‌گرداند.

Hello CodeCup >N<
Plain text

مثال🔗

به چند خروجی این تابع دقت کنید:

extensionFromNameTerminal
System.out.println(sayHelloToCodeCup(5)) // "Hello CodeCup 5"
System.out.println(sayHelloToCodeCup(6)) // "Hello CodeCup 6"
System.out.println(sayHelloToCodeCup(7)) // "Hello CodeCup 7"
Java

نکات🔗

  • مقدار مورد نظر را چاپ نکنید و آن را بازگردانید.
  • به تمامی فاصله‌های خروجی دقت کنید.
  • در ابتدا و انتهای خروجی هیچ فاصله‌ای قرار ندارد.
  • سیستم داوری کوئرا به بزرگی و کوچکی حروف حساس است.
  • در این مسئله تنها مجاز به استفاده از کتاب‌خانه‌های استاندارد جاوا هستید.

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

پس از پیاده‌سازی موارد خواسته‌شده، فایل HelloCodeCup.java را آپلود کنید.

تکرار


در فایل RepeatInString.java یک کلاس به نام RepeatInString وجود دارد که یک متد خالی با نام StringInString و به صورت زیر دارد:

public class RepeatInString {
    public int StringInString(String one, String two) {

    }
}
Java

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

ورودی ۱:🔗

StringInString("salam", "sal") 
Java

خروجی ۱:🔗

1
Plain text

ورودی ۲:🔗

StringInString("golgoli", "gol")
Java

خروجی ۲:🔗

2
Plain text

ورودی ۳:🔗

StringInString("sasasas", "sas")
Java

خروجی ۳:🔗

3
Plain text

نکات:🔗

  • در صورتی که هر کدام از رشته‌های ورودی null باشند، متد مورد نظر ۰ برمی‌گرداند.
  • در صورتی که هر کدام از رشته‌های ورودی خالی باشند (یعنی رشته‌هایی با طول صفر باشند) متد مورد نظر ۰ برمی‌گرداند.

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

فقط فایل RepeatInString.java را به صورت زیپ‌شده آپلود کنید. یعنی وقتی فایل زیپ را باز می‌کنیم، فقط فایل RepeatInString.java را ببینیم.

ساختار درختی فایل ارسالی:

<Your-zip-name>.zip
    └── RepeatInString.java
Plain text

چیراکسی؟


در این سوال برای ساده‌تر کردن مدیریت خطاها و مرتب کردن استثناها می‌خواهیم تمام خطاهایی که رخ می‌دهد را با یک قرارداد واحد در کلاسی به نام ExceptionProxy ذخیره کنیم. برای این کار به ازای هر خطایی که رخ می‌دهد یک شی از کلاس ExceptionProxy می‌سازیم که دارای دو خصوصیت است. این خصوصیات عبارتند از ( e یک شی از کلاس ExceptionProxy است):

  • متن استثنای رخ داده. (تبدیل‌شده استثنا به رشته): e.msg
  • تابعی که باعث ایجاد استثنا شده: e.function

فایل Solution.java را دانلود کرده و محتوای آن را ببینید. از شما می‌خواهیم متد transformException() را پیاده‌سازی کنید. این متد یک لیست از توابع ورودی می‌گیرد. سپس هر کدام از توابع را صدا می‌کند (توابع بدون آرگومان هستند) و استثناهایی که رخ می‌دهد را با قرارداد بالا به شی‌ای از ExceptionProxy تبدیل کرده و در نهایت لیست خطاهای تبدیل‌شده را به همان ترتیب توابع بر می‌گرداند. دقت کنید که اگر تابعی بدون خطا اجرا شد باید یک شی ExceptionProxy ساخته و مقدار msg آن را با "OK!"مقداردهی کنید.

مثال🔗

با اجرای متد main در کلاس Solution خروجی زیر باید در کنسول چاپ شود:

msg: / by zero
function: Devide[1/0]
msg: OK!
function: Devide[1/1]
Plain text

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

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل Solution.java را ببینیم.

تردکاری


در کارت گرافیک برای بالا بردن سرعت، پردازش بخش‌های مختلف به صورت موازی انجام می‌شود. این پردازش‌ها را می‌توان به شکل یک درخت نشان داد. در این سوال به پردازش درختی از توابع می‌پردازیم. به شما یک درخت دودویی از توابع به شکل زیر داده می شود. درخت دودویی هر یال جهت‌دار به این معناست که تابعی که یال از آن خارج شده باید قبل از تابعی که یال به آن وارد شده محاسبه شود. (یا می‌توان گفت تابع دوم برای انجام محاسباتش نیاز به خروجی تابع اول دارد). توابع در سه لیست fs و gs و hs از طریق کلاس Functions به شما داده می‌شوند (برای مثال، f[0] همان f1f1 است). در ضمن توجه داشته باشید که تمام توابع بدون آرگومان ورودی هستند.

فایل Source را دانلود کرده و محتوای آن را ببینید و متد solve را مطابق با توضیحات زیر پیاده‌سازی کنید.

شما باید این درخت را به ترتیب زیر پردازش کنید:

  • با چهار ترد با نام‎های 1 و 2 و 3 و 4: با ترد iiام، fifi پردازش شود.
  • با دو ترد با نام‎های 1 و 2: با ترد iiام، gigi پردازش شود.
  • با یک ترد با نام 1: با ترد iiام، hihi پردازش شود.

دقت کنید که محاسبات هر مرحله (هر طبقه درخت) باید به صورت همزمان انجام شود. (برای مثال f1f1 و f2f2 باید همزمان محاسبه شوند).

مثال🔗

با اجرای متد main از کلاس Main خروجی زیر یکی خروجی‎های صحیح محتمل است.

F1 by 1 - F4 by 4 - F2 by 2 - F3 by 3 - G1 by 1 - G2 by 2 - H1 by 1 - 
Plain text

توجه داشته باشید که تمامی Fها قبل از Gها و تمامی Gها قبل از Hها چاپ می‎شود.

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

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل ThreadSolution.java را ببینیم.

فروش انبوه


تیم انبوه‌فروشان مشرق‌زمین قصد دارد سامانه‌ای تحت‌وب برای مدیریت آسان‌تر فروشگاه‌شان راه‌اندازی کند. آن‌ها تصمیم گرفته‌اند تا وب‌سرویس‌شان را با استفاده از Spring Boot پیاده‌سازی کنند. نیازمندی‌ها از قبل به‌طور دقیق مشخص شده‌اند، اما هنوز برنامه‌نویسی به تیم آن‌ها اضافه نشده است. از شما می‌خواهیم تا نسخه‌ی اولیه‌ی این وب‌سرویس را پیاده‌سازی کنید.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید.

  • این پروژه از Maven استفاده می‌کند و وابستگی‌ها در POM تعریف شده‌اند. امکان تغییر این وابستگی‌ها وجود ندارد.
  • از Liquibase برای مدیریت schema دیتابیس استفاده شده است.
  • برای اجرای تست‌ها، از دیتابیس H2 استفاده می‌شود.
  • در این پروژه، وابستگی Project Lombok تعریف شده و قابل استفاده است.
  • بسته‌ی ir.digipay.bulkshop شامل موجودیت‌های JPA برنامه است که مطابق با schema دیتابیس طراحی شده‌اند. شناسه (id) موجودیت‌ها به‌صورت خودکار توسط Hibernate تولید می‌شود.
    • کلاس CustomerEntity: از این کلاس برای نگه‌داری اطلاعات هر مشتری استفاده می‌شود.
    • کلاس ProductEntity: از این کلاس برای نگه‌داری اطلاعات هر محصول استفاده می‌شود.
    • کلاس OrderEntity: از این کلاس برای نگه‌داری اطلاعات هر سفارش استفاده می‌شود.
  • بسته‌ی ir.digipay.bulkshop.api شامل کلاس‌هایی برای مدیریت ورودی‌ها و خروجی‌های API است.
  • بسته‌ی ir.digipay.bulkshop.rest شامل REST controller های برنامه است. کنترلر مربوط به آدرس / برای تست برنامه در کلاس IndexRestEnpoint پیاده‌سازی شده است. سایر کنترلرها را در این بسته پیاده‌سازی کنید.
  • از آن‌جا که این برنامه اولین نسخه‌ی سامانه است، هر سفارش می‌تواند شامل یک نوع محصول باشد، اما تعداد آن را می‌توان در سفارش تعیین کرد.

سرویس‌ها🔗

تعدادی وب‌سرویس REST مطابق نیازمندی‌های زیر باید پیاده‌سازی شود:

آدرس عنوان
GET /api/products دریافت اطلاعات محصولات
POST /api/products ایجاد محصول
GET /api/products/{id} دریافت اطلاعات یک محصول
PUT /api/products ویرایش اطلاعات یک محصول
GET /api/customers دریافت اطلاعات مشتریان
POST /api/customers ایجاد مشتری
GET /api/customers/{id} دریافت اطلاعات یک مشتری
PUT /api/customers ویرایش اطلاعات یک مشتری
GET /api/orders دریافت اطلاعات سفارشات
POST /api/orders ایجاد سفارش
GET /api/orders/{id} دریافت اطلاعات یک سفارش

دریافت اطلاعات محصولات🔗

اطلاعات همه‌ی محصولات در قالب یک آرایه برگردانده می‌شود:

URL: "GET /api/products"

http-code: 200
content-type: "application/json"
response: {
  "products": [ # Array of ProductModel or ProductEntity
    {
      "id": "some_uuid",
      "name": "x",
      "price": 50000,
      "availableCount": 100
    },
    {
      "id": "some_uuid",
      "name": "y",
      "price": 75000,
      "availableCount": 50
    }
  ]
}
YAML

ایجاد محصول🔗

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

URL: "POST /api/products"

request: { # ProductCreateParam
  "name": "x",
  "price": 40000,
  "initialAvailableCount": 100
}
http-code: 201
content-type: "application/json"
response: { # ProductCreateResult
  "productId": "some_uuid"
}
YAML

دریافت اطلاعات یک محصول🔗

شناسه‌ی محصول به‌عنوان ورودی داده می‌شود و اطلاعات محصول برگردانده می‌شود:

URL: "GET /api/products/1234"

http-code: 200
content-type: "application/json"
response: { # ProductModel or ProductEntity
  "id": "some_uuid",
  "name": "z",
  "price": 40000,
  "availableCount": 150
}
YAML

اگر محصولی با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

ویرایش اطلاعات یک محصول🔗

اطلاعات جدید محصول داده می‌شود و پس از به‌روزرسانی اطلاعات محصول، پاسخی با کد 204 برگردانده می‌شود:

URL: "PUT /api/products"

request: { # ProductUpdateParam
  "id": "some_uuid",
  "name": "x2",
  "price": 51000,
  "availableCount": 200
}
http-code: 204
YAML

اگر محصولی با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

دریافت اطلاعات مشتریان🔗

اطلاعات همه‌ی مشتریان در قالب یک آرایه برگردانده می‌شود:

URL: "GET /api/customers"

http-code: 200
content-type: "application/json"
response: {
  "customers": [ # Array of CustomerModel or CustomerEntity
    {
      "id": "some_uuid",
      "username": "x",
      "firstName": "x",
      "lastName": "x"
    },
    {
      "id": "some_uuid",
      "username": "y",
      "firstName": "y",
      "lastName": "y"
    }
  ]
}
YAML

ایجاد مشتری🔗

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

URL: "POST /api/customers"

request: { # CustomerCreateParam
  "username": "z",
  "firstName": "Z",
  "lastName": "z"
}
http-code: 201
content-type: "application/json"
response: { # CustomerCreateResult
  "customerId": "some_uuid"
}
YAML

اگر مشتری‌ای با نام کاربری داده‌شده از قبل موجود باشد، پاسخ باید به‌صورت زیر باشد:

http-code: 409
content-type: "application/json"
response: { 
  "message": "Username already taken"
}
YAML

دریافت اطلاعات یک مشتری🔗

شناسه‌ی مشتری به‌عنوان ورودی داده می‌شود و اطلاعات مشتری برگردانده می‌شود:

URL: "GET /api/customers/1"

http-code: 200
content-type: "application/json"
response: { # CustomerModel or CustomerEntity
  "id": "some_uuid",
  "username": "x",
  "firstName": "x",
  "lastName": "x"
}
YAML

اگر مشتری‌ای با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

ویرایش اطلاعات یک مشتری🔗

اطلاعات جدید مشتری داده می‌شود و پس از به‌روزرسانی اطلاعات مشتری، پاسخی با کد 204 برگردانده می‌شود:

URL: "PUT /api/customers"

request: { # CustomerUpdateParam
  "id": "some_uuid",
  "username": "x2",
  "firstName": "x2",
  "lastName": "x2"
}
http-code: 204
YAML

اگر مشتری‌ای با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

دریافت اطلاعات سفارشات🔗

اطلاعات همه‌ی محصولات در قالب یک آرایه برگردانده می‌شود:

URL: "GET /api/orders"

http-code: 200
content-type: "application/json"
response: {
  "orders": [ # Array of OrderModel or OrderEntity
    {
      "id": "some_uuid",
      "customerId": "some_uuid",
      "productId": "some_uuid",
      "count": 4
    },
    {
      "id": "some_uuid",
      "customerId": "some_uuid",
      "productId": "some_uuid",
      "count": 3
    }
  ]
}
YAML

ایجاد سفارش🔗

یک سفارش با اطلاعات داده‌شده ایجاد می‌شود، مقدار موجودی محصول به اندازه‌ی تعداد واردشده کم می‌شود و شناسه‌ی سفارش برگردانده می‌شود:

URL: "POST /api/orders"

request: { # OrderCreateParam
  "customerId": "some_uuid",
  "productId": "some_uuid",
  "count": 6
}
http-code: 201
content-type: "application/json"
response: { # OrderCreateResult
  "orderId": "some_uuid"
}
YAML

اگر مشتری یا محصولی با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

اگر مقدار فیلد count کوچک‌تر یا مساوی صفر باشد، پاسخ باید به‌صورت زیر باشد:

http-code: 400
content-type: "application/json"
response: { 
  "message": "Invalid count"
}
YAML

اگر مقدار count بزرگ‌تر از موجودی فعلی محصول باشد، پاسخ باید به‌صورت زیر باشد:

http-code: 400
content-type: "application/json"
response: { 
  "message": "Not enough available count"
}
YAML

دریافت اطلاعات یک سفارش🔗

شناسه‌ی سفارش به‌عنوان ورودی داده می‌شود و اطلاعات سفارش برگردانده می‌شود:

URL: "GET /api/orders/1234"

http-code: 200
content-type: "application/json"
response: { # OrderModel or OrderEntity
  "id": "some_uuid",
  "customerId": "some_uuid",
  "productId": "some_uuid",
  "count": 5
}
YAML

اگر سفارشی با شناسه‌ی واردشده موجود نباشد، پاسخ باید به‌صورت زیر باشد:

http-code: 404
content-type: "application/json"
response: { 
  "message": "Entity not found"
}
YAML

نکات🔗

  • ممکن است چند درخواست هم‌زمان برای خرید یک محصول به برنامه ارسال شود. این درخواست‌ها باید به‌درستی مدیریت شوند.
  • شما تنها مجاز به اعمال تغییرات در بسته‌ی ir.digipay.bulkshop هستید.

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

پس از پیاده‌سازی موارد خواسته‌شده، پوشه‌ی src پروژه را زیپ کرده و ارسال کنید. توجه داشته باشید که فقط تغییرات اعمال‌شده در پوشه‌ی src/main/java/ir.digipay.bulkshop در نظر گرفته می‌شوند.