Gå til innhold

Ny Python-konkurranse, frist 4.juli


Anbefalte innlegg

Vel den mangler kommentarer, docstrings, og generelt litt vanskelig å forstå. Det var da heller ikke noen regel som sa at den skulle være så kort som mulig?

 

edit: glem det siste der, men uansett kortest kode er da ikke noe vits i? Best, mest lesbar og kjappest burde kode vinne

6427091[/snapback]

 

Problemet er at det må kunne måles for å avgjøre hvem som er "vinner". Antall bytes er et mål, hastighet kunne ha vært et mål. Men "best" og "mest lesbar" blir fort en smakssak. Det er ganske vanlig med "korthet" som mål. Ref: http://www.pycontest.net/

 

Vi kan godt ta en konkurranse til når denne er ferdig der det er om å gjøre å "oversette" en diger tekstfil fortest, eller noe.

 

Men jeg er ikke helt enig med deg i at kortest er poengløst. Jeg har lært mye av å knote med dette.

Lenke til kommentar
Videoannonse
Annonse
Vel den mangler kommentarer, docstrings, og generelt litt vanskelig å forstå. Det var da heller ikke noen regel som sa at den skulle være så kort som mulig?

 

edit: glem det siste der, men uansett kortest kode er da ikke noe mål? Best, mest lesbar og kjappest  kode burde vinne

6427091[/snapback]

 

 

"Kjappest" og "mest lesbar" er ofte i konflikt fordi optimalisering gjerne fører med seg mye som går utover lesbarheten. Men under er et forsøk på begge deler. Tar ca 1.85 sek. på min bærbare.

 

# -*- coding: UTF-8 -*-
import random, locale, re
locale.setlocale(locale.LC_ALL,'')
from string import letters # now localised
locale_letters = dict(zip(letters, letters))
random_shuffle = random.shuffle
rx_non_alphas = re.compile('([^%s+])' % letters, re.L)
re_split = re.split
concat = ''.join

def cambridge(s):

   def no_shuffle(word, length):
       """ Return True if word not to be shuffled """
       if length > 3 and word[1] != word[2]: return False
       if length < 4: return True
       elif (length - 2) * word[1] == word[1:-1]: return True
       return False
   
   def shuffle(s, length):
       """ Shuffle chars in s until different from s """
       if length == 2:return s[1] + s[0] # flip letters only...
       chars = list(s);pre_shuffle = chars[:]
       while chars == pre_shuffle:random_shuffle(chars)
       return concat(chars)

   def translate(s, length):
       if s.isalpha(): # only letters here
           if no_shuffle(s, length): return s
           b, m, e = s[0], s[1:-1], s[-1]
           return b + shuffle(m, length - 2) + e
       else:  # s is "didn't", "Lilja4ever", "python-konkurranse" etc.
           parts = re.split(rx_non_alphas, s)
           for ix, part in enumerate(parts):
               if part.isalpha():
                   length = len(part)
                   if not no_shuffle(part, length):
                       b, m, e = part[0], part[1:-1], part[-1]
                       parts[ix] = b + shuffle(m, length - 2) + e
           return concat(parts)

   def extract(s):
       """ Extract word from puctuation etc. translate() and rebuild string """
       lix = 0; rix = 0; length = len(s)
       if length < 4: return s

       #locate first and last letter positions
       for char in s: 
           if char in locale_letters: 
               break
           lix += 1
       for char_ix in xrange(length - 1, -1, -1): 
           if s[char_ix] in locale_letters:
               rix = char_ix + 1
               break

       if length == lix: return s
       return s[:lix] + translate(s[lix:rix], rix - lix) + s[rix:]
   
   return ' '.join(extract(w) for w in s.split())

def test(times = 3000):
   from time import clock
   strings = [
       "I didn't say I couldn't do it!", 
       'Dette er en Python-konkurranse',
       '1234567890', '7 AM', "MI5", '(M-1)', '"quoted string"',
       'Lilja4ever', '&%@!', 'Norske tegn: æøåÆØÅ', 'F.1910',
       'En helt vanlig setning med seks ord.', 'shit!!?',
       '1.september', '1. september', 'MI5abcdefgMI5', 'A',
       'ikke', 'ikkkke']
       
   t1 = clock()
   for x in xrange(times):
       for s in strings:
           cambridged = cambridge(s)
           if times == 1:
               print s, cambridged
   t2 = clock()
   print "%s runder tok %s sekunder." % (times, t2-t1)

test()

Lenke til kommentar

Kanskje man kan lage et program som veksler et gitt beløp i kroner over til sedler og/eller mynter. foreksempel vil 2360, 50 bli vekslet slik:

 

1000 kr: 2

100 kr: 3

50 kr: 1

10 kr: 1

50 øre: 1

 

beløp større eller det samme som 25 øre og beløp mindre eller dt samme som 75 øre vil bli avrundet til 50 øre. Programmet prøver å alltid å veksle til høyest mulig antall store sedler/mynter.

 

bare et forslag. :)

 

 

 

Edit: når jeg tenker meg om er dette kanskje ganske for lett for de fleste av dere.

Endret av Sondre1504
Lenke til kommentar

Jeg blir gjerne med på en ny konkurranse, men stikker snart på ferie. Syns det er vanskelig å finne ok oppgaver. De bør være mulig å løse for alle med litt jobbing og det bør helst ikke ligge en zillion løsninger på nettet. Det er problemet med primtall, fibonacci-rekker og forsåvidt md5 og veksleautomater også.

 

Kult hvis vi fortsetter med dette framover. Innvendingen om vinnerkriteriet er høyst gyldig, så vi kan prøve oss både med hastighet, "mest pythonic", kodelengde, eller kombinasjoner alt ettersom hvor det passer best. Det er utrolig lærerikt med små konkurranser - gir masse erfaring som kan brukes i andre sammenhenger.

Lenke til kommentar
Det er zipfile.ZipInfo du skal bruke ja. Vet ikke hva headeren på fila er jeg da, men du finner ikke svaret direkte i innholde til filene, men du må bruke innholdet i filene for å få riktig svar.

6439260[/snapback]

 

Hmm. Kikka på det. Kan det være EGONYX?

Lenke til kommentar

En plass må jeg jo finne oppgavene. :p

 

Men hvis noen vil ha svaret, så er det her:

 

Ordet:

Skjult tekst: (Marker innholdet i feltet for å se teksten):

****************************************************************
****************************************************************
**                                                            **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE NN      NN  **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE  NN    NN   **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **
**   OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **
**   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE     NN      **
**                                                            **
****************************************************************
**************************************************************

Eksempel på kode:

Skjult tekst: (Marker innholdet i feltet for å se teksten):

import zipfile
import sys

f = zipfile.ZipFile("zip.zip", 'r')
nothing = "90052"
for i in range (0, len(f.infolist())):
   try:
       info = f.getinfo(nothing + ".txt")
       sys.stdout.write(info.comment)
       nothing = f.read(nothing + ".txt").split()[-1]
   except KeyError:
       continue   
f.close() 

Endret av FraXinuS
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...