Powiedz, co widzisz

30

Sekwencja „Patrz i mów” lub „Powiedz, co widzisz” to ciąg liczb, w których każda opisuje ostatnią.

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)

i tak dalej ... https://oeis.org/A005150

W każdym razie jest to zwykłe wyzwanie golfowe (wygrywa najmniej bajtów), aby stworzyć program, który przyjmuje dwa argumenty, liczbę początkową i liczbę iteracji. Na przykład, jeśli podłączysz „1” i „2”, wynikiem będzie „21”. Jeśli podłączysz „2” i „4”, wynikiem będzie „132112”. Baw się dobrze!

Hej, Lama
źródło
2
Czy możemy otrzymać / zwrócić listę cyfr?
LegionMammal978
5
W razie potrzeby zamykałbym starsze pytania jako duplikaty; to nie ma ograniczeń.
lirtosiast
4
Nie uważam tego za duplikat. Zarówno poprzednie spojrzenie, jak i powiedzenie wyzwań były bardzo restrykcyjne (jedna bez liczb w kodzie źródłowym, druga bez nazwanych zmiennych, nazwanych funkcji lub nazwanych argumentów). Bardzo niewiele języków pozwoli na odpowiedzi na poprzednie wyzwania, które również są konkurencyjne.
trichoplax
3
Czy wolno nam wyprowadzać dane jako listę liczb?
lirtosiast

Odpowiedzi:

9

Pyth, 10 8 bajtów

-2 bajty autorstwa @FryAmTheEggman

ussrG8Qz

Wyjaśnienie:

            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

Wypróbuj tutaj .

lirtosiast
źródło
Ale przynajmniej nie wypisuję nawiasów i przecinków; tylko spacje między liczbami :-P
Luis Mendo
2
W Rosji SowieckiejussrG8Qz
mbomb007
8

CJam, 8 bajtów

q~{se`}*

Format wejściowy to pierwsza liczba początkowa, a druga iteracje oddzielone spacją.

Sprawdź to tutaj.

Wyjaśnienie

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

Tablica jest również spłaszczana przed wydrukowaniem, więc wynik jest tylko wymaganą liczbą.

Martin Ender
źródło
6

JavaScript, 57 bajtów

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

Rekursja działa dobrze w przypadku tego problemu. Pierwszy parametr to liczba początkowa jako ciąg, a drugi to liczba iteracji.

Mwr247
źródło
Możesz zaoszczędzić trzy bajty za pomocą dziwnego rekurencyjnego curry: b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aOdkryłem, że podczas gry w golfa moja odpowiedź, zanim zdałem sobie sprawę, że jest prawie identyczna z twoją;)
ETHprodukcje
4

MATL , 9 bajtów

:"Y'wvX:!

Dane wejściowe to: liczba iteracji, liczba początkowa.

Wypróbuj online!

:      % 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
Luis Mendo
źródło
Jeśli możesz wyprowadzać dane jako tablicę, to Pyth ma 8.
lirtosiast
@ThomasKwa Dobra uwaga. Zakładałem, że to możliwe
Luis Mendo
4

R, 87 bajtów

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

Niegolfowane i wyjaśnione

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
}
Billywob
źródło
3

Perl 6, 63 bajtów

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

To jest tak krótkie, jak tylko mogłem to zdobyć, mogą istnieć pewne podstępne flagi, które mogłyby to zmniejszyć, nie jestem pewien

Skróty klawiszowe
źródło
3

Ruby, 63 bajty

Pełny program, ponieważ wydaje się, że pytanie o to pyta. Pobiera dane wejściowe jako argumenty wiersza poleceń.

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

Nie, gsub!nie można użyć, ponieważ ciągi w $*są zamrożone: /

daniero
źródło
Czy mógłbyś użyć -pflagi do zapisania bajtów? Jeśli go użyjesz, gsubdziała tak jak na STDIN $_.gsub!. Następnie argument wiersza poleceń to iteracje n,=$*, a inne dane wejściowe są odczytywane ze STDIN.
Wartość tuszu
3

Siatkówka , 46 45 27 bajtów

Martin zrobił wiele, aby pomóc w golfa.

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

Wypróbuj online

Pobiera dane wejściowe w formacie:

<start><count>

<start> jest liczbą początkową.

<count> jest jednoargumentowy, wszystkie podkreślenia i określa liczbę wykonanych iteracji.

Pojedyncza iteracja, 20 16 bajtów:

(\d)(\1?)*
$#2$1
mbomb007
źródło
2

JavaScript ES6, 71 bajtów

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

Pobiera dane wejściowe jako ciąg i liczbę.

ETHprodukcje
źródło
('1',2)daje mi 12, kiedy powinno być 21. Twoja długość powinna pojawić się przed postacią w zastępstwie.
Mwr247
@ Mwr247 Ups, przepraszam.
ETHprodukcje
2

Perl 5, 50 bajtów

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

Argumenty są w odwrotnej kolejności (liczba iteracji następnie seed). Przykład:

> 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
msh210
źródło
Jako podprogram mogę ogolić bajt, kończąc go $_zamiast say, jak sądzę, ale go nie przetestowałem. Obecne rozwiązanie to program.
msh210
2

05AB1E , 9 bajtów ( niekonkurencyjny )

Poprawione z powodu komentarzy Emigny, patrz poniżej / edycja.

F.¡vygyÙJ

Wypróbuj online!

Urna Magicznej Ośmiornicy
źródło
1
Myślę, że przegapiłeś część dotyczącą przyjęcia 2 argumentów (początkowa liczba i liczba iteracji). Na szczęście możesz po prostu dodać Fna początku i przyjąć argumenty jakoiterations,initialNo
Emigna
1
A utracony bajt można odzyskać, zastępując Dgsgo gy.
Emigna
@Emigna co yrobi w tym kontekście?
Magiczna Urna Ośmiornicy
1
Tak jak w pierwszym y, wciśnij bieżącą wartość w pętli. Więc zamiast powielać y i zamienić go na górę, po prostu popychasz go ponownie, gdy go potrzebujesz.
Emigna
@Emigna powinno się wydawać, że wciąż mam wiele do nauczenia się haha.
Magic Octopus Urn
2

R , 61 57 bajtów

-4 dzięki @JayCe, kiedy byłem pewien, że nie da się tego zrobić łatwiej!

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

Wypróbuj online!

J.Doe
źródło
1
Lekko golfa: TIO
JayCe
To t(sapply(z,c))połączenie jest sprytne.
J.Doe
1

Mathematica, 81 73 bajtów

FromDigits@Nest[Flatten[(Tally/@Split@#)~Reverse~3]&,IntegerDigits@#,#2]&
Simmons
źródło
Przygotuj kod z czterema spacjami, aby pojawił się jako kod :)
Ogaday
1

Galaretka , 6 bajtów (niekonkurencyjna)

ŒrUFµ¡

Wypróbuj online!

           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
Lynn
źródło
1

Stax , 10 bajtów

Çα▲ì4↔┌j█♀

Uruchom i debuguj online!

Wydano zbyt wiele bajtów na odpowiedni format IO ...

Wyjaśnienie

Używa rozpakowanej wersji do wyjaśnienia.

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

Zasadniczą częścią jest D|R{rm:f(8 bajtów).

Jeśli pierwsze wejście można traktować jako tablicę cyfr, cały program można zapisać w 9 bajtach: Uruchom i debuguj online!

Weijun Zhou
źródło
0

Python 3, 138 bajtów

Zastosowałem podejście rekurencyjne.

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)

Funkcja akceptuje dwie liczby całkowite ai bzgodnie z opisem.

Jestem zdumiony, jak zwięzłe są tutaj wpisy! Może ktoś przyjdzie też z lepszą metodą Pythona.

Ogaday
źródło
0

Perl, 38 + 2 bajty

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

Wymaga -pflagi:

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

Dane wejściowe to ciąg wielu linii:

input number
numbers of iterations

Jeśli wszystkie kroki są również wymagane, możemy zmienić to na następujące, czyli 44 + 2 bajty:

$ perl -nE'for$i(1..<>){s/(.)\1*/(length$&).$1/ge,print}' <<< $'1\n5'
11
21
1211
111221
312211
andlrc
źródło
0

Pylony , 11

i:At,{n,A}j

Jak to działa:

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. 
Morgan Thrapp
źródło
0

SmileBASIC, 100 98 bajtów

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

Drukuje wszystkie kroki. T/Tjest tam, aby zakończyć program, gdy T wynosi 0.

12Me21
źródło
0

Python 3.6, 100 98 93 bajtów

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

Wypróbuj online!

Zauważ, że tworzy to lambda, która pobiera ciąg i liczbę całkowitą i zwraca ciąg. Przykład:f('1', 5) == '312211'

Znajduje wszystkie powtarzające się znaki ( ((.)\2*)regex), tworzy ciąg f na podstawie ich długości i samego znaku ( r'{len("\1")}\2'), a następnie ocenia go. Używa rekurencji na counter ( n and ...f(s,n-1)... or s), aby uniknąć konieczności definiowania właściwej funkcji i pętli.

BoppreH
źródło