数字が幸せかどうかを見つけますか?


21

ハッピーナンバーは、次のプロセスで定義されます。任意の正の整数で開始し、数字をその数字の2乗の合計で置き換え、数字が1になるまで(それが留まる)、または1を含まないサイクルで無限にループするまでプロセスを繰り返します。このプロセスが1で終わるのは幸せな数字であり、1で終わらないものは不幸な数字(または悲しい数字)です。それが幸福であるか不幸であるかに関係なく、数字を印刷します。

Sample Inputs
7
4
13

Sample Outputs
Happy
Unhappy
Happy

注:1,000,000,000未満の数値については、プログラムに10秒以上かかることはありません。

回答:



11

ルビー、77文字

a=gets.to_i;a=eval"#{a}".gsub /./,'+\&**2'until a<5
puts a<2?:Happy: :Unhappy

OKか否か?私は妥当性に疑問を投げかけるのではなく、論理に疑問を投げかけます。
ラマ氏

2
それは同じであるa <= 4a <= 1。サイクルに1が含まれている場合、それは幸せです。4に含まれている場合、それは幸せではありません。不幸なサイクルについてはウィキペディアのセクションをご覧ください。したがって、の値aが4以下になると、彼はaがどうかをチェックします。その結果があなたの答えです。
ケーシー

8

C-115

char b[1<<30];a;main(n){for(scanf("%d",&n);b[n]^=1;n=a)for
(a=0;a+=n%10*(n%10),n/=10;);puts(n-1?"Unhappy":"Happy");}

これは、2 30バイト(1GB)の配列をビットマップとして使用して、サイクルで遭遇した数値を追跡します。Linuxでは、これは実際に機能し、効率的に動作するため、メモリのオーバーコミットが有効になっている(通常はデフォルトです)。オーバーコミットでは、配列のページがオンデマンドで割り当てられ、ゼロに設定されます。

Linuxでこのプログラムをコンパイルするには、ギガバイトのRAMを使用することに注意してください。


1
この問題のためにその量のメモリに近い場所が必要なのはなぜですか?
ピーターオルソン

1
@Peter:アプローチは、1〜1,000,000,000の許容入力範囲内の任意の数のサイクルを(単純に)キャッチすることだと思います。しかし、幸福数理論に照らして、必要な唯一のチェックは4に到達したかどうかであることに同意します。
mellamokb

私は好奇心が強いです:なぜそれをコンパイルするのにそんなに多くのRAMが必要なのですか
ピーターテイラー

1
MSVC 10を搭載したWindows 7で正常に動作しているように見えます。コンパイル中に顕著な量のメモリを消費せず、ページファイル内の配列のみをマークします。 。
ジョーイ

1
このアプローチの素朴さが大好きです。また、forループの乱用は美しいです。
-dmckee


6

Golfscript、49 43 41 40 39文字

~{0\10base{.*+}/.4>}do(!"UnhH"3/="appy"

すべての幸せな数は1に収束します。すべての不幸な数は、4を含むサイクルに収束します。その事実を利用する以外、これはほとんどまったくゴルフされません。

(Venteroに感謝します。VenteroのRubyソリューションから、私はトリックにニックを入れて6文字を節約しました)。


5

eTeX、153

\let~\def~\E#1{\else{\fi\if1#1H\else Unh\fi appy}\end}~\r#1?{\ifnum#1<5
\E#1\fi~\s#1{0?}}~\s#1{+#1*#1\s}~~{\expandafter\r\the\numexpr}\message{~\noexpand

として呼び出されますetex filename.tex 34*23 + 32/2 ?(最後に疑問符を含む)。式内のスペースは重要ではありません。

編集:私は123になったが、現在は出力がdvi(でコンパイルされている場合etex)またはpdf(でコンパイルされている場合pdfetex)です。TeXは組版言語なので、それは公平だと思います。

\def~{\expandafter\r\the\numexpr}\def\r#1?{\ifnum#1<5 \if1#1H\else
Unh\fi appy\end\fi~\s#1{0?}}\def\s#1{+#1*#1\s}~\noexpand

4

Python-81文字

n=input()
while n>4:n=sum((ord(c)-48)**2for c in`n`)
print("H","Unh")[n>1]+"appy"

VenteroとPeter Taylorからのインスピレーション。


2
やったほうが良いint(c)よりもord(c)-48....
st0le

4

Javascript(94 92 87 86)

do{n=0;for(i in a){n+=a[i]*a[i]|0}a=n+''}while(n>4);alert(['H','Unh'][n>1?1:0]+'appy')

入力は、必要な数にaを設定することによって提供されます。

mellamokbのクレジット。


1文字節約:n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
-mellamokb

@mellaありがとう。またに変え||て別の炭を剃りました|
ピーターオルソン

8文字を保存:を削除しn==4?h...ます。条件付きのdo ... whileループに変更しますwhile(n>4)。次に、代わりにこの最終ステートメントを使用しますalert(["H","Unh"][n>1?1:0]+"appy")
。– mellamokb

@Mella Clever、私はそれが好きです。
ピーターオルソン

@Mella nはwhileループの前に定義する必要があります。繰り返してはいけない方法を考えていますn=0;
ピーターオルソン

4

Python(98、しかし混乱して共有できない)

f=lambda n:eval({1:'"H"',4:'"Unh"'}.get(n,'f(sum(int(x)**2for x in`n`))'))
print f(input())+"appy"

競争力を発揮するには長すぎますが、笑いに向いているかもしれません。Pythonで「遅延」評価を行います。Haskellのエントリに非常によく似ていますが、私はそれについて考えていますが、魅力はまったくありません。


4

dc-47文字

[Unh]?[[I~d*rd0<H+]dsHxd4<h]dshx72so1=oP[appy]p

簡単な説明:

I~:10で除算するときに商と剰余を取得します。
d*:剰余を二乗します。
0<H:商が0より大きい場合、再帰的に繰り返します。
+:再帰スタックを縮小するときに値を合計します。

4<h:値が4より大きい間、平方和ビットを繰り返します。


4

Befunge、109

1 <= n <= 10 9 -1の正しい値を返します。

v v              <   @,,,,,"Happy"<      >"yppahnU",,,,,,,@
>&>:25*%:*\25*/:#^_$+++++++++:1-!#^_:4-!#^_10g11p

3

J、56

'Happy'"_`('Unhappy'"_)`([:$:[:+/*:@:"."0@":)@.(1&<+4&<)

質問があいまいなので、スタンドアロンスクリプトではなく動詞。

使用法:

   happy =: 'Happy'"_`('Unhappy'"_)`([:$:[:+/*:@:"."0@":)@.(1&<+4&<)
happy =: 'Happy'"_`('Unhappy'"_)`([:$:[:+/*:@:"."0@":)@.(1&<+4&<)
   happy"0 (7 4 13)
happy"0 (7 4 13)
Happy  
Unhappy
Happy  

3

Scala、145文字

def d(n:Int):Int=if(n<10)n*n else d(n%10)+d(n/10)
def h(n:Int):Unit=n match{
case 1=>println("happy")
case 4=>println("unhappy")
case x=>h(d(x))}

1
(n*n)として短くなることはありませんかn*n 、またはif-expressionを分離するには空白では不十分elseですか?
ピーターテイラー

はい、そうしました、ピーター。
ユーザー不明

パターンマッチングを使用しない、126バイトの末尾再帰バージョンをdef h(s: String):String=if(s=="1")"H"else if(s=="4")"Unh"else h(s.map(_.asDigit).map(a=>a*a).sum+"");print(h(readLine)+"appy")
次に示します。– 6infinity8

@ 6infinity8:新しい答えとして投稿してみませんか?
ユーザー不明

最初の投稿は古いです。私はあなたのソリューションを改善しようとしていました。
6infinity8

3

J(50)

'appy',~>('Unh';'H'){~=&1`$:@.(>&6)@(+/@:*:@:("."0)@":)

私はこれをさらに短くすることができるよりも有能なJ-erであると確信しています。私は相対的な初心者です。

新しくなり改善された:

('Unhappy';'Happy'){~=&1`$:@.(>&6)@(+/@:*:@:("."0)@":)

Newıʇǝɥʇuʎsのおかげで、より新しく、さらに改善されました:

(Unhappy`Happy){~=&1`$:@.(>&6)@(+/@:*:@:("."0)@":)

1
「appy」を分割しないことでキャラクターを獲得できます。括弧を囲むこともできます( "。" 0)-副詞は接続詞よりも強く結合します。
ジェシーミリカン

かっこを削除できません("."0)。それはランクエラーを生成しますが、「Happy」を分割せずに結果をボックス化したままにしない場合、キャラクターを保存できます。
グレゴリーヒグレー

括弧を省略できない理由("."0)は、接続詞が接続されている先行する一連の動詞全体に接続詞が適用されるためです。これは私が望むものではありません。私が言うならば、それは実際+/@:("."0)@":とは大きく異なります。+/@:"."0@:(+/@:".)"0@:
グレゴリーヒグレー

1
巨大なネクロですが、に置き換えること'Unhappy';'Happy'で4文字節約できますUnhappy`Happy
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎsそれは機能しますが、 `で文字列の引用をスキップできることはどこに文書化されていますか?
グレゴリーヒグレー14

2

Python(91文字)

a=lambda b:b-1and(b-4and a(sum(int(c)**2for c in`b`))or"Unh")or"H";print a(input())+"appy"

2

Common Lisp 138

(format t"~Aappy~%"(do((i(read)(loop for c across(prin1-to-string i)sum(let((y(digit-char-p c)))(* y y)))))((< i 5)(if(= i 1)"H""Unh"))))

より読みやすい:

(format t "~Aappy~%"
        (do
          ((i (read)
              (loop for c across (prin1-to-string i)
                    sum (let
                          ((y (digit-char-p c)))
                          (* y y)))))
          ((< i 5) (if (= i 1) "H" "Unh"))))

から「Happy」または「Unhappy」を返すだけで短くなります(do)が、おそらくプログラム全体としてはカウントされません



2

ゼリー、17 バイト(非競合*)

*言語のポストデートチャレンジ

D²SµÐLỊị“¢*X“<@Ḥ»

オンラインでお試しください!

どうやって?

D²SµÐLỊị“¢*X“<@Ḥ» - Main link: n
   µÐL            - loop while the accumulated unique set of results change:
D                 -   cast to a decimal list
 ²                -   square (vectorises)
  S               -   sum
                  - (yields the ultimate result, e.g. n=89 yields 58 since it enters the
                  -  "unhappy circle" at 145, loops around to 58 which would yield 145.)
      Ị           - insignificant? (abs(v)<=1 - in this case, 1 for 1, 0 otherwise)
        “¢*X“<@Ḥ» - dictionary lookup of ["Happy", "Unhappy"] (the central “ makes a list)
       ị          - index into
                  - implicit print

1

Perl 5-77バイト

{$n=$_*$_ for split//,$u{$n}=$n;exit warn$/.'un'[$n==1].'happy'if$u{$n};redo}

$ nは入力値です


1

05AB1E、21 バイト

'ŽØs[SnOD5‹#}≠i„unì}™

オンラインそれを試してみてくださいまたは最初の100のテストケースを検証します

説明:

各数値は最終的に1またはのいずれか4になるため、無限にループし、数値が5を下回るとすぐに停止します。

'ŽØ                    '# Push string "happy"
   s                    # Swap to take the (implicit) input
    [       }           # Loop indefinitely
     S                  #  Convert the integer to a list of digits
      n                 #  Square each
       O                #  Take the sum
        D5‹#            #  If this sum is smaller than 5: stop the infinite loop
             i    }    # If the result after the loop is NOT 1:
               unì     #  Prepend string "un" to string "happy"
                       # Convert the string to titlecase (and output implicitly)

(セクション鉱山のこの05AB1Eチップを参照してください。辞書を使用する方法?理由を理解すること'ŽØです"happy"


0

C ++ 135、2行

#include<iostream>
int n,i,j;int main(){for(std::cin>>n;n>1;n=++j&999?n*n+i:0)for(i=0;n/10;n/=10)i+=n%10*(n%10);std::cout<<(n?"H":"Unh")<<"appy";}

これは私がここでやったものの修正版です:

/programming/3543811/code-golf-happy-primes/3545056#3545056


何をし&999ますか?そしてj、ガベージ値がどのように機能するのでしょうか?
デビッドは、モニカを復活させる14

@ Dgrin91、私はこれを3年前に書いたので、それがどのように機能するかを正確に思い出すことができません。&999がステートメントを作成すると思いますif(j==999){n = 0;}else{n=n*n +i;}。jはガベージ値であってはならず、グローバルはゼロで初期化されます。
スコットローガン

0

はい、この課題には3年間あります。はい、すでに勝者の回答があります。しかし、私は退屈して別の挑戦のためにこれをやったので、私はそれをここに置くかもしれないと思った。サプライズサプライズ、その長い-そして...

Javaの- 280の 264バイト

import java.util.*;class H{public static void main(String[]a){int n=Integer.parseInt(new Scanner(System.in).nextLine()),t;while((t=h(n))/10!=0)n=t;System.out.print(t==1?"":"");}static int h(int n){if(n/10==0)return n*n;else return(int)Math.pow(n%10,2)+h(n/10);}}

ゴルフをしていない:

import java.util.*;

class H {

    public static void main(String[] a) {
        int n = Integer.parseInt(new Scanner(System.in).nextLine()), t;
        while ((t = h(n)) / 10 != 0) {
            n = t;
        }
        System.out.print(t == 1 ? "" : "");
    }

    static int h(int n) {
        if (n / 10 == 0) {
            return n * n;
        } else {
            return (int) Math.pow(n % 10, 2) + h(n / 10);
        }
    }
}


0

Clojure、107 97バイト

更新:不要なletバインディングを削除しました。

#(loop[v %](case v 1"Happy"4"Unhappy"(recur(apply +(for[i(for[c(str v)](-(int c)48))](* i i))))))

元の:

#(loop[v %](let[r(apply +(for[i(for[c(str v)](-(int c)48))](* i i)))](case r 1"Happy"4"Unhappy"(recur r))))

ネストされたfor:oを初めて使用する


0

R、117 91バイト

ジュゼッペのおかげで-16バイト

a=scan();while(!a%in%c(1,4))a=sum((a%/%10^(0:nchar(a))%%10)^2);`if`(a-1,'unhappy','happy')

1
strtoi代わりにas.numericとのpaste代わりに使用as.characterますが、数字取得するためのより短いアプローチがあります`if`(a-1,"unhappy","happy")代わりに使用する場合、別のバイトを保存する必要があります。最後に、これを匿名にして、さらに数バイト削り取ることができます。
ジュゼッペ



-1

C:1092文字

#include <iostream>
using namespace std ;
int main ()
{
    int m , a[25] , kan=0 , y , z=0  , n , o=0, s , k=0 , e[25]  ;
    do {
m :
        for ( int j=1 ; j <10000 ; j++ )
        {   
n:
            for (int i=0 ; j!=0 ; i++ )
            {
                a[i]=j%10 ;
                j/=10 ;
                kan++ ;
            }
            for ( int i=0 ; i<kan ; i++ )
            {
                y=a[i]*a[i] ;
                z+=y ;
            }
            k+=1 ;
            if (z==1)
            {
              cout<<j<<endl;
               o++ ;
            }

            else 
            {   
                 for (int f=0 ; f<k ; f++ )
                 {
                     e[f]=z ;
                 }
                 for ( int f=0 ; f=k-1 ; f++ )
                 {
                     for ( int p=f+1 ; p <k-1 ; p++ )
                     {
                         if(e[f]=e[p])
                             goto m ;
                         else { j=z ; goto n ; } 
                     }
                 }
            }
        }
    }while(o!=100) ;
    return 0 ;
}

6
プログラミングパズルとコードゴルフ、@ jannatへようこそ。コードゴルフは、可能な限り短いコードを書くという課題であることに注意してください。つまり、ここではインデントされておらず、ほとんど読み取り不可能なコードを記述し、言語構文の制限によりコードを可能な限り短くします。
マナトワーク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.