现金奖励:挑战编程极限的问题

悠悠然然 发布于 2015/08/14 17:33
阅读 4K+
收藏 8

今天我想挑战一下OSCHINA的亲们的编程能力,出一道百度、谷歌不到答案的问题,第一个挑战成功的,直接奖励现金100元RMB(本人也是苦B码农,纯属意思一下)。

以前发过一条循环语句打印螺旋矩阵和蛇型矩阵的博客,今天我们来挑战只出现一条循环语句来打印99表。

注意,此题是考思想的,用“*”之外的运算符,如 "&  |  ^  >> << / % "的,虽然确实可以有解,但是代码逻辑与我倡导的:"一个好的算法首先是简单易懂的,其次是清晰明了的,再个一定是充满美感的"是相违背的。为什么下面条件这么多,实在是亲们的创意无限,我防不胜防哦。

特别声明:

  • n可以是任意正整数,只要N的平方不要溢出都可以
  • 一行一行print结果的无效
  • 不允许出现if,switch,?:语句及判断语句的变体,也就是只允许循环变量做条件比较以确定循环次数,不允许其它变量进行条件判断
  • 不允许出现异常
  • 循环语句中只能有一个变量
  • 代码行数超过100行的无效
  • 如果 @红薯 能抢先给出答案,奖金跃升为250元RMB
  • 提交问题并关注本人,回答才有效
  • 答案是否有效解释权归悠然所有

问题如下

不管是什么编程语言,只要是在程序中只用了一条循环语句正确的输出了99表,那么就算挑战成功。

下面是我的测试用例:

测试1:

public static void main(String[] args) {
        new Test99().print(9);
}
运行结果:
 1
 2 4
 3 6 9
 4 8 12 16
 5 10 15 20 25
 6 12 18 24 30 36
 7 14 21 28 35 42 49
 8 16 24 32 40 48 56 64
 9 18 27 36 45 54 63 72 81
测试2:
public static void main(String[] args) {
        new Test99().print(5);
}
运行结果:
 1
 2 4
 3 6 9
 4 8 12 16
 5 10 15 20 25
第一个回答正确的人将获得奖励,以时间为准。
加载中
1
katyusha
katyusha
public class Test {
    public static void main(String[] args) {
        _99(9);
    }

    public static void _99(int m){
        int i = 1;
        while (i <= m){
            printLine(i);
            i++;
        }
    }

    private static void printLine(int m) {
        print(m, 1);
    }

    private static void print(int m, int k) {
        System.out.print(m + " * " + k + " = " + m * k + "\t");
        if (k < m) {
            print(m, k+1);
        } else {
            System.out.println();
        }
    }
}




redraiment
redraiment
回复 @悠悠然然 : 递归不算循环?
那天早上
那天早上
一行一行print结果的无效
悠悠然然
悠悠然然
回复 @悠悠然然 : 此条得奖是因为我当时缺个不能有if switch ?:的条件,现在补上了,但是他当时没有违反规则,因此奖100
悠悠然然
悠悠然然
回复 @katyusha : 可以接着挑战
katyusha
katyusha
回复 @悠悠然然 : 已收到100RMB ^_^
下一页
1
南阳人
南阳人
拿Python来凑个热闹
def main(row_count):
    for row_idx in range(1, row_count+1):
        row = map(lambda x:x*row_idx, range(1, row_idx+1))
        print(str(row)[1:-1].replace(",",""))

if __name__ == '__main__':
    print("-"*25)
    main(5)
    print("-"*25)
    main(9)
    print("-"*25)
    main(99)



悠悠然然
悠悠然然
回复 @sjack : 这个,理论上应该是违规的,呵呵。本来是考写一个堆栈的,结果你直接就用Java里的Stack,结果就说完成了。 意思差不多的。
sjack
sjack
终于看到一个用语言自身的特性打破这个题目了,
sjack
sjack
回复 @悠悠然然 : range(1, row_idx+1) 我觉得这是一个实质上的循环
南阳人
南阳人
回复 @007 : map的作用是以参数序列中的每一个元素调用function函数,应该是用循环实现的。
悠悠然然
悠悠然然
回复 @南阳人 : 这个语言我真的不熟悉,看看会的人怎么说。
下一页
1
007
007

来个java版的吧

public static void print(int n){
    		int i = 1;
    		int j = 1;
    		String flag[] = {"", "\n"};
    		while(i <= n){
    			System.out.print((i*j) + " ");
    			int nextj = (j % i)+1;
    			int nexti = (j / i) + i;
    			System.out.print(flag[nexti - i]);
    			i = nexti;
    			j = nextj;
    		}
    	}



1
无争
无争

beetl群友5740509的解法

/**
javascript 版, chrome 浏览器, CTRL+SHIFT+I 打开调试器 -> console选项卡 粘贴代码并回车:

**/
function _99x(n){
    function iterate(n, callback){
        for(var idx = 1; idx <= n; idx++)
            callback(idx, n);
    }
    iterate(n, function(start, end){
        iterate(start, function(start, end){
            console.log(start * end);
        })
        console.log('-------')
    })
}




悠悠然然
悠悠然然
iterate是不是也相当于循环?那就多个循环了
1
景樗子刘
景樗子刘
public class MultiplicationTable2 {

	int line = 1;
	int cursor;

	public void print(final int maxLine) {

		for (cursor = 1; cursor <= line || enter() <= maxLine; cursor++) {
			System.out.print(cursor * line + "\t");
		}

	}

	public int enter() {
		System.out.print("\n");
		line++;
		cursor = 1;
		return line;
	}

	public static void main(String[] args) {
		new MultiplicationTable2().print(9);
	}

}



甘适之
甘适之
[11]u7i美女8iii互不还不互好女孩。u好好奇偶v经济
泥瓦匠BYSocket
泥瓦匠BYSocket
回复 @景樗子刘 : 不错不错~
景樗子刘
景樗子刘
这算几个循环变量
1
DK47
DK47

引用来自“newriver”的评论

import org.nn.Row;

public class Main {


    public static void main(String[] args) {

        Integer n = 9;

        Row row = new Row();
        String r = row.getNNStr(n, "\n\r");

        System.out.println(r);
    }
}

package org.nn;


/**
 * NNTemplate
 *
 * @author ###
 * @date 15/8/16
 */
public abstract class NNTemplate {

    /**
     * 遍历当前维度的结果
     * @param n length
     * @param p split
     * @return
     */
    public String getNNStr(Integer n, String p) {

        String r = "";

        for (int i = 1; i <= n; i++) {
            r += this.doNN(i,n) + p;
        }

        return r;
    }


    /**
     * 生成要打印的字符串【循环中的单个元素】
     * @param i length
     * @param j rank
     * @return
     */
    public abstract String doNN(int i,int j);

}

package org.nn;

/**
 * Row
 *
 * @author ###
 * @date 15/8/16
 */
public class Row extends NNTemplate {


    @Override
    public String doNN(int i,int j) {
        return new Cell().getNNStr(i," ");
    }
}

package org.nn;

/**
 * Cell
 *
 * @author ###
 * @date 15/8/16
 */
public class Cell extends NNTemplate {


    @Override
    public String doNN(int i,int j) {
        return String.valueOf(i*j);
    }
}


@悠悠然然 不知道这样算不算过,另外 可不可以把问题升级一下,改成本质上只允许一个循环的,探索一下。

function _99x(n){
    function iterate(n, callback){
        for(var idx = 1; idx <= n; idx++)
            callback(idx, n);
    }
    iterate(n, function(start, end){
        iterate(start, function(start, end){
            process.stdout.write(start * end + ' ');
        });
        process.stdout.write('\n');
    })
}


我第一次写的这个实际上跟此答案思路相似,都是模板方法,横向或纵向都是遍历, 不同的是遍历过程中的处理逻辑(一个是算乘积, 另一个是输出换行以及启动横向遍历过程), 实质上就是把循环逻辑抽取出来(比如一个叫"遍历器"或者叫"遍历模板"的东西), 留个回调方法, 做不同的逻辑处理,如果此题通过,我写的也算通过了
悠悠然然
悠悠然然
回复 @悠悠然然 : 写得也非常好~~
悠悠然然
悠悠然然
总结得非常好~~
0
sjack
sjack
    for (int i = 1, j = 1; j <= 9; i++)
    {
     System.out.printf("%d*%d=" + i * j + " ", i, j);
     if (i == j) {
      i = 0;
      j++;
      System.out.println();
     }

    }


//  是不是不对?

sjack
sjack
回复 @悠悠然然 : 额,大叔 这是之前的题的答案
悠悠然然
悠悠然然
回复 @sjack : 没注意到,你里面有个if语句
sjack
sjack
@悠悠然然 对的, java
悠悠然然
悠悠然然
亲,你自己找个环境执行一下,如果对了的话,回复我。
0
首席打酱油
首席打酱油
package everydaydo;


public class OSC {


public static void main(String[] args) {
OSC.fun1(9);
}


public static void fun1(int n){
StringBuilder sb = new StringBuilder();
for(int i=1;i<=n;i++){
sb.append(fun2(i));
}
System.out.println(sb.toString());
}

public static String fun2(int m){
StringBuilder sb = new StringBuilder();
for(int i=1;i<=m;i++){
sb.append(i*m+"\t");
}
sb.append("\n");
return sb.toString();
}


}

悠悠然然
悠悠然然
这个有两个循环语句了。
0
katyusha
katyusha
我那个比两个For循环还慢
返回顶部
顶部