FizzBuzz test

โจทย์กรอง programmer ระดับเบื้องต้น

พิมเลข 1 - 100 ตามรูปแบบที่กำหนด โดยมีเงื่อนไขดังนี้

  • พิม traffy ถ้าเลขนั้นๆ หาร 3 ลงตัว
  • พิม nectec ถ้าเลขนั้นๆ หาร 5 ลงตัว
  • พิม nstda ถ้าเลขนั้นๆ หาร 7 ลงตัว
  • กรณีหารได้มากกว่า 1 ตัวเลขให้พิมทั้งสองคำ เช่น ถ้าหาร 3 และ 5 ลงตัว ก็พิม traffy nectec
  • หาเลขนั้นมีเกิน 1 หลัก และ
    • มีตัวเลข 3 ให้ พิม traffy
    • มีตัวเลข 5 ให้ พิม nectec
    • มีตัวเลข 7 ให้ พิม nstda
    • เช่น เลข 33 จะต้องพิม traffy traffy traffy (33) เนื่องจากหาร 3 ลงตัวและมีเลข 3 สองตัว
  • หากตัวเลขใดมีพิมตัวอักษรข้างต้น ต้องใส่เลขนั้นในวงเล็บ
  • รูปแบบ output จะต้องเป็นแบบข้างล่างเท่านั้น ทั้ง space และ comma ตามตัวอย่าง

ตัวอย่าง

1, 2, traffy (3), 4, nectec (5), ..., traffy traffy traffy (33), ...

Note

ดูตัวอย่างด้านล่างโดยไม่ทำเองเลย มันก็ไม่ได้ทำให้ฉลาดขึ้น แต่ถ้าทำแล้วมาดูว่า คนอื่นคิดยังไง นั่นน่าจะทำให้โลกทัศน์กว้างขึ้นได้ แม้ว่าจะ efficient กว่า หรือไม่ก็ตาม

python

#!/usr/bin/env python
kv = {'3': 'traffy', '5': 'nectec', '7': 'nstda'}
result = []
for i in xrange(1, 101):
    mod3, mod5, mod7, t = i % 3 == 0, i % 5 == 0, i % 7 == 0, []
    has = {'3': False, '5': False, '7': False}
    if i/10 > 0:
        for j in has.keys():
            try: str(i).index(str(j)); has[j] = True
            except ValueError: pass
    if mod3: t.append('traffy')
    if mod5: t.append('nectec')
    if mod7: t.append('nstda')
    if any(has.values()):
        for k, v in has.items():
            if has[k]:
                for kk in xrange(len(str(i).split(k)) - 1):
                    t.append(kv[k])
    if any(has.values() + [mod3, mod5, mod7]):
        t.append('(%s)' % str(i))
    else:
        t.append(str(i))
    result.append(' '.join(t))
print ', '.join(result)

JavaScript (es5)

var keyConv = {3: 'traffy', 5: 'nectec', 7: 'nstda'};
var keys = [3, 5, 7];
var result = [];
for (var i=1; i<101; i++) {
  var modText = [], matchText = [];
  for (kIndex in keys) {
    // add mod part
    if (i % keys[kIndex] == 0)
      modText.push(keyConv[keys[kIndex]]);
    for (var j=1; j< (''+i).split(''+keys[kIndex]).length; j++ )
      matchText.push(keyConv[keys[kIndex]]);
  }
  var display = [
    modText.join(' '), matchText.join(' '),
    ((modText.length + matchText.length) > 0 ? '(' + i + ')' : i)
  ];
  var f = display.filter( function(i) { return (''+i).length > 0; } );
  result.push(f.join(' '));
}
console.log(result.join((', ')));