あなたが見るものを言う


30

「Look and say」または「Say what you see」シーケンスは、それぞれが最後を説明する一連の数字です。

1
11 (one one)
21 (two ones)
1211 (one two, one one)
111221 (one one, one two, two ones)
312211 (three ones, two twos, one one)

など... https://oeis.org/A005150

とにかく、これは2つの引数、初期数と反復回数を取るプログラムを作成するための通常のコードゴルフチャレンジ(最小バイト数が勝つ)です。たとえば、「1」と「2」を接続すると、結果は「21」になります。「2」と「4」を接続すると、結果は「132112」になります。楽しむ!


2
数字のリストを受け取ったり返したりできますか?
LegionMammal978 16

5
必要に応じて、古い質問をduとして閉じます。これには制限がありません。
lirtosiast

4
これは重複しているとは思わない。以前の見た目と発言の両方の課題は非常に限定的でした(1つはソースコードに数字がなく、もう1つは名前付き変数、名前付き関数、または名前付き引数がありません)。ここでも競争力のある以前の課題への回答を許可する言語はほとんどありません。
センモウヒラムシ

3
数値のリストとして出力できますか?
-lirtosiast

回答:


9

Pyth、10 8バイト

-FryAmTheEggmanによる-2バイト

ussrG8Qz

説明:

            Implicit: z=first line as string, Q=second line
u         the result of reducing lambda G:
  s s rG8   flattened run-length-encoded G
  Q       Q times
  z     starting with z

ここで試してみてください


ただし、少なくとも角かっこやコンマは出力しません。数字の間にスペースのみ:-P
ルイスメンドー

2
ソビエトロシアでは、ussrG8Qz
mbomb007

8

CJam、8バイト

q~{se`}*

入力形式は、最初に初期番号、次に繰り返し、空白で区切られます。

ここでテストしてください。

説明

q~   e# Read and evaluate input, dumping both numbers on the stack.
{    e# Run this block once for each iteration...
  s  e#   Convert to string... in the first iteration this just stringifies the input
     e#   number again. In subsequent iterations it flattens and then stringifies the
     e#   array we get from the run-length encoding.
  e` e#   Run-length encode.
}*

配列は印刷前に平坦化されるため、結果は必要な数になります。


6

JavaScript、57バイト

F=(a,b)=>b?F(a.replace(/(.)\1*/g,c=>c.length+c[0]),b-1):a

この問題に対して再帰はうまく機能します。最初のパラメーターは文字列としての初期数で、2番目は反復回数です。


奇妙な再帰的なカレーで3バイト節約できます。b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aゴルフをしている間、答えはあなたのものとほとんど同じだと気づく前に答えました;)
ETHproductions

4

MATL、9バイト

:"Y'wvX:!

入力は、反復数、初期数です。

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

:      % implicit input: number of iterations. Create vector with that size
"      % for loop
  Y'   %   RLE. Pushes two arrays: elements and numbers of repetitions.
       %   First time implicitly asks for input: initial number
  w    %   swap
  v    %   concatenate vertically
  X:   %   linearize to column array
  !    %   transpose to row array
       % implicitly end loop
       % implicitly display

配列として出力できる場合、Pythには8があります
。– lirtosiast

@ThomasKwa良い点。私はそれが可能だと思いました
ルイスメンドー

4

R、87バイト

function(a,n){for(i in 1:n){r=rle(el(strsplit(a,"")));a=paste0(r$l,r$v,collapse="")};a}

アンゴルフド&説明

f=function(a,n){
    for(i in 1:n){                      # For 1...n
        r=rle(el(strsplit(a,"")))       # Run length encoding
        a=paste0(r$l,r$v,collapse="")   # concatenate length vector and values vector and collapse
    };
    a                                   # print final result
}

3

Perl 6、63バイト

say (@*ARGS[0],*.trans(/(.)$0*/=>{$/.chars~$0})…*)[@*ARGS[1]]

これは私が今のところそれを得ることができるほど短いです、それを減らすことができるいくつかのトリッキーなフラグがあるかもしれません、私はわかりません


3

ルビー、63バイト

質問はそれを求めているようだから、完全なプログラム。入力をコマンドライン引数として受け取ります。

i,n=$*
n.to_i.times{i=i.gsub(/(.)\1*/){"#{$&.size}#$1"}}
puts i

いいえ、gsub!使用できません。文字列$*が固定されているためです:/


-pフラグを使用してバイトを節約できますか?使用する場合はgsub、STDINの行をまるでのように操作します$_.gsub!。その場合、コマンドライン引数は反復であるためn,=$*、他の入力はSTDINから読み取られます。
バリューインク

3

網膜46 45 27バイト

マーティンはこれをゴルフで助けるために多くのことをした。

+`(\d)(\1?)*(?=.*_)_?
$#2$1

オンラインで試す

次の形式で入力を取ります。

<start><count>

<start> は初期番号です。

<count> は単項式で、すべてアンダースコアであり、実行される反復回数です。

単一反復、20 16バイト:

(\d)(\1?)*
$#2$1


2

JavaScript ES6、71バイト

(m,n)=>[...Array(n)].map(_=>m=m.replace(/(.)\1*/g,x=>x.length+x[0]))&&m

入力を文字列と数値として受け取ります。


('1',2)12それがあるべきであるとき、私は与えます21。長さは、置換する文字の前に来る必要があります。
Mwr247

@ Mwr247おっと、すみません。
ETHproductions

2

Perl 5、50バイト

$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say

引数は逆順です(反復回数、その後シード)。例:

> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 4 2
132112
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 0 2
2
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 2 0
1110
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 1 10
1110
> perl -E'$_=pop;for$i(1..pop){s/(.)\1*/length($&).$1/ge}say' 11 1
3113112221232112111312211312113211

サブルーチンとして、の$_代わりにバイトを終了することでバイトを削ることができsayますが、私はそれをテストしていません。現在の解決策はプログラムです。
msh210

2

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

エミグナのコメントにより修正されました。下記/編集をご覧ください。

F.¡vygyÙJ

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


1
2つの引数(初期数と反復回数)の取得に関する部分を見逃したと思います。幸いなことFに、最初に追加して次のように引数を取ることができますiterations,initialNo
Emigna

1
そして、それによって失われたバイトは交換することによって取り戻すことができたDgsgy
エミグナ

@Emigna yはそのコンテキストで何をしますか?
魔法のタコUr

1
最初のyと同じ、現在の値をループにプッシュします。したがって、yを複製して上に入れ替えるのではなく、必要なときにもう一度押すだけです。
エミグナ

@Emignaそれはまだ笑を学ぶために多くを持っているように見えるはずです。
魔法のタコUr


1

Mathematica、81 73バイト

FromDigits@Nest[Flatten[(Tally/@Split@#)~Reverse~3]&,IntegerDigits@#,#2]&

コードに4つのスペースを追加して、コードとして表示されるようにします:)
Ogaday


1

スタックス、10 バイト

Çα▲ì4↔┌j█♀

オンラインで実行してデバッグします!

適切なIOフォーマットでバイトを使いすぎた...

説明

解凍されたバージョンを使用して説明します。

DE|R{rm:f$e
D              Do `2nd parameter` times
 E             Convert number to digits
                   Starting from the `1st parmeter`
  |R           Convert to [element, count] pairs for each run
    {rm        Revert each pair
       :f      Flatten the array
         $     Convert array to string of digits
          e    Convert string of digits to integer

本質的な部分はD|R{rm:f(8バイト)です。

最初の入力を数字の配列として取得できる場合、プログラム全体を9バイトで書き込むことができます。オンラインで実行およびデバッグしてください!


0

Python 3、138バイト

再帰的なアプローチを使用しました。

def g(a,b):
 if b<1:return a
 else:
  c,n=1,'';f,*a=str(a)+'_'
  for i in a:
   if i==f:c+=1
   else:n+=str(c)+f;f,c=i,1
  return g(n,b-1)

この関数は2つのintを受け入れ、aそしてbとして記載します。

ここのエントリーがどれほど簡潔であるかに驚いています!たぶん誰かがより良いPythonの方法を見つけ出すでしょう。


0

Perl、38 + 2バイト

for$i(1..<>){s/(.)\1*/(length$&).$1/ge}

-pフラグが必要です:

$ perl -pe'for$i(1..<>){s/(.)\1*/(length$&).$1/ge}' <<< $'1\n5'
312211

入力は複数行の文字列です。

input number
numbers of iterations

すべての手順が必要な場合は、44 + 2バイトの次のように変更できます。

$ perl -nE'for$i(1..<>){s/(.)\1*/(length$&).$1/ge,print}' <<< $'1\n5'
11
21
1211
111221
312211

0

パイロン、11

i:At,{n,A}j

使い方:

i      # Get input from command line.
:A     # Initialize A
  t    # Set A to the top of the stack.
,      # Pop the top of the stack.
{      # Start a for loop.
 n     # Run length encode the stack.
  ,    # Seperate command and iteration
   A   # Repeat A times.
    }  # End for loop.
j      # Join the stack with '' and print it and then exit. 

0

SmileBASIC、100 98バイト

DEF S N,T?N
WHILE""<N
C=C+1C$=SHIFT(N)IF C$!=(N+@L)[0]THEN O$=O$+STR$(C)+C$C=0
WEND
S O$,T-T/T
END

すべてのステップを印刷します。 T/TTが0のときにプログラムを終了するためにあります。





0

パイソン3.6、100の 98 93バイト

import re
f=lambda s,n:n and eval("f'"+re.sub(r'((.)\2*)',r'{len("\1")}\2',f(s,n-1))+"'")or s

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

これは、文字列と整数を取り、文字列を返すラムダを作成することに注意してください。例:f('1', 5) == '312211'

繰り返されるすべての文字(((.)\2*)regex)を見つけ、その長さと文字自体(f)からf文字列を作成しr'{len("\1")}\2'、それを評価します。カウンター(n and ...f(s,n-1)... or s)で再帰を使用して、適切な関数とループを定義する必要を回避します。

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