مسابقات برنامه نویسی بیان

مسابقات برنامه نویسی بیان

آخرین نظرات
  • ۲۰ خرداد ۹۴، ۱۹:۴۶ - spider robot
    توی#

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

در ادامه روند ارسال پاسخ در مسابقات برنامه نویسی بیان و همچنین چند سوال بسیار ساده برای تمرین آورده شده است:

روند ارسال پاسخ

ارسال پاسخ در مسابقات برنامه‌نویسی بیان به سبک فقط خروجی (Output Only) است. یعنی شما بعد از پیاده سازی کد برنامه برای حل سوال و تست آن با ورودی و خروجی های نمونه، باید با اجرای برنامه‌ی خود بر روی یک ورودی مشخص، خروجی آن را به دست آورید.

برای این کار، مراحل زیر را انجام دهید.

۱. در صفحه‌ی سوال مورد نظر، در قسمت «ارسال» کلیک کنید. با این کار یک فایل با پسوند ".in" در مرورگر شما دانلود می‌شود که فایل ورودی مساله است.

۲. محتویات این فایل را به عنوان ورودی به برنامه‌ی خود بدهید و خروجی برنامه‌ی خود را در یک فایل دیگر ذخیره کنید (برای آشنایی بیشتر با کار با فایل به نکات مطرح شده در ادامه نیز توجه کنید).

۳. در صفحه‌ی سوال مورد نظر، فایل خروجی ذخیره شده را به همراه کد برنامه‌ی خود آپلود و ارسال کنید.

شما پس از دریافت یک ورودی تنها چند دقیقه برای اجرای برنامه و ارسال فایل خروجی فرصت دارید. در صورتی که نتوانید در این مدت فایل خروجی را ارسال کنید، یک تلاش ناموفق برای شما ثبت خواهد شد.

دقت کنید که در هر بار دانلود فایل ورودی، یک نمونه ورودی متفاوت به شما داده می‌شود و بنابراین در صورتی که یک ارسال ناموفق داشته اید، می‌بایست برنامه‌ی خود را بر روی ورودی دیگری که دریافت می‌کنید مجدداً اجرا نمایید.

چند نکته در حل مساله‌ها

کار با فایل

اگر شما  در محیط shell  یا command prompt یا cygwin برنامه خود را اجرا کنید کار با فایل خیلی ساده است. شما فقط کافیست برنامه خود را با ورودی و خروجی استاندارد بنویسید و پس از کامپایل برنامه خود فایل اجرایی آن را به صورت زیر اجرا کنید.

به عنوان مثال فرض کنید کد برنامه شما فایل p1.c باشد و فایل کامپایل شده آن p1.exe باشد. حال اگر شما بخواهید برنامه شما از فایل  p1.in به عنوان ورودی بخواند کافیست دستور زیر را در command بزنید:

p1.exe < p1.in

حالا اگر بخواهید برنامه شما از فایل ورودی p1.in بخواند و خروجی خود را در فایل p1.out بریزد دستور زیر را بزنید

p1.exe < p1.in > p1.out

کار در محیط Visual Studio

کسانی که در محیطهایی شبیه به Visual Studio هم کار می کنند، می توانند به شیوه ای که گفته شده فایل اجرایی برنامه خود را در محیط shell یا command prompt اجرا کنند و فایل ورودی و خروجی را به آن می دهید.

ولی اگر حتما می خواهید از محیط Visual Studio خارج نشوید به صورت زیر کار کنید:‌

۱- فایل ورودی را در کنار فایل برنامه خود قرار دهید. یا در محیط Visual Studio در کنار فایل یک فایل ایجاد کنید و محتویات فایل ورودی را در آن بریزید.

۲- با روش گفته شده در مثالهای زیر به طور صریح از فایل خوانده یا در فایل بنویسند.

در زیر مثالهای خواندن و نوشتن در فایل در زبان های سی و  جاوا و پایتون قرار داده شده است:

خواندن و نوشتن صریح در فایل :‌ سی پلاس پلاس، جاوا پایتون

Python

import string

input_reader = open('input.txt','r');
output_writer = open('output.txt','w');

input_list = string.split(input_reader.next())
a = int(input_list[0]);
b = int(input_list[1]);

output_writer.write(str(a+b)+"\n");

Java

import java.util.*;
import java.io.*;

public class read_write{
    public static void main(String args[])throws Exception{
	Scanner inputReader = new Scanner(new File("input.txt"));
	PrintWriter outputWriter = new PrintWriter(new File("output.txt"));
	

	
	int a = inputReader.nextInt();
	int b = inputReader.nextInt();

	outputWriter.println(a+b);
	outputWriter.close();
    }
}

C++

#include <cstdio>
#include <iostream>
#include <fstream>

using namespace std;

int main(){
  ifstream fin("input.txt");
  ofstream fout("output.txt");
  int a,b;
  fin>>a>>b;
  fout<<a+b<<endl;
}

 

کار با VB6

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

همچنین توجه داشته باشید برای خواندن سطر به سطر فایلهای متنی، دستورات استاندارد VB6 دو حالت‫ (Cr (\r و (CrLf (\r\n ‬را به عنوان انتهای سطر (end-of-line) قبول می کنند اما در تمام فایل های ورودی مسابقه، (Lf (\n مشخص کننده انتهای سطر می باشد. به همین دلیل شما با دستور Line Input نمی توانید سطر به سطر فایلهای ورودی مسابقه را بخوانید. برای رفع این موضوع یک procedure ساده با VB6 نوشته شده است که فایل ورودی را گرفته و آن به شکل مناسب ذخیره می کند. کافیست این procedure را در ابتدای برنامه خود قرار دهید و نام فایل ورودی را به آن ارسال کنید.

برای جزئیات بیشتر پاسخ سوالات مسابقه آزمایشی که با VB6 نوشته شده را مشاهده نمایید.

سوالات تمرینی

جمع دو عدد

برنامه ای بنویسید که ۲ عدد از ورودی گرفته و جمع آنها را چاپ کند.

ورودی مساله:

در خط اول فایل ورودی یک عدد   قرار دارد(   )که مشخص کننده ی تعداد جمع هایی است که باید انجام شود. در   خط بعدی هر کدام دو عدد   و   وجود دارد که باید با یک دیگر جمع شوند.

خروجی مساله:

به ازای هر دو عدد   و   حاصل جمع   و   را در یک خط جداگانه چاپ نمایید.

ورودی و خروجی مثال:

مثال خروجی مثال ورودی
4
3
2
3 1
1 2

 

پاسخ:

پاسخ به زبانهان‌های سی‌پلاس‌پلاس، پاسکال، جاوا ، پایتون ، سی شارپ و ویژوال بیسیک 6

Python

n = int(raw_input())
for i in range(n):
    a, b = [int(x) for x in raw_input().split(" ")]
    print("%s" % (a+b))

 

Java

import java.util.*;
import java.io.*;

public class Solution{
    public static void main(String args[]){
    Scanner cin = new Scanner(System.in);
    
    int n=cin.nextInt();
    for (int i=0;i<n;i++){
        int a,b;
        a=cin.nextInt();
        b=cin.nextInt();
        System.out.println(a+b);
    }
    }
}

VB6

Attribute VB_Name = "Add"
Option Explicit


Sub Main()
    Const DataPath   As String = "C:\BayanContest\Practice1-Add\"
    Const InputFile  As String = DataPath & "problem1.in"
    Const OutputFile As String = DataPath & "problem1.out"

    ConvertNewLineInFile InputFile


    Dim i As Long, count As Long, a As Long, b As Long
    
    Open InputFile For Input As #1
    Open OutputFile For Output As #2
    
    Input #1, count
    
    For i = 1 To count
        Input #1, a, b
        Print #2, CStr(a + b)
    Next
    
    Close
End Sub



' Changes all EOL (end-of-line) to CrLf. for more information visit: http://en.wikipedia.org/wiki/Newline
Public Sub ConvertNewLineInFile(ByVal FileName As String)
    Dim FileNum As Integer
    FileNum = FreeFile
    
    Dim Buffer As String
    
    On Error GoTo ConvertNewLineInFile_Error
    
    Open FileName For Binary Access Read Write As FileNum
    
    Buffer = String(LOF(FileNum), 0)
    Get FileNum, , Buffer
    
    Buffer = Replace(Buffer, vbLf, vbCr)
    Buffer = Replace(Buffer, vbCr & vbCr, vbCr)
    Buffer = Replace(Buffer, vbCr & vbCr, vbCr)
    Buffer = Replace(Buffer, vbCr, vbCrLf)
    
    Put FileNum, 1, Buffer
    
ConvertNewLineInFile_Error:
    Close FileNum
End Sub

C#

using System;
using System.IO;

namespace test
{
    class Program
    {
        static StreamReader streamReader = new StreamReader("..//..//problem.in");
        static StreamWriter streamWriter = new StreamWriter("..//..//problem.out");
        static int n = int.Parse(streamReader.ReadLine());
        static void Main(string[] args)
        {
            // Program.exe runs from [your_source_code_location]\bin\Debug
            // So problem.in and problem.out in near your source code
            try{
                Program1();
               }
            finally
            {
                streamReader.Close();
                streamWriter.Close();
            }
        }

        static void Program1()
        {
                for (int i = 0; i < n; i++)
                {
                    string line = streamReader.ReadLine();
                    string[] numbers = line.Split(' ');
                    int sum = int.Parse(numbers[0]) + int.Parse(numbers[1]);
                    streamWriter.WriteLine(sum);
                }
        }	
	}
}

Pascal

program ans;
var
	n,a,b,i: integer;
begin
	readln(n);
	for i := 1 to n do
	begin
		readln(a, b);
		writeln(a+b);
	end;
end.

C++

#include <iostream>

using namespace std;

int main(){
  int n,a,b;
  cin>>n;
  for (int i=0;i<n;i++){
    cin>>a>>b;
    cout<<a+b<<endl;
  }
}

حرف نقره‌ای

حرف نقره‌ای در یک کلمه، حرفی است که فاصله آن از دو طرف رشته مساوی باشد. مثلا در کلمه ALI ‎، حرف ‎L‎ حرف نقره ای است، چون فاصله آن از دو طرف   ‎ است. ولی کلمه ‎SARA ‎ حرف نقره ای ندارد، چون حرفی را نمی توان پیدا کرد که فاصله آن از دو طرف برابر باشد‎

به شما یک رشته داده شده ، شما باید ابتدا تعداد حرف های آن رشته را به دست بیاورید و چاپ کنید. در صورتی که این رشته دارای حرف نقره ای است باید آن را چاپ کنید و در غیر این صورت باید به ترتیب دو حرف کنار همی را چاپ کنید که اگر هر کدام از آن ها را از رشته حذف کنیم حرف دیگر حرف نقره ای شود.

ورودی مساله:

در خط اول فایل ورودی عدد   تعداد تست های ورودی را نشان می‌دهد(   ). در ‎   خط بعدی، در هر خط یک کلمه قرار گرفته است.

خروجی مساله:

به ازای هر تست، پاسخ سوال را در یک خط جداگانه چاپ کنید

ورودی و خروجی مثال:

مثال خروجی مثال ورودی
6 jl‎
‎5 v‎
2
‎‎ywjlbi‎‎
‎apvsk‎‎

 

پاسخ:

پاسخ به زبانهان‌های سی‌پلاس‌پلاس، پاسکال، جاوا، پایتون ، سی شارپ، ویژوال بیسیک 6 و پی اچ پی

Python

n = int(raw_input())
for i in range(n):
    s = raw_input()
    l = len(s)
    if l % 2:
        m = s[(l - 1)/2]
    else:
        m = s[l/2 - 1:l/2 + 1]
    print("%s %s" % (l,m))

Java

import java.util.*;
import java.io.*;

public class Solution{
    public static void main(String args[]){
	Scanner cin = new Scanner(System.in);
	
	int n=cin.nextInt();
	for (int i=0;i<n;i++){
	    String a = cin.next();
	    System.out.print(a.length()+" ");
	    if (a.length() % 2 != 0)
		System.out.println(a.charAt(a.length()/2));
	    else
		System.out.println(a.charAt(a.length()/2-1)+""+a.charAt(a.length()/2));
	}
    }
}

C++

#include <iostream>

using namespace std;

int main(){
  int n;
  cin>>n;
  for (int i=0;i<n;i++){
    string a;
    cin>>a;
    cout<<a.size()<<' ';
    if (a.size() %2)
      cout<<a[a.size()/2]<<endl;
    else
      cout<<a[a.size()/2-1]<<a[a.size()/2]<<endl;
  }
}

Pascal

program ans;
var
	s, m: AnsiString;
	l: Integer;
	i, n: Integer;
begin
	readln(n);
	for i := 1 to n do
	begin
		readln(s);
		l := length(s);
		write(l);
		write(' ');
		if l mod 2 = 0 then
			m := s[l div 2] + s[(l div 2) + 1]
		else
			m := s[(l+1) div 2];
		writeln(m);
	end;
end.

C#

using System;
using System.IO;

namespace test
{
    class Program
    {
        static StreamReader streamReader = new StreamReader("..//..//problem.in");
        static StreamWriter streamWriter = new StreamWriter("..//..//problem.out");
        static int n = int.Parse(streamReader.ReadLine());
        static void Main(string[] args)
        {
            // Program.exe runs from [your_source_code_location]\bin\Debug
            // So problem.in and problem.out in near your source code
            try{
                Program2();
            }
            finally
            {
                streamReader.Close();
                streamWriter.Close();
            }
        }

        static void Program2(int n){
            for (int i = 0; i < n; i++)
            {
                string name = streamReader.ReadLine().Trim();
                int k = name.Length / 2;
                string silverChar = name[name.Length / 2].ToString();
                if (name.Length % 2 == 0)
                {
                    silverChar = name[name.Length / 2 - 1] + silverChar;
                }
                streamWriter.WriteLine("{0} {1}", name.Length, silverChar); 
            }
        }
	}
}

VB6

Attribute VB_Name = "SilverLetter"
Option Explicit



Sub Main()
    Const DataPath   As String = "C:\BayanContest\Practice2-SilverLetter\"
    Const InputFile  As String = DataPath & "problem2.in"
    Const OutputFile As String = DataPath & "problem2.out"

    ConvertNewLineInFile InputFile


    Dim i As Integer, count As Integer, s As String, l As Integer
    
    Open InputFile For Input As #1
    Open OutputFile For Output As #2
    
    Input #1, count
    
    For i = 1 To count
        Line Input #1, s
        l = Len(s)
        Print #2, CStr(l) + " " + Mid(s, l \ 2 + (l Mod 2), IIf(l Mod 2 <> 0, 1, 2))
    Next
    
    Close
End Sub



' Changes all EOL (end-of-line) to CrLf. for more information visit: http://en.wikipedia.org/wiki/Newline
Public Sub ConvertNewLineInFile(ByVal FileName As String)
    Dim FileNum As Integer
    FileNum = FreeFile
    
    Dim Buffer As String
    
    On Error GoTo ConvertNewLineInFile_Error
    
    Open FileName For Binary Access Read Write As FileNum
    
    Buffer = String(LOF(FileNum), 0)
    Get FileNum, , Buffer
    
    Buffer = Replace(Buffer, vbLf, vbCr)
    Buffer = Replace(Buffer, vbCr & vbCr, vbCr)
    Buffer = Replace(Buffer, vbCr & vbCr, vbCr)
    Buffer = Replace(Buffer, vbCr, vbCrLf)
    
    Put FileNum, 1, Buffer
    
ConvertNewLineInFile_Error:
    Close FileNum
End Sub

PHP

<?php
$file_name = 'input.in';
$file_contents = file_get_contents($file_name);
$lines = explode("\n", $file_contents);
$t = intval($lines[0]);

for($i = 1; $i <= $t; $i++)
{
	$line = trim($lines[$i]);
	$len = strlen($line);
	echo $len.' ';
	if ($len % 2)
		echo substr($line, $len / 2, 1);
	else
		echo substr($line, $len / 2 - 1, 2);
	echo "\n";
}
  • برگزارکننده مسابقه