>source

코딩 챌린지의 일환으로 간단한 문제에 대한 code를 한 줄로 작성하려고 노력했습니다. 현재 두 개의 주사위에서 가능한 모든 순열을 인쇄하려고 합니다. 지금까지 두 개의 for 루프를 사용하는 간단한 알고리즘이 있습니다.

for(int i= 1; i <= 6; i++)
    for(int j= i; j <= 6; j++)
        printf("%d %d", i, j);

한 줄로 쉽게 변환할 수 있는 항목:

for(int i= 1; i <= 6; i++) for(int j= i; j <= 6; j++) printf("%d %d", i, j);

두 프로그램 모두 원하는 순서로 순열을 출력합니다.

1 1
1 2
1 3
1 4
1 5
1 6
2 2
2 3
2 4
2 5
2 6
3 3
3 4
3 5
3 6
4 4
4 5
4 6
5 5
5 6
6 6

이 문제를 더 어렵게 만들기 위해 하나의 루프만을 사용하여 위의 출력과 동일한 순서로 순열을 인쇄하려고 합니다. 나는 이것을 달성하기 위해 나눗셈과 모듈로를 사용해야 할 것이라고 확신하지만, 이것을 달성하는 방법이 막혀서 확신이 서지 않습니다.

참고: 선택한 것으로 보이는 경로는 어두운 면의 경로입니다. 비좁고 모호하지 않은 읽기, 이해 및 유지 관리가 쉬운 code를 작성하기 위해 노력해야 합니다. 성능 요구 사항을 충족하기 위해 필요한 경우에만 code를 복잡하게 만듭니다.

user45813012021-10-28 22:55:35

참고로 공백은 인간을 위한 것입니다. 컴파일러에는 공백이 필요하지 않습니다(일부 기호 분리 규칙 제외). 필독: 국제 난독화 C code 대회. 공백 제거에 대한 이점, 속도 또는 공간이 없습니다. 컴파일러에 관한 한 여전히 동일한 code입니다.

Thomas Matthews2021-10-28 23:05:56
  • 답변 # 1

    2 루프 버전이 가장 읽기 쉽습니다. 그러나 귀하가 요청한 이후로 여기에 몇 가지 1 루프 버전이 있습니다.

    int main()
    {
        int n= 6;
        for (int i= 1, j= 1; i < n; ++j)
        {
            if (j > n)
            {
                ++i;
                j= i;
            }
            std::cout << i << " " << j << '\n';
        }
        std::cout << std::flush;
    }
    

    int main()
    {
        int n= 6;
        int i= 1;
        int j= 1;
        while (true)
        {
            if (j > n)
            {
                ++i;
                j= i;
            }
            if (i > n)
            {
                break;
            }
            std::cout << i << " " << j << '\n';
            ++j;
        }
        std::cout << std::flush;
    }
    


    참고로:

    for(int i= 1; i <= 6; i++) for(int j= i; j <= 6; j++) printf("%d %d", i, j);
    

    끔찍합니다. 절대 이런 code를 작성하지 마세요. 한 줄로 code를 작성하려는 인위적인 목표는 완전히 무의미합니다. 아무 노력 없이 code를 가져 와서 한 줄에 넣을 수 있으므로 전혀 도움이 되지 않습니다.

    한 줄로 작성한다는 개념이 있지만 이는 소스 code의 새 줄을 공백으로 바꾸는 것만이 아닙니다. 그것은 예를 들어. 루프를 함수 호출 또는 연쇄 호출로 대체합니다.

    그리고 무엇보다도 정확하고 깨끗하며 읽기 쉬운 code를 작성하는 것을 잊지 마십시오.

    이것은 두 주사위의 조합을 나열합니다. 순열을 나열하려고 합니다.

    PolarisEmperor2021-10-28 23:14:32

    @PolarisEmperor 맞습니다. 수정했습니다.

    bolov2021-10-28 23:20:12

    솔루션과 팁에 감사드립니다. code를 작성할 때 가독성을 우선시하겠습니다!

    PolarisEmperor2021-10-28 23:26:20
  • 이전 파이썬 데이터 모델 계층 구조 구현
  • 다음 python : Numpy: 벡터화 방식으로 다른 배열의 인덱스를 기반으로 정수 배열 슬라이스의 합계를 얻는 방법은 무엇입니까?