zeitgeist Skrevet 30. juni 2006 Del Skrevet 30. juni 2006 (endret) 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 1. juli 2006 av zeitgeist Lenke til kommentar
Gjest Slettet-8fx0y6VV Skrevet 30. juni 2006 Del Skrevet 30. juni 2006 Dette høres bedre ut enn flash-shit Skal nok klare å skrape sammen noe kode. Lenke til kommentar
zeitgeist Skrevet 30. juni 2006 Forfatter Del Skrevet 30. juni 2006 Dette høres bedre ut enn flash-shit Skal nok klare å skrape sammen noe kode. 6412749[/snapback] Kool! Håper det blir flere enn oss to ;-) Lenke til kommentar
FraXinuS Skrevet 30. juni 2006 Del Skrevet 30. juni 2006 Jeg er med, skal i hvertfall prøve å få til noe. Lenke til kommentar
Gjest Slettet-8fx0y6VV Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 (endret) 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 1. juli 2006 av rapt0r Lenke til kommentar
dabear Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 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
zeitgeist Skrevet 1. juli 2006 Forfatter Del Skrevet 1. juli 2006 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 Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 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
zeitgeist Skrevet 1. juli 2006 Forfatter Del Skrevet 1. juli 2006 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
Gjest Slettet-8fx0y6VV Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 Samme for meg. Jeg har funnet en del andre innsekter i koden min som vil kreve at jeg skrver om alt sammen uansett. Lenke til kommentar
zeitgeist Skrevet 1. juli 2006 Forfatter Del Skrevet 1. juli 2006 Samme for meg. Jeg har funnet en del andre innsekter i koden min som vil kreve at jeg skrver om alt sammen uansett. 6417519[/snapback] Ok. Jeg legger til at koden må funke med norsk og vanlige vanlige europeiske tegn. Lenke til kommentar
dabear Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 (endret) 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 1. juli 2006 av dabear Lenke til kommentar
zeitgeist Skrevet 1. juli 2006 Forfatter Del Skrevet 1. juli 2006 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 Lenke til kommentar
FraXinuS Skrevet 1. juli 2006 Del Skrevet 1. juli 2006 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
zeitgeist Skrevet 2. juli 2006 Forfatter Del Skrevet 2. juli 2006 (endret) det var bugs i denne... Endret 2. juli 2006 av zeitgeist Lenke til kommentar
FraXinuS Skrevet 2. juli 2006 Del Skrevet 2. juli 2006 Den funker ikke på ord som f.eks: don't. Apostrofen flyttes. Lenke til kommentar
zeitgeist Skrevet 2. juli 2006 Forfatter Del Skrevet 2. juli 2006 (endret) 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 3. juli 2006 av zeitgeist Lenke til kommentar
FraXinuS Skrevet 3. juli 2006 Del Skrevet 3. juli 2006 Ja, nå funker det fint. Det er det beste hittil. Lenke til kommentar
zeitgeist Skrevet 3. juli 2006 Forfatter Del Skrevet 3. juli 2006 Ja, nå funker det fint. Det er det beste hittil. 6425792[/snapback] Den er treg som ff, men det er jo ikke viktig her ;-) Fikk klemt ut ennå noen bytes. Med én space eller TAB som indentering, er det 571 bytes. Lenke til kommentar
dabear Skrevet 3. juli 2006 Del Skrevet 3. juli 2006 (endret) 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 3. juli 2006 av dabear Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå