Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Selv om jeg foretrekker  delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i (...)

Hvor er utfordringen? Det er bare å holde rede på nedre og øvre grense av neste intervall å "kompaktere" og når det er slutt, legge det til svaret.

O(n) plass og O(n) tid.

Lenke til kommentar
Videoannonse
Annonse

 

Selv om jeg foretrekker  delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i (...)

Hvor er utfordringen? Det er bare å holde rede på nedre og øvre grense av neste intervall å "kompaktere" og når det er slutt, legge det til svaret.

O(n) plass og O(n) tid.

 

utfordringen er å gjøre det på en veldig veldig enkel måte.

Lenke til kommentar

Selv om jeg foretrekker delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i,de er adskilt med komma

tallverdiene forløper i stigende orden fra 0 til 504, men de kommer ikke nødvendigvis etter hverandre ( d.v.s at noen verdier mangler hvis man tenker på at teksstrengen inneholder alle verdier mellom 0 og 504.

 

utfordringen blir da korte ned innholdet slik at det f,eks står 0,3..10,15..20 o.s.v i stedet for 0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20 o.s.v

 

Skal du bare fjerne deler av innholdet og skal det gjøres for noe spesifikt eller bare random som skal fjernes?

Lenke til kommentar

 

Selv om jeg foretrekker delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i,de er adskilt med komma

tallverdiene forløper i stigende orden fra 0 til 504, men de kommer ikke nødvendigvis etter hverandre ( d.v.s at noen verdier mangler hvis man tenker på at teksstrengen inneholder alle verdier mellom 0 og 504.

 

utfordringen blir da korte ned innholdet slik at det f,eks står 0,3..10,15..20 o.s.v i stedet for 0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20 o.s.v

 

Skal du bare fjerne deler av innholdet og skal det gjøres for noe spesifikt eller bare random som skal fjernes?

 

innholdet skal gjøres mere kompakt for  syns skyld

så det man skal fjerne er verdier som er mellom max og min verdien i hver avgrensing

Lenke til kommentar

jeg har prøv , me det fungerte ikke 100% enda.

CODE

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

begin
x1:=-1;
x2:=-1;
k:=-1;
p:=pos(':',st);
st1:=copy(st,1,p);
delete(st,1,p);

l1:
p:=pos(',',st);
st2:=copy(st,1,p-1);
delete(st,1,p);
x1:=strtoint(st2);
nv:=x1+1;

repeat
////////////////////
p:=pos(',',st);
st3:=copy(st,1,p-1);
delete(st,1,p);
x2:=strtoint(st3);

if st='' then p:=0;
if x2=nv then begin
nv:=nv+1;
inc(k);
end
else
begin
if k > 0 then begin
st1:=st1+format('%d..%d,',[x1,nv-1]);
x1:=x2;
nv:=x1+1;
k:=-1;
//goto l1;

end else
begin
st1:=st1+format('%d,',[x1]);
x1:=x2;
nv:=x1+1;
k:=-1;
//goto L1;
end;

end;

until p=0;
st1:=st1+format('%d..%d,',[x1,nv-1]);
end;
 

 

St1 er den tekststrengen der resultatet skal bære til slutt.

eller så må jeg fjerne vekk navnet  <navn>  og ":"  under behandlingen 

 

st2 og st3 samt X1 og X2 er hjelpe variabler

NV brukes om hjelpe variabel for kontrollere om variabelen X2 har neste verdi eller om det er et opphold

 

K er kontroll variabel som fortelter hvordan variablene X1 og X2 skal brukes 

p forteller hvor skille tegnet "," er

Endret av den andre elgen
Lenke til kommentar

Selv om jeg foretrekker  delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i,de er adskilt med komma

tallverdiene forløper i stigende orden  fra 0 til 504, men de kommer ikke nødvendigvis etter hverandre ( d.v.s at noen verdier mangler hvis man tenker på at teksstrengen inneholder alle verdier mellom 0 og 504.

 

utfordringen blir da korte ned innholdet slik at det f,eks står 0,3..10,15..20 o.s.v i stedet for 0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20 o.s.v

input = "0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20"
res_a1 = []
data = input.split(',').map{|i| i.to_i}
data.each_with_index do |x, i|
  if i == 0 || i == data.length - 1
    res_a1 << x.to_s
  elsif (data[i]-1 == data[i-1]) ^ (data[i]+1 == data[i+1]) || !(data[i]-1 == data[i-1]) && !(data[i]+1 == data[i+1])
    res_a1 << x.to_s
  elsif !res_a1.empty? && !(res_a1.last =~ /\.\./)
    res_a1 << '..'
  end
end
res_a2 = []
res_a1.each_with_index do |x, i|
  not_last_item_and_x_is_num = i != res_a1.length-1 && x =~ /\d+/
  if not_last_item_and_x_is_num && res_a2.last.to_s =~ /\d+/
    res_a2 << ',' << x
  elsif not_last_item_and_x_is_num && res_a2.last.to_s =~ /\.\./
    res_a2 << x << ','
  else
    res_a2 << x
  end
end
p "Input #{input}" # => "Input 0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20"
p "Result loop #1 #{res_a1.join}" # => "Result loop #1 03..1015..20"
p "Result loop #2 #{res_a2.join}" # => "Result loop #2 0,3..10,15..20"
You welcome.
Lenke til kommentar

hvis det er C# ( eller tilsvarende )  så sliter jeg litt med å se strukturen , altså hvordan programmet forløper

 

kode linjen med "input" er verst å forstå 

 

eller så virker det som du allerede har fastsatt verdiene.

mulig dere har misforstått det , men talverdien er tilfeldige

 

hvis det er mulig så trenger jeg en liten gjennomgang hvordan du tenker deg at programmet skal forløpe

Lenke til kommentar

Språket over er altså ruby. Programmet har dog en liten feil. Prøv input = "0,2,4,5,6,7,8,9,10,15,16,17,18,19,20,25,26,30" og se på slutten. Jeg synes heller ikke det så særlig enkelt ut.

 

Elgen: Du må selv putte noe fornuftig i input-variabelen.

 

Dette er Python:

#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"
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] += ".." + str(prev_val)
            in_run = False
        output.append(str(val))
    # update previous value
    prev_val = val
if in_run == True:
    output[-1] += ".." + str(val)

result = ",".join(output)
print(result)

En "range" på bare to tall burde egentlig listes opp som vanlige separate tall, men det tenkte jeg ikke på, og det ville nok komplisert ting endel.

Endret av Emancipate
Lenke til kommentar

jeg trenger en gjennomgang siden jeg har for dårlig kjennskap til både ruby og pyton

da blir det mere kompliser å forstå en det trenger å være

 

det er i grunnen nok å forklare prinsippet del for del , omtrent som når man bruker flytskjema

Endret av den andre elgen
Lenke til kommentar

Jeg kan ikke forklare alt.

 

Denne linja: instr_int = [int(x) for x in instr.split(",")] gjør om strengen i linja over til en array av tall:

[0, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 18, 19, 20]

 

output = [] lager en ny tom array (av strenger) til resultatet

 

 

for val in instr_int:
betyr noe sånt som

for i = 0 to length(instr_int) begin
    val = instr_int[i]
Rett og slett at den looper en gang for hvert element i instr_int.

 

= betyr :=

== betyr =

Endret av Emancipate
Lenke til kommentar

 

Denne linja: instr_int = [int(x) for x in instr.split(",")] gjør om strengen i linja over til en array av tall:

[0, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 18, 19, 20]

javel ( samme som strtoint i pascal ) men hvorfor er

[0, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 18, 19, 20]

der

 

hvilken hensikt har de  ?

 

så i første omgang ser det ut som forhåndsdefinerte og faste verdier 

det er ikke det jeg vil

og hvis man skal bruke et Arry så må det gå fra o til n  fortløpende ( der n også  er en  verdi)

man må da uansett vite hvor mange verdier, avskilt med komma,det er i strengen

 

trenger jeg 10 plasser så definere jeg det slik :  verdi : array [0..9] of integer .

integer er heltall

 

men her vet man ikke på forhand hvor mange verdi det er tekststrengen

strengen blir dog generert fra en annen del av samme program

Lenke til kommentar

 


hvilken hensikt har de  ?

Det er tall som er brukt som eksempel.

 

trenger jeg 10 plasser så definere jeg det slik :  verdi : array [0..9] of integer .

Ah, det er litt av en "defekt" i pascal at lengden på en array er en del av typen. I Python kan lengden endre seg underveis. Delphi har fått støtte for arrays med dynamisk lengde: http://stackoverflow.com/questions/433221/how-do-i-declare-an-array-when-i-dont-know-the-length-until-run-time

 

output.append(str(val)) gir arrayen en ekstra plass og putter str(val) inn der. det må lages litt annerledes i delphi.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...