人生、宇宙、すべてに答える


46

仕事

入力として文字列を指定すると、入力文字列が正確に次の場合に42 のみタスクが出力されます。

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

入力が前述の文字列と等しくない場合、他の値を出力するか、エラーを生成するか、まったく出力しない場合があります。


受賞基準

これはなので、バイト単位の最短コードが勝ちです!


ここで提供されるソリューションの多くは、文字列が目的の文字列より長く、プレフィックスが目的の文字列と一致する場合に42を出力するため、間違っています。
fR0DDY

@froddy:キャラクターが1人だけだったら?文字列の後に(||)改行がありますか?私の通常の入力メカニズムは、入力が改行で終了するかどうかを気にしませんが、たとえば両方の場合で同じ結果をもたらします。
ジョーイ

@ fR0DDY:入力の残りの処理方法に関する明確な定義がなかったため、ここに「間違った」ものはありません。
PatrickvL

3
@PatrickvL入力が指定された文字列である場合にのみ「言及」します。だからabbcccddddeeeee...zzabc私が仮定することを満たさず、その入力にyesを与えるいくつかのプログラムを見ることができます。
-fR0DDY

2
@ fR0DDY:別の言い方をしましょう。入力がどのように区切られているかについての仕様はないので、それは解釈に対して開かれています。文字エンコーディングについても言及されていません(ほとんどの人が環境のデフォルトを想定していると思います-ANSI、UTF8、およびUTF16LEが最も一般的なものです)。また、入力がどのように表示されるかについても言及されていません-コマンドラインパラメーターを介して標準入力を介して入力されますか?このようにすべてを自由にすると、「間違っている」とマークする解釈に取って代わり、他の人がそれを「準拠」と判断することになります。NOFI、しかしこれは私たちの一部にとって毎日の習慣です。
PatrickvL

回答:


20

Golfscript、20

26,{.97+\{.}*}%=42`*

改行、21文字(ナブによる)

26,{).[96+]*}%n+=42`*

実際にナブは私のものを打ち負かしました、これは新しい行、22文字でのオリジナルのソリューションです

26,{.97+\{.}*}%n+=42`*

これは、単にソース文字列を生成し、標準入力からの文字列と比較するだけです。


3
26,{).[96+]*}%n+=42`*21(inc newline)。
ナブ

n+配列がフラットではないので、それなしでは機能しません。元の20文字を保持するか~、配列の内部項を平坦化するためにa を追加する必要があります。
ナブ

@Nabb、へー、改行が違うことを理解していなかった
あなた

13

Ruby 1.9、 46 42 39文字

p (?a..?z).map{|a|a*$.+=1}*""==gets&&42

入力が改行で終了していないと仮定します。


getsの改行はどうですか?
-steenslag

2
@steenslag:仕様は入力が改行で終了することを何も言っていないので、この解決策は何も存在しないと仮定します。
ヴェンテロ

11

Cプログラム-78 89

編集:余分な文字がある場合は42を印刷しないでください。

入力に末尾の改行がないと仮定します。

main(i,j){for(i=1;i<27;i++)for(j=i;j--;getchar()==96+i?0:exit(1));puts("42"+!!gets(&i));}

プレフィックスが一致しない場合、プログラムは終了します。接頭辞は一致するが、1〜3程度の余分な文字がある場合は2を出力します。それ以外の場合は、未定義の動作が発生します。

に変更exit(1)することにより、これを1文字短くすることができますfork()。ああ、無関係なメモでは、何らかの理由でシステムがロックアップした場合に備えて、開いているドキュメントを必ず保存してください。


1
文字列が目的の文字列よりも長く、プレフィックスが目的の文字列と一致する場合、42が出力されます。
fR0DDY

8

PHP(60)

入力がコマンドラインで提供されると仮定します:

for(;$i<702;)$s.=chr(96.5+sqrt($i+=2));echo$s!=$argv[1]?:42;

説明:文字列を三角形構造として表示できます。

j     i   val
0     0   a
1   1-2   bb
2   3-5   ccc
3   6-9   dddd
4 10-14   eeeee
5 15-20   ffffff
      ...

jはインデックスから始まりますi = j*(j+1)/2(これは三角数字の式です)。二次方程式を解くと、インデックスiがオンラインにj = int((sqrt(8*i+1)-1)/2)なり、したがってcharacterが含まれることになります97 + int((sqrt(8*i+1)-1)/2)0-350インデックスの範囲は、私たちがすることを簡素化することができます96.5 + sqrt(2*(i+1))が、それはもはや、大きな値のためにも当てはまるん。

編集:コメントで提案されているように、コマンドライン入力に切り替えました。
編集:条件演算子を使用してキャラクターを保存します


+1、それは動作します;)うーん、どのように$s.=chr(96.5+sqrt($i+=2));動作するのか詳しく説明していただけますか?
クライドロボ

編集済み。私はそれが理にかなっていることを望みます:
サムホセバー

for(; $ i <702;)$ s。= chr(96.5 + sqrt($ i + = 2)); echo($ s == $ argv [1])* 42; 標準入力を想定して61文字のみ
-Viper_Sb

@Viper_Sb:ヒントをありがとう。ルールがわからなかったので、Clydeのソリューションを模倣しました。私はあなたの提案に行きます。
サムホセバー

1
言語構文@powtacここにスペースを必要としない
サム・ホスバー

7

Perl、35 43

map$s.=$_ x++$a,a..z;say 42if<>~~$s

Perl 5.10以降(で実行-E)が必要で、入力に改行はありません。

私は副作用正規表現が好きでしたが、短いコードが話されました。ここではお土産としてです。Perl 5.10以降を対象としていますが、高度な/実験的な正規表現機能のみを対象としているため、pコマンドラインオプションのみが必要です。

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42

優れた。私はこのw / recursive正規表現に打ち勝ちましたが、43cを下回ることはできませんでした。:-((
ラバーブーツ

なぜ$a++."{$b}"ただ言う代わりに言う必要があるの$a++.$bですか?
ティムウィ

@Timwiは、結果の文字列にそれらの中括弧が必要だからです。リテラル「d4」で一致したくない、正規表現「d {4}」で表される「dddd」が必要
JB

もちろん。説明してくれてありがとう!
ティムウィ

このために33バイトのソリューションを見つけました!オンラインでお試しください!
ドムヘイスティングス

7

05AB1E、7バイト(非競合)

AƶJQi42

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

説明

A       push lowercase alphabet
 ƶ      lift every letter, push it and multiply it by its index
  J     join the list
   Qi   does it equal the input?
     42 push 42 and output implicitly

05AB1E(および一般的なゴルフ)を学ぶためにいくつかの課題を経験するだけです。この課題は昨日アクティブとしてマークされ、簡単な解決策を見つけたので、共有してみませんか?:)


3
PPCGへようこそ!
Steadybox

6

Haskellプログラム-71 67 64 57

末尾の改行を想定せず、改行も出力しません。

f x|x==[c|c<-['a'..'z'],_<-['a'..c]]="42"
main=interact f

使用法:

$ echo -n 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz' | { ./42; echo; }
42
$ echo -n 'something else' | { ./42; echo; }
42: 42.hs:1:0-54: Non-exhaustive patterns in function f


$

1
このコードはまだ非常に読みやすいです。
ダンバートン

1
以来zipWith、それは短いリストの最後に到達したときに停止し、あなたは置き換えることができます['a'..'z']['a'..]し、3つの文字を保存します。
ハンマー

@hammar:ありがとう。concatとzipWithの代わりに>> =(concatMap)を使用して、さらに1文字を保存しました。
ジョーイアダムス

@hammar:>> =およびlambdaの代わりにdo記法を使用することでさらに保存されました:-)
Joey Adams

2
@ジョーイ:またはそれ以上:[c|c<-['a'..'z'],_<-['a'..c]]
ハンマー

4

J、29

f=:42#~((>:#a.{~97+])i.26)-:]

例:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42

私はJが好きです。そして、私はそれがくて恐ろしいと思います。そして私はそれが好きです。
seequ 14年

4

D:94文字

void f(S)(S s){S t;foreach(i;0..26)t~=array(repeat(cast(char)(i+'a'),i+1));s==t&&writeln(42);}

より読みやすく:

void f(S)(S s)
{
    S t;

    foreach(i; 0 .. 26)
        t ~= array(repeat(cast(char)(i + 'a'), i + 1));

    s == t && writeln(42);
}

3

Delphi、164 132

これは文字列を作成し、それを最初のコマンドライン引数と比較するだけです。私の他の提出よりも短くてトリッキーではありません:

var s:string;c,i:int8;begin repeat s:=s+Char(c+97);i:=i-1;c:=c+Ord(i<0);if i<0then i:=c;until c=26;Write(42*Ord(s=ParamStr(1)));end.

(このバージョンでは、私のバージョンのDelphi(2010)の場合のように、cおよびi変数が0で初期化されることを前提としていることに注意してください。)

私の他の提出物と同様に、これは以前にやったように文字列構築が関数内で行われない場合、必要な文字が少なくなります:

Delphi、181

program a;{$APPTYPE CONSOLE}function s(c,i:byte):string;begin if(i>0)then Exit(Char(c)+s(c,i-1));if(c<122)then Exit(s(c+1,c-95));end;begin if(s(97,1)=ParamStr(1))then Write(42);end.

出力には改行が必要ないため、WriteLn()はWrite()になりました。


3

PHP-45文字

ハッシュを使用した回答が誰も投稿していないことに驚いています。正確な文字列をテストする非常に効率的な方法です。

echo md5($argv[1],1)!='¯è a@ÛÚƒ:ïT�p'?:42;

コードの途中にヌルバイトがあるため、データのコピー/貼り付けが困難です。テスト用のコードの16進ダンプを次に示します。

65 63 68 6f 20 6d 64 35 28 24 61 72 67 76 5b 31 5d 2c 31 29 21 3d 27 af e8 a0 61 40 db da 7f 11 0f 83 3a ef 54 00 70 27 3f 3a 34 32 3b


2
賢い!技術的にはこの同じハッシュを生成する他の入力値があるため、入力が指定された形式である場合にのみ 42を出力するという要件を完全に満たしていません。
mellamokb

3

Scala 79

 if((for(i <- 1 to 26;j<-1 to i)yield(96+i).toChar).mkString==args(0))print(42)

3

Pyth、14

*42qzsm*dhxGdG

必要な文字列を作成し、入力と比較して42を掛けるだけです。


「入力と比較し、42で乗算します。」それを自分で考えたことはなかっただろう。あなたは私が私のソリューションから1文字を剃るのを手伝います。ありがとう。
AndoDaan

ああ、遅すぎた。仕組みを説明できますか?この関数はmトラブルを引き起こします…
ジム

1
@Jim map関数から始めmます。これは、入力の各要素に関数を適用します。入力はG、アルファベットです。xGdは、dアルファベットの文字の位置、アルファベットのを見つけGます。hそれを1つ増やし、その*d回数だけキャラクターを複製します。m関数の外側で、s結果の文字列リストを単一の文字列に結合しqz、結果が入力と等しいかどうかを確認します。ブール値は、False およびTrue の場合0と同じように表される1ため*42、値が42Trueの0場合とFalseの場合になります。
isaacg

3

Brachylog(2)、15バイト、言語ポストデートチャレンジ

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆

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

そして今、ここで見られるほとんどとは完全に異なる原理で機能する答えのために。これは関数のサブミットです(質問ではどのようなサブミットが望ましいかは指定されていませんが、デフォルトでは関数が許可されています)。

説明

この答えは、ある種の文字列を定義することで機能します。a)アルファベットのすべての小文字を含む文字、b)並べ替えられた順序、c)文字列内の各文字の出現回数を取得すると連続するシーケンス1から始まる整数(このような文字列が多数あることは明らかですが、特殊なケースにしたいものが最短です。)その後、文字列がこれらの基準を満たしている場合、16を個別の文字の数に追加します文字列; 文字列が特別な場合に質問されたものである場合は42、その他の場合は少なくとも43が生成されます。(文字列がカテゴリに属する​​基準のいずれかに失敗すると、関数は失敗に終わります。これは、例外をスローするようなものです。)

ソースコードの解釈方法は次のとおりです。

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆
⊇Ạ               {the input} contains all lowercase letters
  ∧              and
   ?o?           the input sorts to itself
                 {and; implied when two conditions overlap}
     ?ọ          the {character, number of occurrences} pairs for the input
       tᵐ        when the second element of each is taken
         ~       create an output that could have been produced by
          ⟦₁     outputting the list of integers from 1 to some input inclusive;
            +₁₆  add 16 to that input {and output it}

3

R、60 58

if(readline()==paste0(rep(letters,1:26),collapse=""))cat(42)

if(scan(,"")==paste(rep(letters,1:26),collapse=""))cat(42)

@giusppeによる提案をありがとう


pasteここでは問題ないと思います。scan(,"")代わりにを使用できますreadline()
ジュゼッペ

2

パイソン(84)

入力の終わりに末尾の改行を想定します。

インポートシステム
if ''。join(c * chr(c + 96)for c in range(27))+ '\ n' == sys.stdin.read():print 42

1
raw_input代わりに使用しないのはなぜsys.stdin.readですか?
フアン

1
@Juan:raw_input単一行のみを読み取ります。「入力」が常に単一行であるのか、それとも後の行に不適格な入力があるのか​​はわかりませんでした。
ホアロングタム

2

Python-62文字

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42

2
Python 3では短くなる可能性がありますprint("".join(x*chr(x+96)for x in range(27))==input())*42
mbomb007

2

Perl、49 46文字

コマンドラインではなく、プログラムで使用される

$..=chr($+96)x$ for 1..26;$.eq(pop)&&print '42'

join('',map$_ x++$x,'a'..'z')eq pop&&print'42'

よろしく

rbo

編集:Venteroからリッピングされたアイデア


2

PHP 92 88 87文字

function _($a){for($i=97;$i<123;$i++)for($j=$i-96;$j;$j--)$b.=chr($i);echo($b==$a)*42;}

編集

交換し$j<0$jreturn $b==$a?42:0;してecho $b==$a?42:0;

交換しecho $b==$a?42:0;echo($b==$a)*42;


2
それはすべての恐ろしいドル記号のためではなかった場合80文字になる可能性があります。
ジョーイアダムス

単一ループソリューションのエントリも参照してください。
サムホセバー

2

ECLiPSeプロローグ-173

c(_,[],_):-!. c(A,M,N):-length(L,N),checklist('='(A),L),append(F,L,M),P is N-1,B is A-1,c(B,F,P). ?- read_string(end_of_file,351,S),string_list(S,L),c(122,L,26),writeln(42).

2

JavaScript(91 93 94 98 102 116

使用法:a('string')42仕様に従って有効な場合、またはを返します0

function a(z){for(i=r='';i++<26;)for(j=i;j--;)r+=String.fromCharCode(i+96);return(z==r)*42}

http://jsfiddle.net/g25M3/6/

編集:のvar2つのスペースを削除して削除しましたfor (

編集2:変更j>0するj、と

  1. return (z==r)?42:0;
  2. return z==r?42:0

編集3:初期化iしてi=''、変更

  1. (z==r)?42:0
  2. (z==r)*42

編集4:変更

  1. for(;i<27;i++)
  2. while(i++<26)

編集5:変更

  1. i=r='';while(i++<26)
  2. for(i=r='';i++<26;) そして
  3. for(j=i;j;j--)
  4. for(j=i;j--;)

あなたが使用いけない場合さて、あなたは別の12個の文字を減らすことができvar、変数を宣言するために;)
クライド・ロボ

@Clyde:ありがとう!また、間のスペースを削除できることがわかりましたfor (
mellamokb

ええ、同じことを提案しようとしていました;)ああ、私はあなたと同じロジックを使用してPHPでソリューションをコーディングしました
クライドロボ

あなたは置き換えることによって、別の2つの文字を保存することができ return(z==r)?42:0;return z==r?42:0
クライド・ロボ

j>0ただj思うかもしれません。
あなた

2

JavaScript 1.8、99文字

function c(x)(x.replace(/([a-z])\1*/g,function(m)!(a-m.length)*m.charCodeAt(0)-96-a++,a=1)==0)*a+15

私はあなたがそれを理解することを敢えて:)


2

PHP-59

少なくとも1つの入力がcliを介して提供されると仮定します

echo md5($argv[1])!='afe8a06140dbda7f110f833aef540070'?:42;

それは多かれ少なかれ機能しますが、md5は技術的にハッシュアルゴと重複する可能性があります。


2

PowerShell v2 +、47バイト

42*(-join(1..26|%{,[char]($_+96)*$_})-ceq$args)

範囲を構築し、1..26それをループでフィードします|%{...}。各反復では、カンマ演算子を使用して[char]、現在のループ番号を乗算した現在の配列リテラルを作成します。次に-join、すべてをまとめて文字列を作成し、入力に対してabbcccdddd...大文字と小文字を区別する-ceq比較を使用$argsします。これにより、$TRUEまたはのいずれかになり$FALSEます。PowerShellでは、ブール値をそれぞれ暗黙的に1または0にキャストできます42*。これは、で発生します。プリントアウトされます42入力された場合に限っabbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzと意志出力0そう。


バイトを保存できます:) オンラインで試してみてください!
奇抜な

2

K、26バイト

{(::;42)x~,/(1+!26)#'.Q.a}
{(::;42)x~,/(1+!26)#'.Q.a}"hello"
{(::;42)x~,/(1+!26)#'.Q.a}"abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz"
42

ありがとう


{$[x~.Q.a@&1+!26;42;]}以下のための22バイト。
ストリートスター

1
42*(&!27)~-96+"j"$以下のための18バイト(私のポーティングOK答えを)。
ストリートスター

2

VBA 91

VBAの回答はありませんでしたが、これは機能します:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function

これから空白を削除することは本当に不可能ですか?
エソランジングフルーツ

1
要約版、61バイト-o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
テイラー・スコット

@ Challenger5いいえ、不可能ではありません。テイラーのスコットのコメントはまさにそれです。イミディエイトウィンドウで実行され、セルから値A1を入力として受け取ります。
エンジニアトースト

2

APL(Dyalog)18 17バイト

42/⍨⍞≡819⌶⎕A/⍨⍳26

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

大文字の使用が許可されている場合、4つの明らかなバイトを保存できます。

42 42

/⍨ if(点灯。複製)

 文字入力

 と同じです

819⌶ 小文字の

⎕Alphabet

/⍨ によって複製

 ワンスルー

26 26


1

Clojure -61文字

(fn[a](if(=(mapcat #(repeat%(char(+% 96)))(range 1 27))a)42))

次の事実を悪用します。

  • Clojureは、文字列を文字列として自動的に解釈できます
  • 1から26までの数字の範囲を使用して、文字を作成し、正しい数字を繰り返して「正しい」入力を生成します。

Clojureがネストされた#()sを許可した場合、6文字節約されます。Clojure1.4の重要な機能要求
ミケラ

1

Javascript 144

おそらく大幅に改善される可能性がありますが、再帰は常に私にとって頭でした。

圧縮された

function r(a,b,d,c){c++;if(b<d)a+=r(a,b+1,d,c);for(i=0;i<c;i++)a=String.fromCharCode(b)+a;return a}function q(a){if(q==r(a,97,122,0))return 42};

圧縮率が低い

function r(s, c, x, w){        
    w++;
    if(c < x)
        s += r(s, c + 1, x, w);
    for(i = 0; i < w; i++)
        s = String.fromCharCode(c) + s;              
    return s;
}
function q(z){
    if(q==r(z,97, 122, 0))
        return 42;            
}

alert(q("rgrg"));

1

デルファイ、127

var b:Char;c,i:Int8;begin repeat if i<0then i:=c;Read(b);if c+97<>Ord(b)then Exit;i:=i-1;c:=c+Ord(i<0)until i=27;Write(42);end.

これは、入力から文字列を読み取り、それをそのまま比較し、最後まで入力が一致したときに42を書き込みますz

デルファイ、157

var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if b^<>Char(c)then Exit;Dec(i);if i>0then Continue;c:=c+1;i:=c-96;until i=27;Write(42);end.

Delphi、188

program a;{$APPTYPE CONSOLE}var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if(b^<>Char(c))then Exit;Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);Write(42);end.

このバージョンでは、この手法の前のバージョンと比較すると、かなりの数の文字を保存する関数を使用していません。

デルファイ、213

program a;{$APPTYPE CONSOLE}function t(b:pchar;c,i:byte):byte;begin repeat Inc(b);if(b^<>Char(c))then Exit(0);Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);t:=42;end;begin WriteLn(t(CmdLine+77,97,1));end.

少し長いが、これは主にDelphiの長いキーワードと、出力を書き込む前にコンソールアプリケーションを初期化する必要があるためです。

また、ローカルの実行可能パスをスキップするのに必要なオフセットであるため、CmdLineを77文字ずつ増やしていることに注意してください(Delphiには直接引数ポインターがありません)。独自の設定に一致するように調整します(オフセット<10の場合、1文字少なくなります)。


ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplicationでアプリケーションタイプを設定できます。また、program a;行を省略できます。そして周りのブラケットb^<>Char(c)i>0およびi=27削除することができます。
ウーターヴァンニフテリック

@Wouter van Nifterick:提案をありがとう、私は他の提出物にもそれらを適用します。(if i>0thenコンパイルすることさえ知りませんでした!)
PatrickvL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.