zotbar1234 Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 # ... prev_val = -10000000 Vil ikke det være bedre med None her? Den er garantert forskjellig (som i "!=") fra alle _tall_. Mer generisk til samme pris. Lenke til kommentar
Lycantrophe Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 (endret) pls import Data.List (intersperse) import Data.List.Split (splitOn) mkgroup :: [Int] -> [(Int, Int)] mkgroup = foldr f [] where f y [] = [(y,y)] f y ((x,x'):xs) = if y == (x - 1) then (y,x'):xs else (y,y):(x,x'):xs mkstr :: [(Int, Int)] -> String mkstr = concat . intersperse "," . map f where f (x,y) = if x == y then show x else (show x) ++ ".." ++ (show y) main :: IO() main = getLine >>= putStrLn . mkstr . mkgroup . map read . splitOn "," edit: wow, folk skriver uironisk ruby. kk edit2: referanse: ~$ cat input.txt 1,2,3,8,10,11,12,14,15,17,18,20 ~$ ./grp < input.txt 1..3,8,10..12,14..15,17..18,20 Endret 7. oktober 2015 av Lycantrophe Lenke til kommentar
tomsi42 Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 Egentlig en morsom oppgave. Og et godt eksempel på en oppgave som løses bedre i veldig mange språk enn Delphi ... Lenke til kommentar
Lycantrophe Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 Det gjelder vel ca. alle problemer. Lenke til kommentar
sinnaelgen Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 beklager , men jeg kjenner språkene dere for dårlig til at jeg ser hvordan eksemplene fungerer å blande eksempler og kode uten å skille dem skaper bare forvirring Lenke til kommentar
rockPaperScissors() Skrevet 7. oktober 2015 Del Skrevet 7. oktober 2015 edit: wow, folk skriver uironisk ruby. kk Vel, det visste du jo fra før. input = "0,2,4,5,6,7,8,9,10,15,16,17,18,19,20,25,26,30" #input = "0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20" result = input .split(',') .map{|i| i.to_i} .unshift(0) .each_cons(2) .slice_before{|m, n| m + 1 < n} .map{|a| a.map(&:last)} .map{|slice| if slice.last == slice.first slice.first.to_s else "%i..%i" % [slice.first, slice.last] end } p input p result.join(',') # => "0,2,4,5,6,7,8,9,10,15,16,17,18,19,20,25,26,30" # => "0,2,4..10,15..20,25..26,30" Kan ikke ta credit for denne, bare googlet eksempel på å splitte opp array etter sekvenser og tok utgangspunkt i det. Ble jo mer ryddig enn mitt forrige forsøk da. Lenke til kommentar
snippsat Skrevet 8. oktober 2015 Del Skrevet 8. oktober 2015 Python med itertools groupby. from itertools import groupby, count def result(arg=''): l = list(arg) if len(l) > 1: return '{0}..{1}'.format(l[0], l[-1]) return '{0}'.format(l[0]) def group(n_str, result): lst = [int(i) for i in n_str.split(',')] g = groupby(lst, key=lambda n, c=count(): n-next(c)) return ','.join(result(i) for _, i in g) n_str = "0,3,4,5,6,7,8,9,10,15,16,17,18,19,20,21,22,23,30" print(group(n_str, result)) #--> 0,3..10,15..23,30 Lenke til kommentar
zotbar1234 Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 Python med itertools groupby. Visste at det bare måtte være noe i itertools for dette. Kreativ bruk av groupby, takk. Lenke til kommentar
sinnaelgen Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 detter den løsningen jeg kom frem til CODE procedure behandlelinje(st:string);var p,nv,k:integer;st1,st2,st3:string;beginx1:=-1;x2:=-1;k:=-1; // tar bor navnbeskrivelse p:=pos(':',st); // søkere etter tegnet kolon og legger posisjonen i variabelen Pst1:=copy(st,1,p);delete(st,1,p);p:=pos(',',st); // søker etter tegnet komma og legger posisjonen i variabelen Pst2:=copy(st,1,p-1); // flytter verdien til streng variabel st2delete(st,1,p); x1:=strtoint(st2); // gjør om tekst til tallverdinv:=x1+1; // variabel NV - neste verdi øker med enwhile length(st) > 0 do begin // så lenge tekststrengen har flere en ingen tegn forsettp:=pos(',',st); // søker etter tegnet komma og legger posisjonen i variabelen Pst3:=copy(st,1,p-1); flyttet verdi til streng variabel st3delete(st,1,p);x2:=strtoint(st3); // gjør om tekst til tallverdiif x2=nv then begin // har x2 og NV samme verdi ?nv:=nv+1; // øke nv med eninc(k); // øke k med enendelsebegin // har x2 og NV ikke samme verdi ?if k > 0 then begin // er k større en 0 ?st1:=st1+format('%d..%d,',[x1,nv-1]); // lagre gruppering X2 har allerede begynt på neste gruppe men NV kun haren for mye i verdix1:=x2; // ny gruppenv:=x1+1;k:=-1;end else // det er bare en verdi i gruppenbeginst1:=st1+format('%d,',[x1]);x1:=x2;nv:=x1+1;k:=-1;end;end;end;memo8.Lines.Add(st1);end; Lenke til kommentar
rockPaperScissors() Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 En html/ecmascript løsning fungerer også fint. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <script src="https://raw.githubusercontent.com/lodash/lodash/3.10.1/lodash.min.js" type="text/javascript"> </script> </head> <body> <script type="text/javascript"> window.onload = function() { var input1 = "0,2,4,5,6,7,8,9,10,15,16,17,18,19,20,25,26,30"; var input2 = "0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20"; var convert = function(input) { var c = 0; return _.chain(input).words(/\d+/g) .groupBy(function(el, i, arr) { return i ? c+= (1 !== el - arr[i-1]) : 0; }) .values() .map(function(s) { if (s.length === 1) { return _.first(s); } return _.first(s) + '..' + _.last(s); }) .value() .join(','); }; console.log(convert(input1)); // 0,2,4..10,15..20,25..26,30 console.log(convert(input2)); // 0,3..10,15..20 }; </script> </body> </html> Lenke til kommentar
sinnaelgen Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 nå brukere jeg ikke nettlaseren til dette så er det at linje nr 10 og 11 ( hvis man kun tar med kodelinjer , ikke blanke linjer ) bare forvirrer meg Lenke til kommentar
rockPaperScissors() Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 (endret) nå brukere jeg ikke nettlaseren til dette så er det at linje nr 10 og 11 ( hvis man kun tar med kodelinjer , ikke blanke linjer ) bare forvirrer meg Jeg forstår dessverre ikke delphi/pascal, så det er litt vrient å følge din tilnærming også, spesielt når formatering du bruker er rar. Endret 9. oktober 2015 av rockPaperScissors() Lenke til kommentar
sinnaelgen Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 nå brukere jeg ikke nettlaseren til dette så er det at linje nr 10 og 11 ( hvis man kun tar med kodelinjer , ikke blanke linjer ) bare forvirrer meg Jeg forstår dessverre ikke delphi/pascal, så det er litt vrient å følge din tilnærming også, spesielt når formatering du bruker er rar. Da er det jo viktig at man forklarer forløpet i kodesnuten og samtidig ikke lenger inn ting som har lite med selve koden å gjøre de flest glemmer forklaringen av koden Lenke til kommentar
Lycantrophe Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 Folkens, dette er elgen. Move along please. Det er artig med flere forsøk på "utfordringen", men det er ingen hensikt å bruke masse tid på å løse akkurat dette problemet. Lenke til kommentar
Emancipate Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Jeg fikk fikset så 25, 26 ikke blir 25..26: CODE instr = "0,2,4,5,6,7,8,9,10,15,16,17,18,19,20,25,26,30" #instr = "0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20" class SingleNumberOrRange: def __init__(self, val): self.values = [val] def range_end(self, val): self.values.append(val) def __str__(self): if len(self.values) == 1: return str(self.values[0]) if len(self.values) == 2: if self.values[0]+1 == self.values[1]: separator = "," else: separator = ".." return separator.join(map(str,self.values)) else: pass instr_int = [int(x) for x in instr.split(",")] output = [] in_run = False prev_val = -10000000 for val in instr_int: if val-1 == prev_val: # in run, don't print anything in_run = True else: if in_run == True: # end of run output[-1].range_end(prev_val) in_run = False output.append(SingleNumberOrRange(val)) # update previous value prev_val = val if in_run == True: output[-1].range_end(val) result = ",".join(map(str, output)) print(instr_int) print(result) Lenke til kommentar
sinnaelgen Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Det er jo derfor man børe bruker tid på såvel forklaringen om koden som såvel på koden. Det finnes nesten en ubegrenset antall programmeringsspråk der ute , med hver sine særheter Ingen har oversikt over alle , selv om mange av dem ligner på hverandre. Derfor ber jeg dere alle sammen har respekt for hverandre og hjelper hverandre når det er noe man ikke forstår 2 Lenke til kommentar
rockPaperScissors() Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Vel, nå har jeg gjort løsningen to ganger med samme framgangsmåte. Finne en måte å gruppere tallrekken etter sekvens. [1,2,3,10,11,12] => [[1,2,3], [10,11,12]]. Resten er bare detaljer. Såvidt jeg klarer å lese så ser det ut til at snippsnapp gjør det samme. Jeg er usikker på syntaksten med python, men dog. Lync ser ut til å gjøre noe lignende? Har virkelig ingen anelse om haskell, men det ser ut som ett lignende mønster om jeg kniper igjen øynene, snurrer stolen to ganger, og myser en stund på koden. Det ser ut som at Emancipate lager en annen datastruktur, bare tar vare på ende-numrene i hver sekvens. Lenke til kommentar
Emancipate Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Jepp, jeg hopper over alle tall som ikke skal skrives. Og gjør det på en veldig prosedyreorientert måte som er passende for oversetting til delphi. Lenke til kommentar
sinnaelgen Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Man kan ikke oversette mellom forskjellige språk hvis man ikke forstår syntaksen og oppbygningen av programsekvensen ( det var jo det jeg i utgangspunktet ba om forklaring på ) likevel blir der sure bare fordi jeg ikke forstår programmet Nå som jeg har løst det selv så trenger dere ikke jobbe mer med det Lenke til kommentar
Emancipate Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Jeg ble ikke sur, men jeg kan ikke forklare alt. 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å