2 van 3
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 18:20
door jhnbk
okay, nu mijn versie van het digit probleem in python
Code: Selecteer alles
def digit(getal,i):
if i==1:
return getal%10
else:
return digit(getal/10,i-1)
@CloudedHeaven: lijkt mij correct, maar wilt ni compileren bij mij
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 18:46
door jhnbk
in haskell, maar dat heb ik nu even bekeken hoe het moet dus ben ik niet zeker
Code: Selecteer alles
digit getal i | i==1 = getal 'mod' 10
| i>1 = digit(getal 'div' 10, i-1)
@Mods: plaats mijn berichten maar samen, edit ging niet meer
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 18:53
door CloudedHeaven
jhnbk schreef:Code: Selecteer alles
def digit(getal,i):
if i==1:
return getal%10
else:
return digit(getal/10,i-1)
Ik moest er ff over denken, maar eleganter zal het wel niet opgelost kunnen worden
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 19:03
door jhnbk
recursief is altijd mooi
wie iets eleganter vindt moet het zeker posten
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 20:39
door qrnlk
Eleganter dan een tail recursion? Ik kan me het niet voorstellen.
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 20:40
door EvilBro
De Haskell code werkt niet. Tevens was ik benieuwd naar een versie die het probleem volledig oplost (dus niet alleen hoe je een digit uit een 5 cijferig getal krijgt). Ik zal even een overdreven Java variant geven:
Code: Selecteer alles
public class Test {
public static void main(String[] args) {
Test anObject = new Test();
System.out.println("Start");
anObject.printNumbers();
System.out.println("End");
}
private void printNumbers() {
for (int number = 10000; number < 100000; number++) {
int[] digits = splitNumberIntoDigits(number);
if (noZeros(digits) &&
noDuplicates(digits) &&
firstDigitCondition(digits) &&
secondDigitCondition(digits) &&
thirdDigitCondition(digits) &&
fourthDigitCondition(digits) &&
fifthDigitCondition(digits)) {
System.out.println("A hit: " + number);
}
}
}
private int[] splitNumberIntoDigits(int number) {
int[] digits = new int[5];
String aNumberString = new Integer(number).toString();
for (int i = 0; i < 5; i++) {
digits[i] = Integer.parseInt("" + aNumberString.charAt(i));
}
return digits;
}
private boolean noZeros(int[] digits) {
for (int i = 0; i < 5; i++) {
if (digits[i] == 0) {
return false;
}
}
return true;
}
private boolean noDuplicates(int[] digits) {
for (int i = 0; i < 4; i++) {
for (int j = i + 1; j < 5; j++) {
if (digits[i] == digits[j]) {
return false;
}
}
}
return true;
}
private boolean firstDigitCondition(int[] digits) {
if (isPrime(digits[0])) {
return true;
}
return false;
}
private boolean isPrime(int number) {
if (number < 2) {
return false;
}
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
private boolean secondDigitCondition(int[] digits) {
return (digits[1] == digits[4] - digits[0]);
}
private boolean thirdDigitCondition(int[] digits) {
return (digits[2] == 2 * digits[0]);
}
private boolean fourthDigitCondition(int[] digits) {
return (digits[3] == digits[2] + 3);
}
private boolean fifthDigitCondition(int[] digits) {
return (digits[4] == Math.abs(digits[0] - digits[3]));
}
}
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 20:50
door jhnbk
Eleganter dan een tail recursion? Ik kan me het niet voorstellen.
ken ik niet, kun je ene link geven met een voorbeeld?
mijn oplossing voor het probleem in python
Code: Selecteer alles
for a in [2,3,5,7]:
for b in range(1,10):
for c in range(1,10):
for d in range(1,10):
for e in range(1,10):
#a is juist
if b==e-a and c==2*a and d==c+3 and e==d-a:
solution=[a,b,c,d,e]
solution.sort()
double=False
for i in range(5):
try:
if solution[i]==solution[i-1]:
double=True
break
except IndexError:
pass
if double==False:
print a,b,c,d,e
geeft als oplossing
23475
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 21:02
door qrnlk
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 21:13
door EvilBro
mijn oplossing voor het probleem in python
Ik denk dat het de bedoeling is om alle getallen tussen 9999 en 100000 te evalueren (niet alleen de mogelijke getallen). Priemgetallen 'voorzeggen' vind ik ook valsspelen...
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 21:28
door jhnbk
Mooie oplossing in python.
thx
die tail recursion is wel interessant, maar vermits ik programmeren zelf heb geleerd ben ik daar niet veel mee
edit: @EvilBro: ik zal direct mijn vals gespeel rechtzetten
voila
Code: Selecteer alles
def digit(getal,i):
if i==1:
return getal%10
else:
return digit(getal/10,i-1)
for getal in range(10000,100000):
e=digit(getal,1)
d=digit(getal,2)
c=digit(getal,3)
b=digit(getal,4)
a=digit(getal,5)
if b==e-a and c==2*a and d==c+3 and e==d-a and a in [2,3,5,7]:
solution=[a,b,c,d,e]
solution.sort()
double=False
for i in range(5):
try:
if solution[i]==solution[i-1]:
double=True
break
except IndexError:
pass
if double==False:
print a,b,c,d,e
kan sneller door direct een lijst te gebruiken (was te lui, ik wou copy paste doen)
uiteraard is de vorige code sneller
uiteraard speel ik nog vals met die priemgetallen
Code: Selecteer alles
def ispriem(getal):
if getal==1:
return False
for i in range(2,getal):
if getal%i==0:
return False
return True
is beter, en snel genoeg voor getal<10
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 22:06
door qrnlk
Ik ben vandaag echter de hele dag aan het programmeren geweest in ruby dus mogelijk dat ik ze zie vliegen nu
maar volgens mij die try ... except er uit halen als je range(4) doet en de test over solution
== solution[i+1] tenminste ik denk dat de reden is dat je een -1 element probeert te gebruiken?
wat doet range(n)?
Re: Programmeerprobleem
Geplaatst: wo 25 apr 2007, 23:10
door Schwartz
Ben druk bezig om in APRAS de compiler te herschrijven die uitgebracht kan worden.
Maar er moet dan ook een HTM editor komen die foutloos werkt en die ik erbij kan leveren.
Ik wil zelf ook nog een editor erbij maken waarbij men de routinen kan dichtklappen zoals vroeger bij de ATARI GFA basic.
Ik moet alles alleen doen en het is mijn hobby , dus geen haast mee.
Als je leuke routinen in pascal erbij wilt hebben kun je ze gerust naar mijn email zenden.
Wel getest en 100% goed werkend, en geen onnodig recursieve toestanden die de snelheid van een routine eruit haalt.
Ik had een keer een routine die ik na enige aanpassing 20 keer sneller kon laten functioneren.
En goed van remarks voorzien zodat ik weet wat er allemaal gaande is.
En geen verwijzingen naar andere routinen die er niet bij geleverd worden.
Ik ben vooral op zoek naar routinen inzake natuurkunde, ingenieursvakken etc.
(alleen de simpele die vaak voorkomen)
Re: Programmeerprobleem
Geplaatst: do 26 apr 2007, 06:21
door EvilBro
@jhnbk: Ik kan niet ontdekken waar je controleert dat een oplossing geen nullen bevat. Of doe je dit niet en heb je de mazzel dat de rest van de voorwaarden al deze mogelijke oplossingen al uitsluiten?
@qrnlk:
Google?
Re: Programmeerprobleem
Geplaatst: do 26 apr 2007, 07:17
door qrnlk
lui en moe
Re: Programmeerprobleem
Geplaatst: do 26 apr 2007, 08:31
door jhnbk
@qrnlk: je hebt uiteraard gelijk, ik heb niet goed nagedacht
wat doet range? enkele voorbeelden:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1,5)
[1, 2, 3, 4]
>>> range(1,10,2)
[1, 3, 5, 7, 9]
>>> range(10,1,-2)
[10, 8, 6, 4, 2]
>>>
@EvilBro: mijn 1e oplossing hield daar rekening mee, mijn 2de eigenlijk onrechtstreeks (0 kan daar volgens mij niet)