Für die Rätsler

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

das wurgel

Betreff: Für die Rätsler

BeitragMi, Jun 05, 2013 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Rätsel hat mir mein Freund gesagt. Ich habe Spaß dran gehabt. Dachte mir, möglicherweise macht das auch anderen Menschen Spaß, besonders Menschen, die programmieren.

Hier ist es: Folgendes soll so angeordnet werden, das ein Term mit Ergebnis 1000 rauskommt: 1 1 1 1 7 7 7 * +

Beispiel für einen Term, der nicht 1000 ergibt: 117 + 77 * 11 = nicht 1000

Mein Programm poste ich, wenn jemand dannach fragt (Ich finde meine Lösung schön). Das Genie, welches das löst ohne ein Programm zu schreiben, soll bitte freundlicherweise erklären, wie er/sie das gemacht hat, falls das überhaupt geht (ohne ewiges Probieren mein ich).

Viel Spaß! Smile

edit:
Achja, und wenn jemand einen Lösealgo geschrieben hat und den dann postet, dann sorgt das bei dem hier ab und zu reinguckenden Ich für Freude (Ich habe jemanden Spaß bereitet, juhuu!). Und außerdem ist man dann ja (genau wie ich) sehr stolz darauf, es gelöst zu haben, oder?

edit2:
Vorher stand da: 1 1 1 1 7 7 * +, danke PhillipK.
Und Punkt vor Strich, ja.
1 ist ungefähr 3
  • Zuletzt bearbeitet von das wurgel am Mi, Jun 05, 2013 23:10, insgesamt einmal bearbeitet
 

PhillipK

BeitragMi, Jun 05, 2013 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hm. cooles ding, aber rahmenbedingungen müssen noch klargestellt werden:

Nämlich, du hast eine punkt operation sowie eine strichoperation. Gelten normale rechenregeln oder "von links nach rechts" ?

Beispiel:

2 + 2 * 2 = 6 bei punkt v. strich
2 + 2 * 2 = 8 bei "links nach rechts"

Ah edit:

Zitat:
Hier ist es: Folgendes soll so angeordnet werden, das ein Term mit Ergebnis 1000 rauskommt: 1 1 1 1 7 7 * +

Beispiel für einen Term, der nicht 1000 ergibt: 117 + 77 * 11 = nicht 1000


Du gibst als zahlenmenge 4 mal die eins und 2 mal die sieben vor.
In deinem beispiel verwendest du aber 4 einsen und 3 siebener - welche vorgabge ist nun richtig?
1 1 1 1 7 7 7 * + VS 1 1 1 1 7 7 * +

das wurgel

BeitragMi, Jun 05, 2013 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist nun eindeutig gestellt, das Rätsel. Es gilt Punkt vor Strich.
1 ist ungefähr 3

ChaosCoder

BeitragDo, Jun 06, 2013 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurz drauf geguckt und das Ergebnis relativ schnell gefunden.

Hier der Weg, wie ich darauf gekommen bin:
Dadurch, dass eine Zahl, die auf 0 endet, herauskommen muss, kann man sich die möglichen letzten Ziffern der Multiplikation schnell denken. 1*7 = 7*1 = 7; 1 * 1 = 1 und 7*7 = ...9. Desweiteren weiß man, dass der zweite Summand ebenfalls nur auf 7 und 1 enden kann. Nun sucht man sich die passenden Endungen raus, damit hinten eine 0 rauskommt: 7*7+1. Nun ist ein bisschen Zahlengefühl notwendig, damit man gleich darauf kommt, dass 77*17 zu viel ist, also bleibt nur 17*17. Diese Zahl kennt man vielleicht sogar, da sie eine Quadratzahl ist. Dann die restliche 7 und 1 so vorne an den Summanden geklebt, dass 1000 rauskommt: 17*17+711.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

darth

BeitragFr, Jun 07, 2013 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
JavaScript, weil deshalb.

Code: [AUSKLAPPEN]

         var permList = [];
         var createPerm = function(list, n) {
            if (n == list.length -1) {
               var s = '';
               for (var i = 0; i < list.length; i++) {
                  s = s + list[i];
               }
               
               permList.push(s);
               return;
            }
            
            var tmp;
            for (var i = n; i < list.length; i++) {
               tmp = list[n];
               list[n] = list[i];
               list[i] = tmp;
               
               createPerm(list, n+1);
               
               tmp = list[n];
               list[n] = list[i];
               list[i] = tmp;
            }
         };
         
         $(document).ready(function() {
            createPerm(['1', '1', '1', '1', '7', '7', '7', '*', '+'], 0);
            
            for (var i = 0; i < permList.length; i++) {
               try {
                  var res = stringParser(permList[i]);
                  
                  if (Math.abs(parseFloat(res) - 1000) < 0.0001) {
                     $('#res').append(permList[i] + ' = ' + res + '<br/>');
                     break;
                  }
               }catch(e){
                  // IGNORE
               }
            }
         });


Oder wolltest du es effizient? :>

MfG,
Darth
Diese Signatur ist leer.

das wurgel

BeitragSa, Jun 08, 2013 0:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@ ChaosCoder: Ja stimmt, da bin ich nicht drauf gekommen. Sehr schön Smile

@ darth: Gute Idee mit den Vertauschungskombinationen Smile

Ich mach das vielleicht noch ein bisschen schwieriger, sodass man eventuell auch Probleme mit der Berechnungsdauer bekommen könnte.

Mein Algo sieht so aus: (Java)
Code: [AUSKLAPPEN]
public class CopyOfRaetsel {

   private static int[] restziffern = {4, 3}; // Einsen und Siebenen

   
   public static void main(String[] args) {
      
      int zahl1=erhoehe(0);
      while (zahl1>0 && zahl1<=777) {
         
         int zahl2=erhoehe(0);
         while (zahl2>0 && zahl2<=zahl1) {
            
            if (zahl1 * zahl2 >= 1000) break;
            
            int zahl3 = kleinsteAusRest();
            while (zahl3>0) {
               
               if ((zahl1*zahl2+zahl3)==1000)
                  System.out.println(
                        zahl1+" *\t" + zahl2 + " +\t" + zahl3 + " =\t" + (zahl1*zahl2+zahl3));
               
               zahl3=erhoehe(zahl3);
            }
            zurueckLegen(zahl3);
            
            zahl2=erhoehe(zahl2);
         }
         zurueckLegen(zahl2);
         
         zahl1=erhoehe(zahl1);
      }
      zurueckLegen(zahl1);
   }
   
   
   // Legt die Ziffern zurück, bildet die nächstgrößte Zahl und
   // nimmt dessen Ziffern wieder aus den verbleibenden
   public static int erhoehe(int zahl){
      return erhoehe(zahl, 0);
   }

   private static int erhoehe(int zahl, int i) {
      if (i==0 && restziffern[0]==0 && restziffern[1]==0){
         int zahlTmp=zahl;
         boolean sevenAppeared=false;
         boolean isOk=false;
         while (zahlTmp>0){
            if (zahlTmp%10 == 1 && sevenAppeared){
               isOk=true;
               
            }
            if (zahlTmp%10 == 7) sevenAppeared=true;
            zahlTmp/=10;
         }
         if (!isOk){
            zurueckLegen(zahl);
            return -1;
         }
      }
      
      int stelle = (int)Math.pow(10, i);
      int ziffer = zahl / stelle % 10;
      if (ziffer == 0){
         restziffern[0]--;
         zahl+=stelle;
      } else if (ziffer == 1) {
         restziffern[0]++;
         restziffern[1]--;
         zahl+=stelle*6;
      } else if (ziffer == 7) {
         zahl-=stelle*6;
         restziffern[0]--;
         restziffern[1]++;
         zahl=erhoehe(zahl, i+1);
      }
      if (restziffern[0]<0 || restziffern[1]<0 && i==0) return erhoehe(zahl);
      return zahl;
   }
   
   // Bildet die kleinste Zahl aus unverbrauchten Ziffern
   public static int kleinsteAusRest(){
      int zahl=0;
      
      int tmp=7;
      for (int i=0; i<restziffern[1]; i++){
         zahl+=tmp;
         tmp*=10;
      }
      
      tmp=tmp/7;
      for (int i=0; i<restziffern[0]; i++){
         zahl+=tmp;
         tmp*=10;
      }
      
      restziffern[0]=0;
      restziffern[1]=0;
      
      return zahl;
   }
   
   // Zählt Ziffern der Zahl wieder als unverbraucht.
   public static void zurueckLegen(int zahl){
      while (zahl>0){
         if (zahl%10 == 1) restziffern[0]++;
         if (zahl%10 == 7) restziffern[1]++;
         zahl/=10;
      }
   }
   
}


Wer Lust hat, hierfür könnte man auch mal einen Lösungsalgo programmieren: http://www.mathematische-baste...hlange.htm
Wäre vielleicht auch mal was für nen BlitzQuiz oder so.
1 ist ungefähr 3

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group