Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Videoannonse
Annonse

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 av Lycantrophe
Lenke til kommentar

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

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

detter den løsningen jeg kom frem til

 

CODE

 

procedure behandlelinje(st:string);
var p,nv,k:integer;
st1,st2,st3:string;

begin
x1:=-1;
x2:=-1;
k:=-1;

// tar bor navnbeskrivelse 
p:=pos(':',st); // søkere etter tegnet kolon og legger posisjonen i variabelen P
st1:=copy(st,1,p);
delete(st,1,p);

p:=pos(',',st); // søker etter tegnet komma og legger posisjonen i variabelen P
st2:=copy(st,1,p-1);  // flytter verdien til streng variabel st2
delete(st,1,p);

x1:=strtoint(st2); // gjør om tekst til tallverdi
nv:=x1+1; // variabel NV - neste verdi øker med en

while length(st) > 0 do begin // så lenge tekststrengen har flere en ingen tegn forsett
p:=pos(',',st);   // søker etter tegnet komma og legger posisjonen i variabelen P
st3:=copy(st,1,p-1); flyttet verdi til streng variabel st3
delete(st,1,p);
x2:=strtoint(st3); // gjør om tekst til tallverdi

if x2=nv then begin // har x2 og NV samme verdi ?
nv:=nv+1; // øke nv med en
inc(k); // øke k med en
end
else
begin  // 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 verdi
x1:=x2;  //   ny gruppe
nv:=x1+1;
k:=-1;
end else //  det er bare en verdi i gruppen
begin
st1:=st1+format('%d,',[x1]);
x1:=x2;
nv:=x1+1;
k:=-1;

end;

end;

end;

memo8.Lines.Add(st1);
end;

Lenke til kommentar

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

 

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

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

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

  • Liker 2
Lenke til kommentar

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

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...