ポイントフリーのルックアンドセイシーケンス


11

あなたは、入力として整数を取り、その番号が最初に何を見て、言うシーケンスであったかを出力するプログラムを作ります

例えば:

$ ./LAS
8
[1,11,21,1211,111221,312211,13112221,1113213211]

ユーザーがシーケンスの異なる番号を明確に見ることができる限り、リストを出力する正確な方法は重要ではありません。しかし、ここにキャッチがあります。ユーザー定義変数を使用することはできません。

例えば:

  1. スコープ変数を含む変数はありません。
  2. 関数がある場合、名前を持つことはできません。(例外として、あなたの言語がメインの機能または同様の機能を必要とする場合、その機能を使用できます。)
  3. 関数がある場合、名前付き引数を持つことはできません。

また、look and sayシーケンスに関連する特定の機能を備えたライブラリを使用することはできません。また、ネットワークにアクセスしたり、プログラムにファイルを提供したりすることはできません(ただし、独自に生成および使用できます)。これはコードゴルフです。文字の最短コードが勝ちます!


1
「エクストリームポイントフリーネス」とは何ですか?
ジャスティン14年

1
:@Quincunx私はそれを見ていたstackoverflow.com/questions/944446/...
デジタルトラウマ

このルールを説明できますWhen you have functions, they can not have named arguments.か?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年


3
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳いくつかの言語(J言語や、forthやpostscriptのようなスタック/ベース言語)では、関数には引数がありません。それらは外部コンテキスト(スタックまたは外部スコープからの引数)に適用されます。
トーマスバルチェル14年

回答:


6

GolfScript(31文字)

~[]\{[1\{.2$={;\)}1if\}*].n@}*;

以前の一言一言の質問に対する私の答えから改作されました。これには、5文字を節約できる機能言語の面倒な制限がありますが、前の質問へのほとんどの回答は適応できないため(非機能言語の面倒な面倒な制限です)、意味がないと思いますduとしてそれを閉じます。


11

Haskell 206 Chars

import Data.List
import Control.Applicative
import Data.Function
main= readLn >>= print .(flip take (map read $ fix (("1":). map (concat .(map ((++)<$>(show . length)<*>((:[]). head))). group))::[Integer]))

group関数を使用して、それらを等しいもののグループにグループ化することにより機能します。次に、関数付きのapplicativesを使用して、同時に長さを読み取り、要素の1つに追加する関数を構築します。修正とマップを使用して、再帰的な定義を作成します(ポイントフリー)。


10

J(42文字)

Jでは、ポイントフリー(暗黙的とも呼ばれる)プログラミングが自然です。

,@:((#,{.);.1~(1,}.~:}:))&.>^:(<`((<1)"_))

それは関数です。それを使用するには、コード、スペース、および入力番号を記述します。例えば、

   ,@:((#,{.);.1~(1,}.~:}:))&.>^:(<`((<1)"_)) 8
┌─┬───┬───┬───────┬───────────┬───────────┬───────────────┬───────────────────┐
│1│1 1│2 1│1 2 1 1│1 1 1 2 2 1│3 1 2 2 1 1│1 3 1 1 2 2 2 1│1 1 1 3 2 1 3 2 1 1│
└─┴───┴───┴───────┴───────────┴───────────┴───────────────┴───────────────────┘

出力のきれいなボックスに注目してください。

補遺:最初はあまりにも恥ずかしがり屋でしたが、他の人が最初にそれらを使用するのを見たので、ここにいくつかの「攻略」があります...

  • 異なる「呼び出し規則」を使用した36文字のバージョンを次に示します。8を必要な用語の数に置き換えます。

    ,@:((#,{.);.1~(1,}.~:}:))&.>^:(<8)<1
    
  • また、出力に余分なゼロが含まれていても問題ない場合は、32文字バージョンがあります。

    ,@:((#,{.);.1~(1,}.~:}:))^:(<8)1
    

7

GolfScript、36文字

~([1]\{.[0\{.2$=!{0\.}*;\)\}/](;}*]`

GolfScriptでは変数が使用されることはめったにありませんが、このタスクには変数は必要ありません。入力は標準入力、出力は標準出力です。たとえば、入力8は出力を提供します:

[[1] [1 1] [2 1] [1 2 1 1] [1 1 1 2 2 1] [3 1 2 2 1 1] [1 3 1 1 2 2 2 1] [1 1 1 3 2 1 3 2 1 1]]

後でこのコードの詳細な説明を書くかもしれませんが、少なくとも、変数割り当て演算子が:どこにも含まれていないという事実によって、変数を使用していないことは簡単にわかります。


6

Haskell、118文字(インポートなしで80文字)

import Data.List
import Control.Monad
main=readLn>>=print.flip take(iterate(ap((++).show.length)(take 1)<=<group)"1")

6

Bashおよびcoreutils、111 73文字

eval echo 1\|`yes 'tee -a o|fold -1|uniq -c|(tr -dc 0-9;echo)|'|sed $1q`:

uniq -cシーケンス内の次の番号を生成するために重いリフティングを行っています。 yessedおよびeval処理パイプラインの繰り返しの必要な数を作成します。残りは単なる書式設定です。

出力はo。:というファイルに保存されます。

$ ./looksay.sh 8
ubuntu @ ubuntu:〜$ cat o
1
11
21
1211
111221
312211
13112221
1113213211
$ 

4

Mathematica、65文字

FromDigits/@NestList[Flatten@Reverse[Tally/@Split@#,3]&,{1},#-1]&

例:

FromDigits/@NestList[Flatten@Reverse[Tally/@Split@#,3]&,{1},#-1]&[8]

{1、11、21、1211、111221、312211、13112221、1113213211}


3

J、37文字

1([:,((1,2&(~:/\))(#,{.);.1]))@[&0~i.

エンドウパターン質問私の答えに基づいて。ここで短縮する可能性があります。使用法は、他のJの回答と同じです。

   1([:,((1,2&(~:/\))(#,{.);.1]))@[&0~i. 7
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
2 1 0 0 0 0 0 0
1 2 1 1 0 0 0 0
1 1 1 2 2 1 0 0
3 1 2 2 1 1 0 0
1 3 1 1 2 2 2 1

また、エンドウパターンの答えが持っていた余分なゼロの問題もあります。


ああ、以前の質問が複数あり、その質問からの回答は、私が見つけた質問からの調整よりも、まったく調整することなくこの質問にコピーできます。私はだまされて閉会することを投票することをほぼ確信しています。
ピーターテイラー14年

@PeterTaylor Peaパターンの1つは、次の行を作成する前に前の行の数値をソートする必要があるという点でわずかに異なります。
ガレス14年

2

Perl 6の:63の 53文字

say (1,*.subst(/(\d)$0*/,{.chars~.[0]},:g)...*)[^get]

Look and Sayシーケンスの怠zyなリスト(1,*.subst(/(\d)$0*/,{.chars~.[0]},:g)...*)を作成し、ユーザーが指定した数の要素([^get]、配列の添え字と平均[0..(get-1)])、およびsayそれらすべてを取得します。

遅延リストは、最初に1を取得し、連続する各番号を生成するために機能し、最後に見つかった番号を取得し/(\d)$0*/、と一致する同じ数字のすべてのシーケンスを置き換え、{how many} + {what digit}に置き換えます、または.chars~.[0]

このコードの唯一の変数$0は、一致の最初のキャプチャ、およびsを呼び出す暗黙のトピック$_変数.methodであり、どちらもユーザー定義ではありません。


1

GolfScript、57 43文字

私自身のアプローチ。残念ながら既存のものよりも長くなってしまいました=(。

~[1 9]{.);p[{...1<^0=?.@(\@(>.,(}do 0=]}@*;

次の標準入力のサンプル出力8

[1]
[1 1]
[2 1]
[1 2 1 1]
[1 1 1 2 2 1]
[3 1 2 2 1 1]
[1 3 1 1 2 2 2 1]
[1 1 1 3 2 1 3 2 1 1]

9センチネルなしの代替バージョン、まだ47文字です。もっと可能性があると思う:

~[1]{.p[{...1<^.{0=?.@(\@(>1}{;,\0=0}if}do]}@*;

1

Scala 178

(0 to Console.in.readLine.toInt).map(i=>Function.chain(List.fill[String=>String](i)(y=>(('0',0,"")/:(y+" ")){case((a,b,c),d)=>if(d==a)(a,b+1,c)else(d,1,c+b+a)}._3.drop(2)))("1"))

1
iin i=>は変数であると確信しています。
ピーターテイラー

1

Dyalog APL、35文字

(⊢,⊂∘∊∘((≢,⊃)¨⊃⊂⍨2≢/0,⊃)∘⌽)⍣(⎕-1)⊢1

入力を評価します。tryapl.orgではユーザー入力が許可されていないため、リンクでは8に置き換えました。

名前付き変数(a←1)、名前付き関数(f←{})、引数()はありません。

機能の構成のみ:

  • モナド演算子—それぞれ:、reduce f/:、通勤:f⍨
  • 二項演算子— power:f⍣n、compose:f∘g
  • フォーク— (f g h)B ←→ (f B)g(h B);A(f g h)B ←→ (A f B)g(A h B)
  • 頂上— (f g)B ←→ f(g B);A(f g)B ←→ f(A g B)
  • 4トレイン(フォークアトプス)—(f g h k) ←→ (f (g h k))

使用されるプリミティブ関数:

  • 正しい:A⊢B ←→ B
  • 逆:⌽B
  • 最初:⊃B
  • 連結:A,B
  • 一致しない:A≢B、カウント:≢B
  • 囲む:⊂B、パーティション:A⊂B
  • 平坦化:∊B

tryapl.orgで、⊢1この大規模な合成物の引数である末尾のを削除すると、どのように解析されたかの図を見ることができます。

     ⍣               
   ┌─┴─┐             
 ┌─┼─┐ 7             
 ⊢ , ∘               
    ┌┴┐              
    ∘ ⌽              
 ┌──┴───┐            
 ∘    ┌─┴─┐          
┌┴┐   ¨ ┌─┼───┐      
⊂ ∊ ┌─┘ ⊃ ⍨ ┌─┼───┐  
  ┌─┼─┐ ┌─┘ 2 / ┌─┼─┐
  ≢ , ⊃ ⊂   ┌─┘ 0 , ⊃
            ≢

0

J 66(I / O付き)

".@(_5}&',@((#,&:":{.);.1~1&(0})&(~:_1|.]))^:(<X)":1')@{.&.stdin''

IOなし、スコア43:

NB. change the 8 for the number of numbers you'd want
,@((#,&:":{.);.1~1&(0})&(~:_1|.]))^:(<8)'1'

面白い質問、最初の9はいつ表示されますか?


整数シーケンスページを見ないでください。
PyRulez

なるほど、分かりました。その後...なぜそうですか?
jpjacobs 14年


IOバージョンでは、Xを文字列の入力に置き換えてからevalを呼び出すという素晴らしいトリックです!
オマー

おもしろい質問については、1、2、3しか持っていないのは明らかではないでしょうか?私は4以上を取得することを意味し、前のステップでは4つの連続した等しい数字xaaaayが必要になりますが、「x a's、a's」または「a's、a a's」。
オマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.