10 svar
364 visningar
delz behöver inte mer hjälp
delz 50
Postad: 30 aug 2018 18:58

två tal blir det tredje

jag har tre tal där de två första talen ska resultera i de tredje talet. Man kan använda de 4 räknesätten +, -,*,/.

Ex: 123 -> 1+2 = 3

 

siffrorna är mellan 0-9

frågan är: hur många gånger kan de två siffrorna ge den tredje siffran?

svaret är 152 men jag har ingen aning hur det blir så. Jag har ingen aning hur jag börjar.

SeriousCephalopod 2696
Postad: 30 aug 2018 19:05 Redigerad: 30 aug 2018 19:29

Om tabellmetoden jag talade om i förra tråden.

Två nästlade forloopar av följande slag motsvarar att generera alla par (x,y) där x = 0 till 9 och y = 0 till 9

for x in range(0,10):

  for y in range(0,10):

    print(x,y)

Just nu skriver koden bara ut alla 100 paren men du kan ersätta den raden med någon kontroll, tillexempel om deras produkt i*j är mellan 0 till 9 och registrera en sådan kombination som en lösning

SeriousCephalopod 2696
Postad: 30 aug 2018 19:34 Redigerad: 30 aug 2018 19:34

Vill du verkligen bruteforca kan du även generera alla xyz-triplar genom tre forloopar

for x in range(0,10):

  for y in range(0,10):

    for z in range(0,10):

      print(x,y,z)

Och göra test på triplarna.

PeterÅ 842
Postad: 30 aug 2018 20:07 Redigerad: 30 aug 2018 20:09

Hur skulle jag man kunna lösa detta via programmering?

Har svarat dig. Du måste vara konstruktiv själv. Det är enkelt att lösa med brute force.

delz 50
Postad: 31 aug 2018 14:00

jag har kommit fram till detta och det rätta svaret är 152 men jag får svaret 149 om jag kommenterar bort divison delen. Men när jag har kvar divison delen så får jag ett ZeroDivisionError och jag vet inte hur jag ska lösa detta. Allt är korrekt indenterat i programmet.

numberplates = 0
for x in range(10):
for y in range(10):
for z in range(10):
if x + y == z:
numberplates += 1
continue
elif x - y == z:
numberplates += 1
continue
elif x * y == z:
numberplates += 1
continue
elif x == 0 and y == 0:
numberplates += 1
continue

elif x/y == z:
numberplates += 1
continue
resultat = numberplates

delz 50
Postad: 31 aug 2018 14:43

jag tog med en try:except och då fick jag svaret 153...men jag behöver få svaret till 152 och jag förstår inte hur jag ska få till det.

numberplates = 0
for x in range(10):
for y in range(10):
for z in range(10):
try:
if x + y == z:
numberplates += 1
continue
elif x - y == z:
numberplates += 1
continue
elif x * y == z:
numberplates += 1
continue
elif x/y == z:
numberplates += 1
continue
except ZeroDivisionError:
continue
resultat = numberplates

SeriousCephalopod 2696
Postad: 31 aug 2018 17:50 Redigerad: 31 aug 2018 18:41

Kör hellre något i stil med:

elif y != 0 and x % y == 0 and x//y == z:

för divisionen dvs utför endast (heltals)divisionen om divisorn är nollskilld och y delar x. och skippa try-continue-skräpet. I regel bör man undvika try-satser så mycket man kan även när det är den 'enkla lösningen'.

(Notera att kedjor av and-påståenden körs från vänster till höger och bryts om något är falskt så kommer aldrig till divisionen om den inte går att utföra)

När jag kör min kod så får jag dock också 153 och efter att ha skummat igenom de faktiska lösningarna så är min förmodan att det antingen är (off-by-one)fel i facit eller att det finns någon enstaka lösning i bland triplarna som inte är förenlig med något kriterie som inte kommit med i uppgiftsbeskrivningen.

SeriousCephalopod 2696
Postad: 31 aug 2018 21:47 Redigerad: 31 aug 2018 22:10

 Utmaning nu kan vara att försöka hitta alla triplar

(x,y,z)(x,y,z) där 0x,y,z<104>0 \leq x,y,z < 10^4="">  och 

x+y=zx + y = z eller x-y=zx - y = z eller x×y=zx \times y = z eller x/y=zx / y = z

Är fullt lösbart men går inte att lösa med bruteforcetekniken du använde nu då det effektivt skulle kräva (104)3=1012(10^4)^3 = 10^{12} jämförelser vilket inte är praktiskt då en datorprocessor endast kan göra runt 10910^9 grundoperationer per sekund och en jämförelse i sig kan kräva hundratals(?) grundoperationer så vänttiden skulle bli väldigt hög. Så man behöver göra någon optimering. 

PeterÅ 842
Postad: 2 sep 2018 13:42 Redigerad: 2 sep 2018 14:45

Du har två fel i din kod. Dels så ska numren gå från 001 till 999 och inte från 000 som i din kod.
Dessutom måste du kolla att divisionen går jämt ut.
Eftersom du redan är nöjd med svaret skickar jag med kod i C som ger svaret 152:

#include <stdio.h>

int main()
{
 int firstNum, secondNum, thirdNum;
 int count;

 count = 0;
 for (firstNum = 0; firstNum < 10; firstNum++)
 {
  for (secondNum = 0; secondNum < 10; secondNum++)
  {
   for (thirdNum = 0; thirdNum < 10; thirdNum++)
   {
//  
// Nummer = 000, ej tillåtet i denna uppgift (0 * 0 = 0 skulle då räknas och ge svaret 153)
//
    if (firstNum + secondNum + thirdNum == 0)
     continue;     
    if (firstNum + secondNum == thirdNum)
    {
     count++;
     continue;
    }
    if (firstNum - secondNum == thirdNum)
    {
     count++;
     continue;
    }
    if (firstNum * secondNum == thirdNum)
    {
     count++;
     continue;
    }
    if (secondNum == 0)
     continue;
    if (firstNum % secondNum != 0)
     continue; // Division går ej jämt ut, skulle ge svaret 203
    if (firstNum / secondNum == thirdNum)
    {
     count++;
     continue;
    }
   }
  }
 }
 printf("Antal: %d\n", count);
 return count;
}

delz 50
Postad: 2 sep 2018 14:45

Tusen tack. Jag kom fram till samma svar. 

jek7 35 – Fd. Medlem
Postad: 15 sep 2018 19:35

Eftersom frågan ligger i python kunde jag inte hålla fingrarna borta från att ge ett exempel på en one-line-lösning, bara som onödig kuriosa (och inte rekommenderad lösning). Denna visar dock 153 då jag inte vet varför (0,0,0) inte skulle vara med, det går ju trixa bort den kombinationen med om man skulle vilja.

print sum(len(set(range(10)).intersection((x*y, x+y, x-y, None if not y or x%y else x/y))) for x in range(10) for y in range(10))

Svara
Close