Ne Görüyorsun?


30

"Bak ve söyle" veya "Gördüğünüzü söyleyin" dizisi, her birinin sonuncuyu tanımladığı bir dizi sayıdır.

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)

ve devam ediyor ... https://oeis.org/A005150

Her neyse, bu normal bir kod golf mücadelesidir (en az bayt sayısı kazanır), iki argüman alan bir program yapmak için bir başlangıç ​​numarası ve yineleme sayısıdır. Örneğin, "1" ve "2" taktıysanız sonuç "21" olur. "2" ve "4" e taktıysanız, sonuç "132112" olur. İyi eğlenceler!


2
Bir basamak listesi alabilir miyiz?
LegionMammal978

5
Gerekirse eski soruları sifir olarak kapatırdım; bunun kısıtlamaları yoktur.
lirtosiast

4
Bunu kopya olarak görmüyorum. Hem önceki bakış hem de söz konusu zorluklar çok kısıtlayıcıydı (biri kaynak kodunda numarasız, diğeri isimlendirilmiş değişken içermeyen, adlandırılmış işlevler veya adlandırılmış argümanlar). Çok az dil, burada da rekabetçi olan önceki zorlukların cevaplarını verecektir.
trichoplax

3
Sayıların bir listesi olarak çıkmamıza izin var mı?
lirtosiast, 03

Yanıtlar:


9

Pyth, 10 8 bayt

@FryAmTheEggman tarafından -2 bayt

ussrG8Qz

Açıklama:

            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

Burada dene .


Ama en azından parantez ve virgül çıkarmıyorum; sadece sayılar arasındaki boşluklar:
Luis Mendo

2
Sovyet Rusya'da,ussrG8Qz
mbomb007

8

CJam, 8 bayt

q~{se`}*

Giriş formatı ilk sayıdır, ikinciler tekrarlanır ve bir miktar boşlukla ayrılır.

Burada test et.

açıklama

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.
}*

Dizi ayrıca basılmadan önce düzleştirilir, böylece sonuç sadece gerekli sayıdır.


6

JavaScript, 57 bayt

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

Özyineleme bu sorun için iyi çalışır. İlk parametre bir dizge olarak ilk sayıdır ve ikincisi yineleme sayısıdır.


Tuhaf bir özyinelemeli köri ile üç bayt kaydedebilirsiniz: b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aBulunduğum cevabı golf yaparken fark etmeden önce sizinkiyle tamamen aynıydı;)
ETHproductions

4

MATL , 9 bayt

:"Y'wvX:!

Girişler: yineleme sayısı, ilk sayı.

Çevrimiçi deneyin!

:      % 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

Dizi olarak çıktı verebilirseniz Pyth 8'e sahiptir.
lirtosiast

@ThomasKwa İyi nokta. Bunun mümkün olduğunu varsaydım
Luis Mendo

4

R, 87 bayt

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

Ungolfed ve açıkladı

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 bayt

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

Bu, şu an elde edebileceğim kadar kısa, onu azaltabilecek bazı zorlu bayraklar olabilir, emin değilim.


3

Ruby, 63 bayt

Tam bir program, çünkü soru sormak gibi görünüyor. Girdiyi komut satırı argümanları olarak alır.

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

Hayır, gsub!kullanılamaz, çünkü dizeler $*donmuş: /


-pBayrağı kurtarmak için bayrağı kullanabilir misiniz ? Eğer kullanıyorsanız, gsubo sanki STDIN bir çizgi üzerinde çalışır $_.gsub!. Ardından komut satırı argümanı yinelemelerdir, yani n,=$*diğer girdi STDIN'den okunur.
Value Ink

3

Retina , 46 45 27 bayt

Martin bunun golfüne yardım etmek için çok şey yaptı.

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

Çevrimiçi deneyin

Biçiminde giriş alır:

<start><count>

<start> ilk sayıdır.

<count> tekdüze, tüm alt çizgilerde ve kaç yinelemenin yapıldığı.

Tek yineleme, 20 16 bayt:

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


2

JavaScript ES6, 71 bayt

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

Girdiyi dize ve sayı olarak alır.


('1',2)12olması gerektiği zaman verir 21. Boyunuz, değiştirilen karakterden önce gelmelidir.
Mwr247,

@ Mwr247 Üzgünüz, üzgünüm.
ETHproductions

2

Perl 5, 50 bayt

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

Argümanlar ters sırada (tohumdan sonra yineleme sayısı). Örnek:

> 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

Bir alt yordam olarak, sanırım $_yerine bitirerek bir baytı tıraş edebilirim say, ancak test etmedim. Mevcut çözüm bir programdır.
msh210

2

05AB1E , 9 bayt ( Yarışmıyor )

Emigna'nın yorumları nedeniyle düzeltildi, aşağıya / düzenlemelere bakınız.

F.¡vygyÙJ

Çevrimiçi deneyin!


1
2 argüman alma kısmını kaçırdığınızı düşünüyorum (ilk sayı ve yineleme sayısı). Neyse ki, sadece Fbaşlangıçta ekleyebilir ve argümanlar gibi alabiliriterations,initialNo
Emigna

1
Ve bu kaybettiği bayt değiştirerek tekrar elde edilebilir Dgsile gy.
Emigna

@Emigna ybu bağlamda ne yapar?
Magic Octopus Urn

1
İlk y ile aynı, akımdaki değeri loop'a itin. Yani y'yi kopyalamak ve en üste değiştirmek yerine, ihtiyaç duyduğunuzda tekrar bastırıyorsunuz.
Emigna

@Emigna haha ​​öğrenmek için hala çok şeyim var gibi görünmeli.
Magic Octopus Urn

2

R , 61 57 bayt

-4 @JayCe sayesinde, daha basit olamayacağından emin olduğumda!

f=function(a,n)`if`(n,f(t(sapply(rle(c(a)),c)),n-1),c(a))

Çevrimiçi deneyin!


1
Biraz golf oynadı: TIO
JayCe

Bu t(sapply(z,c))çağrı akıllı.
J.Doe

1

Mathematica, 81 73 bayt

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

Kodunuzu dört boşlukla kodlayın, kod olarak görünmesini sağlayın :)
Ogaday

1

Jöle , 6 bayt (yarışmaz)

ŒrUFµ¡

Çevrimiçi deneyin!

           Implicit input: first argument.
     µ¡    Do this to it <second argument> times:
Œr            Run-length encode into [value, times] pairs
  U           Flip them
   F          Flatten list

1

Stax , 10 bayt

Çα▲ì4↔┌j█♀

Çevrimiçi çalıştırın ve hata ayıklayın!

Doğru GÇ formatında çok fazla bayt harcadım ...

açıklama

Açıklamak için paketlenmemiş sürümü kullanır.

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

Önemli kısmı D|R{rm:f (8 bayt).

İlk giriş bir basamak dizisi olarak alınabilirse, tüm program 9 byte yazılabilir: Çevrimiçi çalıştır ve hata ayıkla!


0

Python 3, 138 bayt

Özyinelemeli bir yaklaşım kullandım.

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)

Fonksiyon iki girişi kabul eder ave btarif edildiği gibi.

Buradaki girişlerin ne kadar ters olduğuna şaşırıyorum! Belki birileri de daha iyi bir Python yöntemi ile gelecektir.


0

Perl, 38 + 2 bayt

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

-pBayrağı gerektirir :

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

Giriş çok satırlı bir dizedir:

input number
numbers of iterations

Tüm adımlar da gerekliyse, 44 + 2 bayt olan aşağıdakileri değiştirebiliriz:

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

0

Direkler , 11

i:At,{n,A}j

Nasıl çalışır:

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 bayt

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üm adımları yazdırır. T/TT 0 olduğunda programı sonlandırmak için orada.





0

Python 3.6, 100 98 93 bytes

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

Try it online!

Note this creates a lambda that takes a string and an integer, and returns a string. Example: f('1', 5) == '312211'

Finds all repeated characters (((.)\2*) regex), makes a f-string out of their length and the character itself (r'{len("\1")}\2'), then evaluates it. Uses recursion on the counter (n and ...f(s,n-1)... or s) to avoid having to define a proper function and a loop.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.