Avatar billede netsrac Praktikant
28. februar 2001 - 19:05 Der er 60 kommentarer og
1 løsning

Til Programmøren der tror han/hun kan alt :-)

Fordi man arbejder lidt forud for resten af klassen i programmering, synes læren pludselig at man skal have en ekstra opgave.

Jeg har selv været igang med at prøve at løse opgaven, med de vilde løkker osv.

Opgaven lyder:

Find et 9-cifret tal bestående af 9 forskellige cifre. dvs. cifrene = {1,2,3,4,5,6,7,8,9} alle brugt, og kun en gang.

Tallet skal have følgende egenskab
(1. og 2. ciffer) % 2 = 0
(1., 2. og 3. ciffer) % 3 = 0
(1,2,3,4 ciffer) % 4 = 0
(1,2,3,4,5 ciffer) % 5 = 0
(1,2,3,4,5,6) % 6 = 0
(1,2,3,4,5,6,7) % 7 = 0
(1,2,3,4,5,6,7,8) % 8 = 0
(1,2,3,4,5,6,7,8,9) % 9 = 0

(% = Modelus, denne funktion hedder f.eks. i asp Mod)

fx.
I tallet 123456789
er 12 % 2 = 0
er 123 % 2 = 0
er 1234 % 2 = 2
ergo kan tallet ikke bruges.

Det hele skal jo selvfølgelig laves som en rutine i et programmerings sprog.
(I mit tilfælde er det JAVA, men det kan sikkert løses i de fleste sprog.)

Jeg søger ikke selv svaret (har opgivet), vil bare give en udfordring til de programmører der mener de kan alt.

Avatar billede gchris5 Praktikant
28. februar 2001 - 19:14 #1
lige til en lørdag aften hvor man ikke har andet at give sig til!
Avatar billede netsrac Praktikant
28. februar 2001 - 19:16 #2
Det er lige det :-)
Avatar billede jakoba Nybegynder
28. februar 2001 - 19:26 #3
an dit fx. der dividerer du med 2 hver gang. i opgavebeskrivelsen divideres progressivt med tal fra 2 op til 9. Hvad er det?
Avatar billede netsrac Praktikant
28. februar 2001 - 19:45 #4
Det er en fejl, godt observeret.

Det er forresten ikke divider, det er modelus.

Jeg tror faktisk jeg har fundet en løsning i ASP, vender tilbage når jeg har fået det codet :-)
Avatar billede netsrac Praktikant
28. februar 2001 - 19:49 #5
Eksemplet skulle have været:

fx.
I tallet 123456789
er 12 % 2 = 0
er 123 % 3 = 0
er 1234 % 4 = 2
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 19:53 #6
Mener du 38165472  ?

Vil du have et lille Perl-program, der løser problemet ?
Avatar billede snowball Novice
28. februar 2001 - 20:03 #7
erikjacobsen: Der er da kun 8 tal ! ;)

Snowball
Avatar billede netsrac Praktikant
28. februar 2001 - 20:05 #8
Hold på den lidt Erik, jeg er ved at have en løsning selv, men jeg vil gerne se dit når jeg selv har lavet en løsning :-)
Avatar billede pstric Nybegynder
28. februar 2001 - 20:06 #9
snowball>> En fra eller til...
Avatar billede rfogh Nybegynder
28. februar 2001 - 20:08 #10
erik>> Det går da heller ikke op...

38 mod 2 = 1...
Avatar billede pstric Nybegynder
28. februar 2001 - 20:11 #11
381654729 skulle kunne klare det.

rfogh>> jeg tror da, at 38 er et lige tal ;-)
Avatar billede pstric Nybegynder
28. februar 2001 - 20:12 #12
381654720 er naturligvis ligeså godt.
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 20:17 #13
381654729  naturligvis ... glemte et 9 tal i Ctrl-C Ctrl-V :(

Der må ikke være 0-er i pstric  :)
Avatar billede netsrac Praktikant
28. februar 2001 - 20:17 #14
Løsningen er: 381654729

Har løst det med følgende:

<%
for a = 1 to 9
    for b = 1 to 9
        if (a & b) Mod 2 = 0 then
            for c = 1 to 9
                if (a & b & c) Mod 3 = 0 then
                    for d = 1 to 9
                        if (a & b & c & d) Mod 4 = 0 then
                            for e = 1 to 9
                            loop4 = a & b & c & d & e
                                if (a & b & c & d & e) Mod 5 = 0 then
                                    for f = 1 to 9
                                        if (a & b & c & d & e & f) Mod 6 = 0 then
                                            for g = 1 to 9
                                                if (a & b & c & d & e & f & g) Mod 7 = 0 then
                                                    for h = 1 to 9
                                                        if (a & b & c & d & e & f & g & h) Mod 8 = 0 then
                                                            for i = 1 to 9
                                                                if (a & b & c & d & e & f & g & h & i) Mod 9 = 0 then
                                                                        Antal1 = 0
                                                                        Antal2 = 0
                                                                        Antal3 = 0
                                                                        Antal4 = 0                                                                       
                                                                        Antal5 = 0
                                                                        Antal6 = 0
                                                                        Antal7 = 0
                                                                        Antal8 = 0
                                                                        Antal9 = 0                                                                                                                                                                                                                                                                                                                                                                       
                                                                        MuligtResult = a & b & c & d & e & f & g & h & i
                                                                            for j = 1 to len(MuligtResult)
                                                                                if mid(MuligtResult, j, 1) = 1 then
                                                                                    Antal1 = Antal1 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 2 then
                                                                                    Antal2 = Antal2 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 3 then
                                                                                    Antal3 = Antal3 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 4 then
                                                                                    Antal4 = Antal4 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 5 then
                                                                                    Antal5 = Antal5 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 6 then
                                                                                    Antal6 = Antal6 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 7 then
                                                                                    Antal7 = Antal7 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 8 then
                                                                                    Antal8 = Antal8 + 1
                                                                                elseif mid(MuligtResult, j, 1) = 9 then
                                                                                    Antal9 = Antal9 + 1
                                                                                end if                                                                           
                                                                            next
                                                                        if Antal1 = 1 AND Antal2 = 1 AND Antal3 = 1 AND Antal4 = 1 AND Antal5 = 1 AND Antal6 = 1 AND Antal7 = 1 AND Antal8 = 1 AND Antal9 = 1 then
                                                                        Response.write(\"Løsningen er: \" & MuligtResult)
                                                                        end if
                                                                end if
                                                            next
                                                        end if
                                                    next
                                                end if
                                            next
                                        end if
                                    next
                                end if
                            next
                        end if
                    next
                end if
            next
        end if
    next
next
%>
Avatar billede rfogh Nybegynder
28. februar 2001 - 20:18 #15
pstric>> Ups... Jeg tænkte på tværsummen.. *DOH*
Avatar billede netsrac Praktikant
28. februar 2001 - 20:30 #16
Erik >> Jeg vil gerne se din løsning :-)
Avatar billede pstric Nybegynder
28. februar 2001 - 20:38 #17
erikjacobsen>> Og så husk lige at lave det som et svar. Jeg vil ikke have pointene for at hjælpe dig med at paste ;-)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 20:39 #18
Lidt rekursion har aldrig skadet sunde mennesker:

sub try {
  local ($s,$n)=@_;
  local ($i);
  if ($n>9) {
    print \"$s\\n\";
  } else {
    for ($i=1;$i<=9;$i++) {
      if (!$used[$i] && ($s.$i)%$n==0) {
        $used[$i]=1;
        &try($s.$i,$n+1);
        $used[$i]=0;
      }
    }
  }
}

&try(\"\",1);
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 20:40 #19
Det hedder \"Backtracking\" - hvis du vil slå det i en - øh - lettere avanceret
programmeringsbog.
Avatar billede netsrac Praktikant
28. februar 2001 - 20:41 #20
Hm...Ja det script fatter jeg ikke noget som helst af :-)
Men jeg tvivler da ikke på at det virker.
Avatar billede saubermacher Nybegynder
28. februar 2001 - 20:43 #21
imponerende... :-o
Avatar billede jakoba Nybegynder
28. februar 2001 - 20:47 #22
Shit. men i får nu min alligevel:


(1,2 ) % 2 = 0              <!-- 2 er lige tal -->
(1,2,3 ) % 3 = 0
(1,2,3,4 ) % 4 = 0          <!-- 4 er lige tal -->
(1,2,3,4,5 ) % 5 = 0        <!-- 0 findes ikke så 5 == 5 -->
(1,2,3,4,5,6) % 6 = 0      <!-- 6 er lige tal -->
(1,2,3,4,5,6,7) % 7 = 0
(1,2,3,4,5,6,7,8) % 8 = 0  <!-- 8 er lige tal -->
(1,2,3,4,5,6,7,8,9) % 9 = 0 <!-- altid sand for de ønskede cifre -->

Med 4 lige tal brugt er resterende cifre ulige tal

(3,4) % 4 = 0
      [ 12, 16, 32, 36, 72, 76, 92, 96 ] => 4 = [2,6]
(1,2,3)%3=0 && (1,2,3,4,5,6)%6=0  => (4,5,6)%6=0 => (7,8,9)%3=0
hvis 4 = 2 => 6 = [2,8] => 6 = 8
hvis 4 = 6 => 6 = 4


  (1,2,3,4,5,6,7,8,9)
a        2 5 8
b        6 5 4

(6,7,8 ) % 8 = 0 & 6==lige => (7,8)%8=0
(7,8) = [16,32,72,96]

  (1,2,3,4,5,6,7,8,9)
a1      2 5 8 1 6    => 9 ikke mulig
a2      2 5 8 9 6    => 9 = 3
b1      6 5 4 3 2    => 9 = [1,7]
b2      6 5 4 7 2    => 9 = 9

    (1,2,3,4,5,6,7,8,9)
a2    4  2 5 8 9 6 3  => (1,3) = [17, 71]
b1a    8  6 5 4 3 2 1  => (1,3) = [79, 97]
b1b    8  6 5 4 3 2 7  => (1,3) = [19, 91]
b2    8  6 5 4 7 2 9  => (1,3) = [13, 31]

Så der er 8 mulige løsninger: vi skal blot også checke %7

      (1,2,3,4,5,6,7,8,9)
a2a1  1 4 7 2 5 8 9 6 3    %7 = 6 duer ikke
a2a2  7 4 1 2 5 8 9 6 3    %7 = 2 duer ikke
b1a1  7 8 9 6 5 4 3 2 1    %7 = 4 duer ikke
b1a2  9 8 7 6 5 4 3 2 1    %7 = 5 duer ikke
b1b1  1 8 9 6 5 4 3 2 7    %7 = 5 duer ikke
b1b2  9 8 1 6 5 4 3 2 7    %7 = 2 duer ikke
b2a1  1 8 3 6 5 4 7 2 9    %7 = 6 duer ikke
b2a2  3 8 1 6 5 4 7 2 9    %7 = 0 Hurraaaah

så det unikke svar er: 381654729
men det nærmeste jeg ku lave af program til at beregne det ville tage mange år at køre færdigt. Der skal en \"rigtig\" matematiker til. (eller en af mange ekspert\'er åbenbart:)

mvh JakobA
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 20:49 #23
Jeg gør essentielt det samme som dig, men lader funktionen try om at undgå
at skrive det 9 gange ;)
Avatar billede pstric Nybegynder
28. februar 2001 - 20:49 #24
jakoba>> Jeg foretrækker din løsning. Den ser meget mere gennemtænkt ud end programmeringsløsningerne.
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 20:50 #25
skal det gøres i Java for din lærer, Carsten ?
Avatar billede netsrac Praktikant
28. februar 2001 - 20:53 #26
Erik, ja det skal det godt nok :-)

Men jeg er igang med at omskrive min ASP til en JAVA application, men jeg er ikke så hård til JAVA endnu :-)
Avatar billede rfogh Nybegynder
28. februar 2001 - 20:55 #27
Hehe... Erik er klar :o)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 21:00 #28
Jeg synes nu også godt om din Jakoba :) Men her er min i Java - stort set
som den i Perl:

class Netsrac {

static boolean used[] = new boolean[10];

static void tryit(int s,int n) {
  if (n>9) {
    System.out.println(s);
  } else {
    for (int i=1;i<=9;i++) {
      if (!used[i] && (s*10+i)%n==0) {
        used[i]=true;
        tryit(s*10+i,n+1);
        used[i]=false;
      }
    }
  }
}

public static void main(String[] args)     {
  tryit(0,1);
}

}
Avatar billede netsrac Praktikant
28. februar 2001 - 21:05 #29
Ja Erik den virker jo og det hele, jeg forstår den bare ikke rigtigt, så jeg får nok et forklarings problem, så jeg må nok hellere få min egen omskrevet :-)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 21:09 #30
Ha ha - start med den - det kan være din lærer heller ikke forstår den.... :)
Men lav din egen til reserve..... Når han nu driller dig, må du også godt drille ham !!
Avatar billede netsrac Praktikant
28. februar 2001 - 21:12 #31
*GG* Erik der kan måske være noget om at han ikke forstår den og jeg tror da egentlig at det vil være på sin plads at drille ham lidt efter denne opgave :-)
Avatar billede netsrac Praktikant
28. februar 2001 - 22:06 #32
Erik nu du er så når til JAVA kan du så forklare hvorfor dette ikke virker:

int a = 3;
int b = 8;
int tmp2 = ((int) ((char) a + (char) b));

Først skulle den tvinge a og b til karakterer, for derefter at tvinge det til et heltal, men tmp2 indeholder 11 og ikke 38 som jeg gerne ville have den til.
Avatar billede netsrac Praktikant
28. februar 2001 - 22:07 #33
når = hård :-)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:12 #34
int tmp2 = ((int) ((String) a + (String) b));
Avatar billede netsrac Praktikant
28. februar 2001 - 22:17 #35
Erik >> Det vil compileren ikke godtage. Hvis du hjælper mig med at få det til at rulle skal jeg nok lige oprette et spørgsmål, så du og kan få lidt point (Selvom du ikke har brug for dem *G*)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:25 #36
Nå nej:
int tmp2 = Integer.parseInt( (new Integer(a)).toString() + (new Integer(b)).toString());
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:26 #37
Ingen points - giv din kat en fiskefrikadelle i stedet for.
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:27 #38
Men du kan gøre det 1.000.000 gange nemmere: 

int tmp2 = a*10+b
Avatar billede jakoba Nybegynder
28. februar 2001 - 22:28 #39
Ok burde virke. men netsrac det der til string, koncatener, til integer er totalt spild. gør som i erikjakobsens  tmp2 = a*10+b;
Avatar billede netsrac Praktikant
28. februar 2001 - 22:29 #40
Takker det virker fino, har ikke nogen kat, men jeg spiser den da bare selv er det okay ? :-)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:30 #41
Miau
Avatar billede netsrac Praktikant
28. februar 2001 - 22:44 #42
I siger noget hvis jeg så har:
a = 5
b = 3
c = 7

Så skal det bare være
tmp2 = a * 100 + b * 10 + c
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:46 #43
Jeg tror du har fat i noget :)
Avatar billede jakoba Nybegynder
28. februar 2001 - 22:47 #44
just præcis. som erikjakobsen gør i tryit parameter og if-betingelse
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:48 #45
eller

tmp2=a
tmp2=tmp2*10+b
tmp2=tmp2*10+c
Avatar billede netsrac Praktikant
28. februar 2001 - 22:48 #46
Skide smart :-)
Avatar billede erikjacobsen Ekspert
28. februar 2001 - 22:52 #47
..og alt det her for 3 point ... hvem sagde inflation

Det er \"c\" og ikke \"k\", jakoba!
Avatar billede blazer Nybegynder
28. februar 2001 - 22:58 #48
fuck..ericjacobsen du er for sej.....heh....men ejg ligger højere end dig i perl :D
Avatar billede netsrac Praktikant
28. februar 2001 - 22:59 #49
Mindes faktisk en der sagde at der var inflation, tror det var nil.dk
Avatar billede billeschou Nybegynder
01. marts 2001 - 09:54 #50
lige en kort kommentar...

ville man ikke kunne udelukke en hel masse muligheder hvis man startede med at finde alle de tal der opfyldte at
(1,2,3,4,5,6,7,8,9) % 9 = 0

og så kørte videre derfra?

Det kan godt være at det er det erikjakobsen har gjort - kan ikke lige overskue det.
Avatar billede erikjacobsen Ekspert
01. marts 2001 - 12:17 #51
Jo, men det er mange. Der er ca. 10^9 tal oprindeligt, og så reducerer du
det til ca. 10^8 (næsten hver tiende). Det hjælper ikke så meget - og nej, det
er ikke det jeg gør :_)
Avatar billede codemon Nybegynder
01. marts 2001 - 14:29 #52
der er 9 forskellige elementer som skal kombineres uden tilbagelægning. det giver 9! = 362880 muligheder, istedet for ca. 1 mia. 0,04 procent
Avatar billede jakoba Nybegynder
01. marts 2001 - 20:02 #53
erikjacobsen >> undkyld k\'et. Burde vide bedre.
Avatar billede rfogh Nybegynder
01. marts 2001 - 20:09 #54
jakoba>> Du kender vel selv problematikken :o)
Avatar billede cybermike Nybegynder
12. marts 2001 - 18:24 #55
kunne sikkert godt men det er lige om man gider bruge 18 timer på det :)
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 21:11 #56
Hvordan det gik det med din lærer, netsrac?
Avatar billede netsrac Praktikant
12. marts 2001 - 21:17 #57
Ja ser du Erik, jeg havde den bedste løsning i klassen, da jeg viste min egen. Men min lærer havde jo selvfølgelig også skrevet en version og den lignede din utrolig meget, så det. Så min lærer forstod altså godt koden, men han er jo også gammel hardcore c++ koder :-)
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 21:20 #58
Ha ha, hvem er det? Jeg kender ham måske....  (Evt. pr email...)
Avatar billede netsrac Praktikant
12. marts 2001 - 21:24 #59
Tja det kan da godt være du gør det han underviser jo også datamatikere. Her i Esbjerg.
Han hedder Peter Andersen pa@ehs.dk
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 21:29 #60
Nå, ok, ham har jeg ikke haft med at gøre mens han har undervist der, men kender
da en af det navn fra tidligere. Jeg har haft med jeres tre Ole-er at gøre her på
det sidste. Jeg var forøvrigt 3 dage i Esbjerg her i januar som censor - men vist
ikke for dig :)
Avatar billede netsrac Praktikant
12. marts 2001 - 21:34 #61
Nej det var nok ikke for mig, jeg er jo først lige startet, men synes nu godt nok at det er lidt for let her i starten :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester