Gå til innhold

Ny Python-konkurranse, frist 4.juli


Anbefalte innlegg

Prøver meg med en ny og enklere konkurranseidé som kan gjøres i "pure Python".

 

For noen år siden gikk denne historien nettet rundt:

 

Aoccdrnig to a rscheearch at Cmabrigde Uinervtisy, it deosn't mttaer in waht oredr the ltteers in a wrod are, the olny iprmoetnt tihng is taht the frist and lsat ltteer be at the rghit pclae. The rset can be a toatl mses and you can sitll raed it wouthit porbelm. Tihs is bcuseae the huamn mnid deos not raed ervey lteter by istlef, but the wrod as a wlohe."

 

Dvs:

According to a researcher at Cambridge University, it doesn't matter in what order the letters in a word are, the only important thing is that the first and last letter be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself but the word as a whole.

 

Oppgaven er å lage en funksjon som heter cambridge. Den skal ta en streng som argument og returnere den slik at den er som vist øverst.

 

Gotchas

- Store bokstaver skal bevares.

- Tegnsetting skal bevares.

- Bindestreker skal bevares

- Tall (sifre) skal være uforandret.

- Edit: Koden må funke med norsk og vanlige vanlige europeiske tegn som "é, ñ" osv.

 

Skisse

 


def cambridge(s):
   # diverse prosessering

   return cambridged

print cambridge('Dette er en Python-konkurranse.')

>>> [i]Dtete er en Pthoyn-knknsoaurre.[/i]

 

Kortest kode vinner (antall tegn).

 

Vi poster koden i forumet. Det er ikke så nøye. Copycats vil avsløre seg selv.

 

Frist

Tirsdag 4.7 kl. 20.00

Endret av zeitgeist
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet-8fx0y6VV

Her er mitt bidrag til denne konkurransen. Har ikke med noen dokumentasjon eller narmale variabel navn siden det er den som har minst tegn som vinner.

 

EDIT:

 

Fant en del feil som gjør at jeg må skrive om hele koden, så derfor fjerner jeg den.

Endret av rapt0r
Lenke til kommentar

Hei wtf, jeg laga jo dette for noen dager sia. Endra noen variabel og funksjonsnavn nå da. Mulig jeg skriver den om litt etterhvert, dette var bare for meg sjøl.

 

-Vil ha noen problemer med non-ascii-bokstaver som æ,ø,å.

-Tegn i begynnelsen av en streng vil antas å være en del av stringen.

-Det samme gjelder tegn inni stringen

-Ikke alltid hvert ord blir konvertert, mulig jeg kjører en shuffle i en loop etterhvert

 

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import random, string


#
# tekst: 'hallo hvordan går det??'
# returner ['hallo', 'hvordan', 'går', ['det', '??']]
#
#
def ascii_non_ascii(txt):
   """rstrips non_ascii text,savs those signs, returns them in retval2
   
   returns (string text, string possible_non_ascii_appended_to_text)"""
   l = list(txt)
   non_ascii = []
   while l[-1] not in string.ascii_letters:
       non_ascii.insert(0,l[-1])
       del l[-1]
     
   return (''.join(l) , ''.join(non_ascii))
   
def cambridge(s):
   """processes string s into a list and a text representing a cambridget version of s

   returns tuple (scrambled_list, as_txt)
   """
   words = s.split()
   scrambled = []
   for word in words:
       ascii, non_ascii = ascii_non_ascii(word)
       #append, dont shuffle if word == word[0] + word[1]
       if len(ascii) <= 2:
           if __debug__:
               print 'not scrambling word', word, 'not enough chars'
           scrambled.append(word)
       
           
       else:
           #drop first + last
           to_scramble = list(ascii[1:-1])
           # todo: add while, make sure that to_scramble[0] + to_scramble[1]... 
           # isnt the same = infinit loop
           random.shuffle(to_scramble)        
           scrambled.append(ascii[0] + ''.join(to_scramble)  + ascii[-1] + non_ascii)
   return (scrambled, ' '.join(scrambled))    

print 'welcome to the randomize text script, please enter your text:'
to_cambridge = str(raw_input())
#splits by space AND takes care of double spaces, no need to filter :D

l, txt = cambridge(to_cambridge)
print 'ny tekst er som følger:', txt         

Lenke til kommentar

Veldig kort! Men prøv med

 

print cam("Kjære Øyvind!")

print cam("Premien er 1000000 kroner")

 

Og hva med ord som "idé", eller "Dette vær-fenomenet kalles El Niño"?

 

Så også at "Dette" av og til kom ut som "Dette", for du sjekker ikke for ulikhet.

 

Har sittet og kikket på det jeg og. Fant kjapt ut at det er mer tricky enn det først ser ut til. Min ser ut til å funke, men den er laaaang. 65 linjer ;-)

 

Ganske gøy!

Lenke til kommentar
Gjest Slettet-8fx0y6VV

Vet at programmet mitt ikke klarer i18n delen, men siden oppgaven ikke sa noe om det tenkte jeg ikke noe mere på det. Det med tallene er bare en bug som jeg får se litt mere på.

Lenke til kommentar
Vet at programmet mitt ikke klarer i18n delen, men siden oppgaven ikke sa noe om det tenkte jeg ikke noe mere på det. Det med tallene er bare en bug som jeg får se litt mere på.

6417455[/snapback]

 

 

Ooops. Jeg har hele tiden tenkt genrelet språk, norsk osv., men det er rett at det ikke står i oppgaven.

 

Jeg foreslår at vi føyer til det i oppgaven. Kjipt å bruke så mye tid på dette og ikke kune bruke resultatet på norske tekster. Hva syns du?

Lenke til kommentar

Bare føy til du, men jeg lurer nå litt på hva "som er bokstaver". Skal vi ta med bare engelske + æ,ø,å, og hva med aksenter? Fransk oe etc? Hvordan kan jeg bestemme ved runtime, hvilke bokstaver som skal være tillatt?

 

Dvs. hvordan finne ut hvilke bokstaver som finnes på tastaturet/ er i charsettet til brukeren?

Endret av dabear
Lenke til kommentar
Bare føy til du, men jeg lurer nå litt på hva "som er bokstaver". Skal vi ta med bare engelske + æ,ø,å, og hva med aksenter? Fransk oe etc? Hvordan kan jeg bestemme ved runtime, hvilke bokstaver som skal være tillatt?

 

Dvs. hvordan finne ut hvilke bokstaver som finnes på tastaturet/ er i charsettet til brukeren?

6417538[/snapback]

 

Aksenter må med. Det siste spørsmålet ditt har nok et svar, men jeg hjelper ikke motstanderen :D

Lenke til kommentar

Har prøvd meg jeg også. Den ble litt lang, men men.

 

def cambridge(s):
   import random, string
   o = string.punctuation
   c = []   
   for i in s.split():
       d = 0
       h = 0           
       p = {}
       i = list(i)
       k = 0
       if i[-1] in o:
           l = i[1:-2]
           k = 1
       else:
           l = i[1:-1]
       n = 0
       for s in l:
           if s in o:
               if s == '-':
                   p[n] = s
                   p[n-1] = l[n-1]
                   p[n+1] = l[n+1]
                   l[n-1] = ''
                   l[n+1] = ''
                   h = 1                       
               else:
                   p[n+1] = s
                   l[n] = ''                       
           elif s in string.digits:
               d = 1
               break
           n += 1 
       if p:                
           if h:
               y = []
               l = ''.join(l)
               for q in l.split('-'):
                   if len(q) >= 4:
                       l = list(q)
                       random.shuffle(l)
                       y.append(''.join(l))
                   else:
                       y.append(h)
               y = ''.join(y)
               l = list(y) 
               for t in p: 
                   l.insert(t, p[t])
               if k:
                   c.append(i[0]+''.join(l)+''.join(i[-2:]))
               else:
                   c.append(i[0]+''.join(l)+i[-1])                   
           else:
               random.shuffle(l)
               for t in p:
                   l.insert(t, p[t])
               if k:
                   c.append(i[0]+''.join(l)+''.join(i[-2:]))
               else:
                   c.append(i[0]+''.join(l)+i[-1])
       elif d:
           c.append(''.join(i))               
       else:
           random.shuffle(l)   
           if k:
               if len(l) == 0:
                   c.append(''.join(i))
               else:
                   c.append(i[0]+''.join(l)+''.join(i[-2:]))
           elif len(i) == 1:
               c.append(''.join(i)) 
           else:
               c.append(i[0]+''.join(l)+i[-1])                 
   return ' '.join(c)

Lenke til kommentar
Den funker ikke på ord som f.eks: don't.  Apostrofen flyttes.

6424874[/snapback]

 

Får håpe det er bedre nå.

 

import random,re,locale as L
L.setlocale(L.LC_ALL,'')
def cambridge(s):
   def T(s):
       N=[]
       for o in s.split('-'):
           n=[];A=n.append
           for w in o.split("'"):
               if len(w)<4 or (len(w)-2)*w[1]==w[1:-1]:A(w)
               else:
                   c=list(w[1:-1]);p=c[:]
                   while c==p:random.shuffle(c)
                   A(w[0]+''.join(c)+w[-1])
           N.append("'".join(n))
       return '-'.join(N)
   def X(s):
       F=re.findall
       try:
           y=s.rindex(F('\w',s,re.L)[-1])+1
           x=s.index(F('\w',s,re.L)[0])
           return s[:x]+T(s[x:y])+s[y:]
       except:return s
   return ' '.join(X(w) for w in s.split())

Endret av zeitgeist
Lenke til kommentar

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

Endret av dabear
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...