Python 2 - En yakın 6 dakikayı nasıl aşağı/yukarı yuvarlarsınız?

En yakın on dakikaya yuvarlanan çok sayıda insan örneği var ancak en yakın altıya yuvarlamanın ardındaki mantığı bulamıyorum. Etrafında birkaç rakam değiştirmenin bir meselesi olacağını düşünmüştüm ama çalışmasını sağlayamıyorum.

Çalıştığım kod Github'ım adresinde bulunur. Elimdeki blok çalışmaya bile yakın değil (sonuç vermiyor):

def companyTimer():
    if minutes % 6 > .5:
        companyMinutes = minutes + 1
    elif minutes % 6 < 5:
        companyMinutes = minutes - 1
    else:
        companyMinutes = minutes
    print companyMinutes

Şu an baktığımda, mantığımın yanlış olduğunu görüyorum - çalışıyor olsa bile, kodun 1 dakikalık bölümünü ekleme ve çıkarma işleminin bir anlamı yok.

Her neyse, bunun nasıl çözüleceği hakkında hiçbir fikrim yok - biri beni doğru yöne işaret edebilir mi, lütfen?

PS - bu işte kişisel kullanım için yaptığım bir şey. İşim için yardım istememekle birlikte bu, işteki saatlerimi izlememe yardımcı olacak. Bununla ilgili herhangi bir sorun olmasını istemiyorum.

Teşekkürler!

15
Soru gövdesinde 6 dakika, başlığında da 7 dakika mı? Büyük bir fark yaratıyor.
katma yazar Mark Ransom, kaynak
0-2, 0 ve 3-8 ila 6, daha iyisi 0-5 ila sıfır ve 6-11 ila 6 arasında mı olmalıdır?
katma yazar Finwood, kaynak
Tamam, iyi bir başlangıç ​​yaptın. Ancak, dakika 3 ise dakika% 6 öğesinin dönmesi gerektiğini düşünüyorsunuz? 0? 6?
katma yazar Brian Cain, kaynak
dakika ve companyMinutes değişkenleri nerede tanımlanır?
katma yazar Zach Gates, kaynak
Bir saatin en az 1/10'unu elde etmek için "en yakın 6 dakika" nın niyeti var mı? Öyleyse, benim deneyimim, çoğu işyerinin defter tutma işlemlerinde en yakın 1/4 saate yuvarlama kullandığı yönünde olmuştur.
katma yazar brichins, kaynak
Burada bir saatin onda birini bildiririz, yani 8:54 = 8,9 saat.
katma yazar Ross Wardrup, kaynak
Finwood - harika çağrı. Bunun hakkında düşünmedim. Teşekkürler!
katma yazar Ross Wardrup, kaynak
zachgates7 - companyTimer işlevini iptal eden zamanlayıcı işlevinde dakikalar tanımlanır .. Global olarak tanımlamayı unuttum!
katma yazar Ross Wardrup, kaynak

8 cevap

İşte size en yakın x konumuna yuvarlanacak genel bir işlev:

def round_to_nearest(num, base):
    n = num + (base//2)
    return n - (n % base)

[round_to_nearest(i, 6) for i in range(20)]
# [0, 0, 0, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 18, 18, 18, 18, 18]

Açıklama:

  • n % base is the remainder left over when dividing n by base. Also known as the modulo operator.
  • Simply subtracting num%6 from num would give you 0 for 0-5, 6 for 6-11, and so on.
  • Since we want to "round" instead of "floor", we can bias this result by adding half of the base (base//2) beforehand.
20
katma
Neden bölmek yerine vardiya kullandınız?
katma yazar Paul Manta, kaynak
İkili bölmeyi kastediyorsanız, >> 1 yerine //2 kullanın. Bitshifts sadece bit desenleri kullanırken kullanılmalıdır.
katma yazar Bakuriu, kaynak
@JakeGriffin True, ancak aynı zamanda float bölme ve çarpma işlemlerini içerir ve tam sayı yuvarlamaya ihtiyacınız varsa her zaman fazla olan floatları döndürür. Yine de, her ikisinin de mevcut olması, oy kullanması açısından faydalıdır.
katma yazar tzaman, kaynak
@JakeGriffin Eğer bu yüzen için doğru olmasını istiyorsanız, tamsayı bölme yerine gerçek bölme değiştirin.
katma yazar tzaman, kaynak
@Bakuriu - fuar noktası, düzenlendi.
katma yazar tzaman, kaynak
@ Paul Manta - Çoğunlukla alışkanlık, ama aynı zamanda marjinal olarak daha hızlı bir işlemdir.
katma yazar tzaman, kaynak
Emin! Açıklama eklendi, düzenlemeye bakın.
katma yazar tzaman, kaynak
Bu harika! Bunun CS101 olayı olduğuna eminim, ancak kendi kendini eğiten bir programcı olarak, bunun için genel bir algoritma bilmeden çok uzun süredir devam ettim. Teşekkürler!
katma yazar Adam Smith, kaynak
Bu çok zekice. :)
katma yazar Shashank, kaynak
sadece bütünlük için, birkaç kelimeyle açıklar mısın?
katma yazar Julien Spronck, kaynak
Doğru tespit. Ben de seninkileri oyladım.
katma yazar Jake Griffin, kaynak
@ tzaman, biliyorum. Sadece herkesin yüzmek için kullanmaya çalışması durumunda bu konuyu aramak istedim. Ayrıca bu algoritmanın aşırı karmaşık olduğunu düşünüyorum. Okunabilirliği ve kendi kendine belgelendirme kodunu tercih etmeyi seviyorum.
katma yazar Jake Griffin, kaynak
num bir tamsayı değilse, base tuhaf bir değeri için çalışmaz. round_to_nearest (3.9, 7) , 7 yerine 0 sonucunu verir.
katma yazar Jake Griffin, kaynak
Yardımın için teşekkürler, Tzaman! Umarım bu cevap başkalarına da yardımcı olacaktır. Bu topluluğu sev.
katma yazar Ross Wardrup, kaynak

If you want to round to the nearest 7 minutes (e.g. round7(3.6) => 7, round7(17.4) => 14), you can make use of Python's built in round function like so:

def round7(value):
    return round(value/7.0) * 7.0

>>> round7(17.4999)
14.0
>>> round7(17.5001)
21.0

veya daha genel bir işlev:

def round_to_nearest(increment, value):
    return round(value/float(increment)) * increment

>>> round_to_nearest(7, 17.4999)
14.0
>>> round_to_nearest(6, 21.0001)
24.0
3
katma

Peşinde olduğun şey bu mu?

def roundto6(minute):
    return int((minute+3)/6) * 6

for i in xrange(13):
   print roundto6(i),

# 0 0 0 6 6 6 6 6 6 12 12 12 12 12 12
2
katma
katma yazar Blacklight Shining, kaynak
@Finwood: // Python 2 ve 3'te çalışır. Burada float kullanmamalısınız.
katma yazar jfs, kaynak
ancak yalnızca hem a hem de b tamsayılarsa, herhangi biri // float ise, Python2'de de float değerini döndürür
katma yazar Finwood, kaynak
Dikkat: // Python 3 sözdizimidir, Python 2 kullanıyorsanız bunun yerine int (a/b) kullanın
katma yazar Finwood, kaynak
@ Finwood Cevabımı düzenledim ... teşekkürler :-)
katma yazar Julien Spronck, kaynak
@Finwood Bu doğru
katma yazar Julien Spronck, kaynak
python 2.7 kullanıyorum ... iyi çalışıyor
katma yazar Julien Spronck, kaynak
@Finwood Söyleyebileceğim kadarıyla, // bir int veya float döndürmekle ilgili olarak Python 2.7 ve 3.4'te aynı şekilde çalışır.
katma yazar user1107907, kaynak

Bu belki de en akıllıca değil, okunaklı bir deneme :)

myNumber, şu anki dakikanız

myList = range(0, 60, 6) # [0,6,12,18,24,30,36,42,48,54] # all accepted minutes 
myNumber = 8
print(min(myList, key=lambda x:abs(x-myNumber)))
1
katma
tamam ben değiştim
katma yazar svenhornberg, kaynak
myList = range (0, 60, 6) biraz daha anlaşılabilir bir IMO. Ayrıca, yalnızca Python 3'teki jeneratörler.
katma yazar jazzpi, kaynak

sadece yuvarlak kullanın, saatleri 1 hane kadar yuvarlaklaştırın:

>>> import time
>>> import datetime
>>> now = datetime.datetime.now()
datetime.datetime(2015, 4, 9, 20, 4, 20, 578322)
>>> datetime.datetime.fromtimestamp(round(time.mktime(w.timetuple())/3600,1)*3600)
datetime.datetime(2015, 4, 9, 20, 6, 0)
1
katma

Düşünmek için iyi bir yol olacaktır:

def companyTimer(cm):
    minutes = (time.time() - starting_time)/60
    print(minutes)
    if minutes % 6 >= 0.5:
        cm += 1
    return cm

Burada companyTimer tek bir argüman alır: companyMinutes .

>>> import time
>>> starting_time = time.time()
>>> companyMinutes = 0
>>> companyTimer(companyMinutes) # will return 0 until 3 minutes have passed
1
katma

Yuvarlanıyorsanız genel formül

x + (roundtothis - x % roundtothis)

sizin için faydalıdır.

Bunun, soru başlığına dayanarak yediden en yakın katlara yuvarlamak için olduğunu varsayalım, aksi takdirde 6 olarak değiştirin: Yani:

def roundUpToSeven(minute):
    if ( minute % 7 == 0 and minute != 0 ):
        return minute
    else:
        return minute + (7 - minute % 7)

See a working example here

0
katma
min Python'da bir yerleşiktir ve yerliler onu gölgeler. IMO adında farklı bir isim seçmek en iyisi.
katma yazar Brian Cain, kaynak
konumundaki davranış, beklediğinizden yedi katının katı mı? Dakika 7 ise, bu 7 yerine 14 değerini döndürür.
katma yazar Matthew Nizol, kaynak
İyi geribildirim çocuklar, teşekkür ederim, cevabı güncelledim.
katma yazar Hypaethral, kaynak

Sanırım 2'ye 0'a, 3'e 3'e, 4'e 6'ya kadar istemediğinizi sanıyorum.

def companyTimer(minutes, roundingNumber):
  remainder = minutes % roundingNumber

  if remainder > roundingNumber/2:
    companyMinutes = minutes - remainder + roundingNumber
  elsif remainder < roundingNumber/2:
    companyMinutes = minutes - remainder
  else:
    companyMinutes = minutes
  print companyMinutes
0
katma
Yine de, neden 3'te 3'te kalacağından emin değilim, bu yüzden sorunuzu doğru yorumlayıp yorumlamadığımdan emin değilim. Eğer 3 yukarı yuvarlamak istiyorsanız>>> = ve 3 aşağı yuvarlamak istiyorsanız <- <= değiştirin.
katma yazar Tatermelon, kaynak