1. Java / Говнокод #10238

    +79

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 10 Мая 2012

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

    • Нохчо код - форматирование в стиле полумесяца :P
      Ответить
    • Автор переплюнул Данте, у того всего 6 кругов было, а здесь аж 8 (4 for и 4 while).
      Ответить
    • Ну как бы на PE народ не качеством и поддерживаемостью кода меряеется :) Так что и такое решение сойдет.
      Ответить
      • ну правильно: пока жавабляди и крестосвитеры меряются у кого быстрее на наносекунду, программисты катают шлюх в инфинити.
        Ответить
      • Да нет же, меряются всем чем можно мерятся: красотой кода, хорошо подобранными алгоритмами, скоростью...
        Ответить
    • Мои глазааа...
      Ответить
      • дополним пост синусоидной структурой комментариев
        Ответить
    • > and it's fast.

      Да не особо: http://ideone.com/NuqZS http://ideone.com/oJmBD
      Ответить
      • //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.
        Ответить
        • Охуеть, я дальше просто не стал смотреть, а то начну плакать кровавыми слезами.
          Ответить

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