Aviseringar
Rensa alla

Programmeringsfråga python


Ämnesstartare

Hur hade du programmerat detta mer effektivt? Ställ frågor om ni inte förstår, jag har inget emot att förklara så gott jag kan. [cute]

Image


   
Citera
Ämnesstartare

Åtta:

YOLO


   
SvaraCitera
Åtta

Kan du inte posta koden direkt här istället? Kommentarer hade också varit skoj.

Du kan stoppa koden inom [ pre ] [/ pre ] för att behålla formatteringen.


   
SvaraCitera
Ämnesstartare

# Solution.py for https://www.hackerrank.com/challenges/string-similarity
import sys
for line in sys.stdin:
if line.islower(): # input filen har även en int i början som berättar hur många strängar som matas in. Detta är överflödigt i python, därför så har jag detta kriteriet.
line = line[:-1] #Varje sträng slutar med /n för ny rad, jag tar bort detta här.
line_length = len(line)
points = 0 # Variabel för att räkna poäng i likhet mellan orginalsträngen och dess olika suffix.
for s in xrange(0,line_length): # en loop från 0 till längden på strängen
suffix = line[s:] # skapar suffixet som ska jämföras denna loopen
suffix_length = len(suffix)
count = 1
while count < suffix_length+1:
if line.startswith(suffix[:1]): # Om strängen och den första karaktären i suffixet machar med varandra
if line.startswith(suffix[:suffix_length]):
points += len(suffix[:suffix_length])
break
else:
if line.startswith(suffix[:count+1]):
count += 1
elif line.startswith(suffix[:count]):
points += len(suffix[:count])
break
else:
break
print points


   
SvaraCitera
Ämnesstartare

Åtta:

Kan du inte posta koden direkt här istället?

Över kan du se koden med en del kommentarer tillagda, meddela gärna om du behöver mer information. [smile]


   
SvaraCitera
Åtta

kulturmarxisten:

Över kan du se koden med en del kommentarer tillagda, meddela gärna om du behöver mer information.

Kikar igenom det nu. Framförallt länken till utmaningen var hjälpsam. [crazy]

Dock är jag inte helt säker på vad du försöker åstadkomma i de inre selektionerna i din while-loop.

if line.startswith(suffix[:1]):
if line.startswith(suffix[:len(suffix)]):
points += len(suffix[:len(suffix)])
break
else:
if line.startswith(suffix[:count+1]):
count += 1
elif line.startswith(suffix[:count]):
points += len(suffix[:count])
break
else:
break

Den här logiken får du förklara för mig. Det verkar vara väldigt många olika selektioner, och jag är inte övertygad om att alla är nödvändiga.

Rent generellt känns det här som ett problem som rekursion borde kunna hjälpa med, men jag är alldeles för trött för att ens försöka tänka rekursivt just nu.


   
SvaraCitera
Ämnesstartare

Åtta:

Kikar igenom det nu. Framförallt länken till utmaningen var hjälpsam.

[crazy][crazy][crazy][crazy]

Åtta:

Den här logiken får du förklara för mig.

Okej, först så kollar den om suffixets första tecken matchar, om inte så är det onödigt att kolla alla andra, för då kommer ingen självklart att matcha.

Sedan kollar den om hela suffixet machar, då så räknar den poängen bara så är den klar med det suffixet.

Om första var sann med andra var falsk så kommer vi till det sista kriteriet. Om suffixet minus 1+count i slutet på suffeixet machar så ökar det värdet på variabeln count med ett. Annars om suffixet machar med strängen minus count variblen så räknar den alla poängen så är det klart med det suffixet. Så här så loopas det igenom om och om tills man kommer ditt från höger till vänster helt enkelt, ett tecken mindre i taget på suffixet. Nu är frågan, om man nödvändigtvis måste kolla alla tecken i strängen, för säg om strängen är 100000 tecken långt ist för 2 så kan det ta en helt del tid att loppa det så många gånger möjligtvis?


   
SvaraCitera
Ämnesstartare

Jag kan alltså lika gärna skriva

if line.startswith(suffix):
points += len(suffix)
break

ist för

if line.startswith(suffix[:len(suffix)]):
points += len(suffix[:len(suffix)])
break


   
SvaraCitera