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.
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
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.
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.
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
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
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.
Utmaning nu kan vara att försöka hitta alla triplar
där och
eller eller eller
Är fullt lösbart men går inte att lösa med bruteforcetekniken du använde nu då det effektivt skulle kräva jämförelser vilket inte är praktiskt då en datorprocessor endast kan göra runt 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.
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;
}
Tusen tack. Jag kom fram till samma svar.
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))