รบกวนช่วยสอนการบ้านหน่อยครับ

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

1.มีทหาร10 คนยืนเข้าแถวหันหน้าไปทิศเดียวกัน ยกเว้นคนแรก ทุกครั้งที่ครูฝึกเป่านกหวีดให้คนที่หันหน้าเข้าหากัน กลับหลังหัน จงหาจำนวนครั้งที่ทำให้เกิดครั้งในการหมุนมากที่สุดครับ เช่น arr=[><<<<<<<<<]

2.จงหาจำนวนที่หารไม่ลงตัว prime number (หารด้วย 1 และ ตัวเองได้เท่านั้น) ให้หามา 200 ร้อยจำนวน

3.จงหาจำนวนวันเสาร์ อาทิตย์ ของปีที่กำหนด
- 2002
- 2008
- 2009
4.ต้องการ resize รูปภาพให้อยู่ในกรอบที่ต้องการ (200x200 pixcel) จงหาขนาดของรุปใหม่ พร้อมตำแหน่ง x,y ใหม่
x = 0 , y = 0,w = 200, h = 200

5.แปลงค่า ตัวเลขเป็นภาษา อังกฤษ (20 คะแนน T_T)
เช่น 100 = one hundres
6.แปลงค่าตัวเลขเป็น ภาษาไทย(25คะแนน T_T)
7.แปลงตัวเลขโทรศัำพท์
x=("0849615852") => 084-961-5852

รบกวนช่วยหน่อยนะครับ อยากได้เฉลยเพื่อ ใช้ทำความเข้าใจในการสอบ

taiko_gogo's picture

ข้อ 6 นี่ อ่านของที่พี่ revolution ทำไว้โลด ส่วนข้อ 5 ก็ทำนองเดียวกับ 6 แต่ง่ายกว่า
(เพราะภาษาไทยมันมีเรื่อง เอ็ด ที่อภิปรายกันไปในtopic ก่อน ๆ )


ข้อ 7 นี่ง่ายดี ตอบข้อ 7 ก่อนดีกว่า

 x=/(\d{3,})(\d{3,})(\d{4,})/
 y="1112223333"
 y.gsub(x,'\1-\2-\3')

ข้อ 1 น่าสนุกดี คิดก่อน เพิ่มเติม: งง จำนวนครั้งของที่ทำให้
เกิดการหมุนมากที่สุดนี่หมายถึงจำนวนครั้งในการเป่าหรอครับ?
อย่างตามตัวอย่าง ><<<<<<<<< นี่ เป่าที่นึง ก็มีหมุนแค่
ที่ละคู่เองไม่ใช่หรอครับ? งงอ่ะ
ข้อ 4 ไม่เก็ตโจทย์ แล้วตอนแรกรูปมันอยู่พิกัด อะไรอ่ะ
แล้วกรอบมันอยู่พิกัดอะไรอ่ะ แล้ว resize นี่ เป็นแบบ
ให้คง ratio เดิมใช่ป่าวครับ
ข้อ 2-3 ขี้เกียจทำรอพี่ ๆ คนอื่นมาช่วยตอบ ;P

เพิ่ม ทำข้อ 2 เล่น ๆ เขียนแบบใช้ครั้งเดียวทิ้ง ;P

class PrimeCollector
  attr_accessor :prime_set,:q
  def initialize(q)
    @q = q
    @prime_set=[2]
  end
  def genPrime()
    i=2
    while(@prime_set.length<@q)
      if isPrime?(i)
        @prime_set.push i
      end
      i = i+1
    end
    @prime_set.each {|p| puts p}
  end
  def isPrime?(i)
    @prime_set.each do |p|
      return false if i%p==0
    end
    return true
  end
end
x=PrimeCollector.new(10)
x.genPrime() # [2,3,5,7,11,13,17,19,23,29]

ข้อแรกถ้าทำถึกๆก็น่าจะเป็น

  • ไล่หาไปทีละกรณี ตั้งแต่ ‘>>>>>>>>>>’ ไปจนถึง ‘<<<<<<<<<<’
  • ในแตละกรณีก็ให้นับจำนวนครั้งที่หันทั้งหมด
  • การเช็คจำนวนครั้งที่หัน ทำได้โดยการเช็คทีละรอบของการเป่านกหวีด

ฟังก์ชันก็ประมาณนี้

#!/usr/bin/python
 
def turn(line):
    """หาจำนวนของการหมุน ในแต่ละรอบการเป่านกหวีด"""
    n = line.count('><')
    line = line.replace('><', '<>')
    return n, line
 
def countTurns(line):
    """หาจำนวนครั้งของการหมุนทั้งหมดในแถว"""
    (n, line) = turn(line)
    count = n 
    while n is not 0:
        (n, line) = turn(line)
        count = count + n 
    return count
 
def int2bin(n, fillto = 1): 
    """แปลงเลขฐานสิบเป็นเลขฐานสอง"""
    binStr = ''
    if n < 0:
        raise ValueError
    while n > 0:
        binStr = str(n % 2) + binStr
        n = n / 2 
    while len(binStr) < fillto:
        binStr = '0' + binStr
    return binStr
 
def maxPossibleTurns(num):
    """หาลักษณะของแถวที่ทำให้เกิดการหันมากที่สุด และจำนวนครั้งที่หัน ของแถวที่มีทหาร num คน"""
    max = 0 
    maxStr = ''
    for i in range(0, 2**num):
        line = int2bin(i, num)
        line = line.replace('1', '>')
        line = line.replace('0', '<')
        n = countTurns(line)
        if n > max:
            max = n 
            maxStr = line
    return max, maxStr

ถ้าสังเกตก็จะเห็นว่าไม่ว่าจำนวนทหารจะเป็นเท่าไหร่ คำตอบสูงสุดจะอยู่ในรูป ‘>><<<’, ‘>>><<<’, ‘>>><<<<’ เสมอ

ทำไม?

ผมว่าอาจารย์เขาคงอยากให้คิดตรงนี้ด้วยนะครับ น่าสนใจมากเลย ลองพิสูจน์กันดู

taiko_gogo's picture

ไม่ใช่ว่าโจทย์มัน fix format ของการหันตอนแรกมาอยุ่แล้วหรอครับ?
หรือผมเข้าใจผิด
มีทหาร10 คนยืนเข้าแถวหันหน้าไปทิศเดียวกัน ยกเว้นคนแรก -> นี่อ่ะ
ผมว่าโจทย์น่าจะเป็นให้ หา format ที่มีการหันมากที่สุด
ในจำนวนครั้งการเป่าที่เท่ากัน มากกว่า

อ้าว ผมเข้าใจผิดเองครับ แย่เลย
แต่ผมว่าแบบนี้มันก็สนุกดีนะ

ข้อหนึ่งหมายถึงจำนวนสูงสุดที่ทหารหมุนครับ นั่นก็คือการที่ครูฝึกเป่านกหวีดนั่นเองครับ เป็นการ fix โจทย์ตามที่ให้มาครับ แล้วจึงทำการหารอบครับ

่ส่วนข้อ 4 น ี่ อาจารย์กำหนด ขนาด x =50 ,y=50 ,w=100 ,h=200 ครับ

ขอบคุณพี่ ๆ ทุกคนที่ช่วยตอบมาก ๆเลยครับ ได้แนวคิดไปใช้ในการสอบเพิ่มขึ้นเยอะเลยครับ ขอบคุณครับ

apirak's picture

จำนวนครั้งของข้อหนึ่งน่าจะหมายถึงจำนวนครั้งที่ครูฝึกต้องเป้านกหวีด จนกระทั้งทหารไม่สามารถหมุนได้ ก็คือไม่มีใครหันหน้าเข้าหากัน

โจทย์ข้อหนึ่งน่าจะเป็นการหารูปแบบการเข้าแถวที่ทำให้ครูฝึกต้องเป่านกหวีดมากที่สุด

>
def peep(solder) 
  #solder.gsub(/></,"<>")
  new_solder = String.new(solder)
  (solder.length-1).times do |i|
    if solder[i..i+1] == "><"
       new_solder[i] = "<"
       new_solder[i+1] = ">"
    end
  end
  new_solder
end
 
def count_peep(new_solder)
  solder = ""
  i = 0
  while new_solder != solder
    new_solder, solder = solder, new_solder 
    new_solder = peep(solder)
    i += 1
  end
  i-1
end
 
def int_to_bin(n, fillto = 1) 
    binStr = ''
    while n > 0
      binStr = (n % 2).to_s + binStr
      n = n / 2 
    end 
    while binStr.length < fillto
      binStr = '0' + binStr
    end
    return binStr
end
 
def max_possible_turns(num)
    max = 0 
    maxStr = ''
    (0..2**num).each do |i|
      line = int_2_bin(i, num)
      line = line.gsub(/1/,'>')
      line = line.gsub(/0/,'<')
      n = count_peep(line)
      if n > max
        max = n 
        maxStr = line
        #print "max= #{n} solder=#{line} \n"
      end
    end
    return max, maxStr
end
 
print max_possible_turns(10)
 
</blockcode>
 
ลองเขียนแบบไม่ใช้ count (เพราะจำไม่ได้ :p ) และ เป็นการนับจำนวนครั้งที่เป่าแทน
 
Apirak
apirak's picture

คำสั้ง count ใช้แบบนี้แทน x.scan(/a/).length หรือมันมีคำสั่ง count ตรงๆ มั้ยเนี่ย

ไปเปิด api doc มา... มันมี count จริงๆ ด้วย

x.count ได้เลย

Apirak

ช่วยอธิบายข้อสองเพิ่มเติมได้มั๊ยครับ ไม่เข้าใจครับ และ มันหา 200 จำนวนยังไงครับ?

taiko_gogo's picture

ถ้าเอาไอ้ที่ผมเขียนเร็ว ๆ ข้างบนนั่น
จะหา 200 ตัว ก็ใช้
x=PrimeCollector.new(200)
x.genPrime()
อ่ะ
ส่วนไอเดียก็ง่าย ๆ ถึก ๆ
ตอน new ผมให้รับจำนวนprime ที่อยากได้
แล้วก็ initial @prime_set ขึ้นมาไว้เก็บค่า prime โดย
ให้prime ตัวแรกคือ 2 เก็บไว้ก่อน
พอเรียก genPrime ก็เป็นการวนลูปธรรมดาอ่ะ
ไล่ตั้งแต่ 2 ไปเรื่อย ๆ ถ้าเจอ prime ก็ยัดเก็บไว้ใน
@prime_set วนไปจนขนาดของ@prime_set ได้
ครบตามที่เราใส่ตอน new อ่ะ
ส่วนวิธีเชคว่าเป้น prime ไหม ก็อาศัยว่า
เอา prime ตัวที่เก้บไว้แล้ว มาหาร ถ้าหารลงตัว
ก็แปลว่าไม่ใช่ แต่ถ้าเอา prime ทุกตัวหารแล้วไม่ลงตัวเลย
ก็แปลว่าใช่ prime ตัวใหม่

หวังว่าผมคงไม่พูดให้งงนะ

ขอบคุณมากครับ แต่มาช้าไปนิสสสสสส T_T

มาขอสูบความรู้ด้วยคนครับ
ขอบคุณครับ

You will never work alone

ข้อ 3 กับ ข้อ 4 ยังไม่มีใครเฉลยเลยครับ T_T

taiko_gogo's picture

ข้อสาม

  def calNDay(day,year) # day is integer in 0..6 (sunday....saturday)
    return ((((fday = Date.strptime("#{year}-1-1")).leap? ? 366 : 365) - ( (tmp=day - fday.wday) >= 0 ? tmp : 7-tmp ))/7 )+1
  end
  calNDay(0,2008) # 52

อธิบาย :
-หาวันแรกของปีที่ต้องการ แล้วเช็คว่าเป็นleap year หรือไม่
-ดูว่า วันที่ เราต้องการ อยู่ ก่อนหรือ หลัง วันแรกของปี
ถ้าอยู่ก่อน วันแรกของปี (เช่น เราจะหาวันอาทิตย์ แต่วันแรกของปีดันเป็นวันอังคาร)
ก็หาผลต่าง ว่าอีกกี่วันจะถึงวันที่เราต้องการ โดยเรา 7 มาลบ จาก ผลต่างของวันที่ต้องการ
กับวันแรกของปี
ถ้าอยู่หลัง ก็เอาเฉพาะผลต่างของวันที่ต้องการ กับวันแรกของปี
- เอาจำนวนวันทั้งหมดของปี มาลบด้วย ผลต่างของวันจากข้างบน แล้ว หาร 7
+1 ด้วย เพื่อนับวันที่ต้องการวันแรก

ข้อสี่อ่านโจทย์แล้วก็ไม่เคลียร์อยู่ดี เลยไม่ทำละกัน

ขอบคุณมาก ๆครับ

ผมลอง run ดูปรากฏว่า error ว่า unintialized constant Date (Name Error) ครับต้องแก้ไขยังไงครับ

เอ้..
เมืองไทยมีที่ไหนสอน Ruby ในห้องเรียนกันบ้างเอ่ย

taiko_gogo's picture

อยากรู้ด้วยคน -3- ศิลปากร อ๊ะป่าว?

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น