遇到一个挺经典的题,从0开始以1递增,给定一个顶点top,求输出1~top,然后top-1 到1,一直反复下去...

要求:
1、从0开始以1递增,给定一个顶点top,求输出1~top,然后top-1 到1,一直反复下去...
2、只能使用一个表达式

难度:※※※
看似简单,实则费脑...

int top = 7;   // top可以是任一值,需要高兼容性
for (int i = 0; i < 1000; i++)
{
    // 只能使用1个表达式、尽可能的简短
    // 输出:1 2 3 4 5 6 7 6 5 4 3 2 1 2 3 ...

}

当然,大家可以尝试去做一下~~

在此,感谢群里的每一位讨论,献上他们的答案:

using static System.Linq.Enumerable;
using Range = System.Range;

int top = 7;
for (int i = 0; i < 20; i++)   // 为了更可观的输出,这里将 1000 调整 20,不影响
{
    // 南京-开发-   得出:76543212345676...
    Console.WriteLine((Math.Abs(i % 12) - 6) + 1);
    // 调整过来:
    Console.WriteLine(Math.Abs(Math.Abs((i % 12) - 6) - 6) + 1);
    // 简单来讲 思路是123456765432 看成一个整体来就行了,提高兼容性后:
    Console.WriteLine(Math.Abs(Math.Abs((i % ((top * 2) - 2)) - (top - 1)) - (top - 1)) + 1);

    // 日后再说 第一版,缺点很明显,扩展性不行
    Console.WriteLine(8 - (((i / 6) % 2) != 0 ? top++ : top--));
    // 第二版,不使用绝对值的方式,是另一种优雅
    Console.WriteLine((((i / (top - 1)) % 2) != 0 ? top - ((i) % (top - 1)) : ((i) % (top - 1)) + 1));

    // 我的 wosperry
    Console.WriteLine(top - Math.Abs(i % (top * 2 - 2) - top + 1));
    // 原理:
    //1.abs是一个V
    //2.所以-abs是个^
    //3.0对应1      6对应7,通过坐标变换  y-7 = -abs(x-6) 移动过去
    //4.因为是到2就结束,掰手指算出来一共12位,于是 y = -abs(x%12-6) +7

    // 平淡最真,和我的有异曲同工之妙
    Console.WriteLine(top - Math.Abs(i % (top * 2 - 2) - top + 1) % top);

    // 一夜梦惊人
    // Console.WriteLine((i / 7) % 2 == 0 ? i % 7 + 1 : 6 - i % 7);
    Console.WriteLine((i / top) % 2 == 0 ? i % top + 1 : top - 1 - i % top);

    // 左边
    Console.WriteLine(Range(1, 6).Concat(Range(2, 6).Reverse()).ElementAt(i % 12) + " ");
}

当然,答案不止一种,大家还有其他答案的话,可以踊跃留言~~

posted @ 2022-09-14 21:04  醉马踏千秋  阅读(57)  评论(0编辑  收藏  举报