Jawa / Говнокод #10238 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
import java.util.*;

class Euler32 {
    public static void main(String[] args) {
	int total=0;

	LinkedList<Integer> remDigits=new LinkedList<Integer>();
	for(int n=1;n<=9;n++)
		remDigits.add(new Integer(n));
	
	for(int n9=2;n9<9;n9++){ //starting digit can't be 1 or 2
	  int thouC=(remDigits.get(n9)).intValue();
	  remDigits.remove(n9);
	  for(int n8=0;n8<8;n8++){
	    int hundC=(remDigits.get(n8)).intValue();
	    remDigits.remove(n8);
	    for(int n7=0;n7<7;n7++){
	      int tenC=(remDigits.get(n7)).intValue();
	      remDigits.remove(n7);
	      for(int n6=0;n6<6;n6++){
		int oneC=(remDigits.get(n6)).intValue();
		remDigits.remove(n6);

		int c=1000*thouC+100*hundC+10*tenC+oneC;
		boolean found=false;
		int n5=0;
		while((n5<5)&&(found==false)){
		    int ab1=(remDigits.get(n5)).intValue();
		    remDigits.remove(n5);
		    int n4=0;
		    while((n4<4)&&(found==false)){
		      int ab2=(remDigits.get(n4)).intValue();
		      remDigits.remove(n4);
		      int n3=0;
		      while((n3<3)&&(found==false)){
			int ab3=(remDigits.get(n3)).intValue();
		      	remDigits.remove(n3);
		      	int n2=0;
			while((n2<2)&&(found==false)){
			  int ab4=(remDigits.get(n2)).intValue();
			  remDigits.remove(n2);
			  int ab5=(remDigits.get(0)).intValue();

			  int a3=100*ab1+10*ab2+ab3;
			  int a4=1000*ab1+100*ab2+10*ab3+ab4;
			  int b2=10*ab4+ab5;
			  int b1=ab5;

			  if((a3*b2)==c){
			    found=true;
			    total+=c;
			    System.out.println(c+" = "+a3+"x"+b2); 
			    }
			  else if((a4*b1)==c){
			   found=true;
			   total+=c;
			   System.out.println(c+" = "+a4+"x"+b1); 
			   }

			  remDigits.add(n2,new Integer(ab4));
			  n2++;
			  }
			remDigits.add(n3,new Integer(ab3));
		      	n3++;
			}
		      remDigits.add(n4,new Integer(ab2));
		      n4++;
		      }
		    remDigits.add(n5,new Integer(ab1));
		    n5++;
		    }

		remDigits.add(n6,new Integer(oneC));
		}
	      remDigits.add(n7,new Integer(tenC));
	      }
	    remDigits.add(n8,new Integer(hundC));
	    }
	  remDigits.add(n9,new Integer(thouC));
	  }
	System.out.println(total);	
    }
}

http://projecteuler.net/problem=32
http://projecteuler.net/thread=32;page=2


>My code is absolutely hideous, but it works and it's fast.

Извиняюсь за длинный пост, но это просто шедевр, я не мог это не запостить!

Запостил: TheHamstertamer TheHamstertamer, (Updated )

Комментарии (15) RSS

  • Нохчо код - форматирование в стиле полумесяца 😛
    Ответить
  • Автор переплюнул Данте, у того всего 6 кругов было, а здесь аж 8 (4 for и 4 while).
    Ответить
  • Ну как бы на PE народ не качеством и поддерживаемостью кода меряеется 🙂 Так что и такое решение сойдет.
    Ответить
    • ну правильно: пока жавабляди и крестосвитеры меряются у кого быстрее на наносекунду, программисты катают шлюх в инфинити.
      Ответить
    • Да нет же, меряются всем чем можно мерятся: красотой кода, хорошо подобранными алгоритмами, скоростью...
      Ответить
    • дополним пост синусоидной структурой комментариев
      Ответить
    • //starting digit can't be 1 or 2 -- точно, можно от 3456 проверять
      Ответить
  • Еще один гений:
    http://projecteuler.net/thread=32;page=8

    public class Pandigital {
    	
    	private Boolean isPandigital(Integer value1, Integer value2){
    		
    		StringBuffer sb = new StringBuffer();
    		Set<String> set = new HashSet<String>();
    		
    		Integer result = value1*value2;
    		sb.append(value1);
    		sb.append(value2);
    		sb.append(result);
    		
    		String s = sb.toString();
    		
    		if(s.length()==9){
    			
    			for(int i=0;i<s.length();i++){
    				char ca = s.charAt(i);
    				if((ca-'0')==1 ||(ca-'0')==2||(ca-'0')==3||(ca-'0')==4||(ca-'0')==5||(ca-'0')==6
    						||(ca-'0')==7||(ca-'0')==8||(ca-'0')==9){
    					
    					set.add(""+ca);
    					
    				}
    				
    			}
    			
    			if(set.size()==9){
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	public Integer count(){
    		Integer sum = 0;
    		Set<String> results = new HashSet<String>();
    		Integer result;
    		for(int i=1;i<=100;i++){
    			for(int j=1;j<=10000;++j){
    				if(this.isPandigital(i, j)){
    					result=i*j;
    					results.add(""+result);
    				}
    			}
    		}
    		
    		for(String s:results){
    			sum+=new Integer(s);
    		}
    		
    		return sum;
    	}
    	
    	public static void main(String...args){
    		Pandigital pandigital = new Pandigital();
    		long start = System.currentTimeMillis();
    		System.out.println("result = "+pandigital.count());
    		long end = System.currentTimeMillis();
    		
    		System.out.println(end-start+" ms");
    	}
    }
    Ответить
    • У тебя красивое решение. Я решил попробовать по-другому и поработать с перестановками, но там сложность сильно больше
      (ns project-euler.pandigits
        (:require [clojure.math [combinatorics :as comb]]))
      
      (defn make-chunks [elems sizes]
        (if (some empty? [elems sizes])
          [elems]
          (let [parts (split-at (first sizes) elems)]
            (cons (parts 0)
                  (make-chunks (parts 1) (rest sizes))))))
      
      (defn make-numbers [chunks]
        (map #(Integer/parseInt (apply str %)) chunks))
      
      (defn split-to-numbers [perm]
        (map #(vec (make-numbers (make-chunks perm %))) [[2 3] [1 4]]))
      
      (defn take-product [splitted]
        (splitted 2))
      
      (defn pandigital? [splitted]
        (= (splitted 2) (* (splitted 0) (splitted 1))))
      
      (defn candidates-seq []
        (mapcat split-to-numbers (comb/permutations "123456789")))
      
      (defn sum-of-pandigital-products []
        (reduce + (set (map take-product
                            (filter pandigital? (candidates-seq))))))
      Ответить
    • Там, кстати, следующий товарищ умудрился 6 секунд на джаве получить с core i7, завернул итерацию с типом Long вместо long.
      Ответить
      • Охуеть, я дальше просто не стал смотреть, а то начну плакать кровавыми слезами.
        Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8