POH! 4Lite가 너무 쉬웠기 때문에 사바를 조사했습니다.

8261 단어 paiza

소개



POH에서 C#은 C라이브러리를 직접 부르거나 자전에서 문자열 수치 변환하는 등의 행위는 일부에서 불평을 샀다.
전회, 사바의 내용이 Ubuntu라고 깨달았기 때문에 디바이스 파일 경유라면 좋지 않을까 생각했지만 그렇게도 아니었다.
그리고 그 과정에서/dev/stdout을 사용할 수 없다는 것을 깨달았다.

조사



어떻게 조사하면 좋은가에 대해서이지만 다음과 같이 bash로 명령을 치면 좋다.

;結果は
lrwxrwxrwx 1 root root 15 Dec 4 10:29 /dev/stdout -> /proc/self/fd/1 
l-wx------ 1 runner2 ubuntu 64 Dec 4 10:29 /proc/self/fd/1 -> /workspace/exec_stdout.txt 
-rw-r--r-- 1 root root 160 Dec 4 10:29 /workspace/exec_stdout.txt 
Linux 263a4c739076 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

위와 같이/workspace/exec_stdout.txt로 리디렉션되고 있지만 중요한 write권이 없기 때문에 심볼릭 링크에 write권이 있어도 안 된다.
user는 runnerX이며 루트 이외에 쓸 수없는 exec_stdout.txt에는 어쩔 수 없다.

그리고 gcc라든지가 움직이기 때문에 쉘을 두드려 모든 언어에 대해 c 소스 컴파일 해 실행으로 클리어 할 수 있을 것이다.
사실은 그 손을 이번에 사용할 생각이었지만, 과제가 너무 쉬워서 그만두었다.

출처



지금 보고 깨달았지만 head와 tail이 반대? (어느 쪽이라도 좋을 것 같다). 왠지 백하는 장어라고 하는 일로 해 두었으면 한다.
덧붙여 코멘트 부분을 복귀해 read와 printf를 삭제하면 일단 C#만의 코드가 되므로, 실행 시간을 비교해 보면 좋을지도 모른다.
ReadInt라고 하면서 uint인 것은 300000x10000이 21억을 넘는 것에 대한 대응이며 리네임 잊기도 한다.
using System;
using System.IO;
using System.Runtime.InteropServices;
public class Query3
{
    [DllImport("libc")]
    static extern int read(int handle, byte[] buf, int n);
    [DllImport("libc")]
    static extern void printf(string format, uint value);
    static byte[] buf = new byte[10000000];
    static int index = 0;
    static uint ReadInt()
    {
        uint ret = 0, tmp;
        while ((tmp = buf[index++]) >= '0')
            ret = ret * 10 + (tmp - '0');
        return ret;
    }
    static void Main(string[] args)
    {
        //var f = File.OpenRead("/dev/stdin");
      // f.Read(buf, 0, 10000000);
        read(0, buf, 10000000);
        var t = ReadInt();
        var n = ReadInt();
        uint sum = 0, tail = 0, max = 0, head = 0;
        uint[] array = new uint[n];
        var loop = t;
        while ((loop--) > 0)
        {
            sum += array[tail++] = ReadInt();
        }
        max = sum;
        loop = n - t;
        while ((loop--) > 0)
        {
            sum = sum + (array[tail++] = ReadInt()) - array[head++];
            if (sum > max)
            {
                max = sum;
            }
        }
        //Console.WriteLine(max);
        printf("%u\n", max);
    }
}

좋은 웹페이지 즐겨찾기