Diga o que vê


30

A sequência "Veja e diga" ou "Diga o que vê" é uma série de números em que cada um descreve o último.

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)

e assim por diante ... https://oeis.org/A005150

De qualquer forma, esse é um desafio regular de golfe com códigos (vitórias na contagem de bytes) para criar um programa que use dois argumentos, um número inicial e a quantidade de iterações. Por exemplo, se você inseriu "1" e "2", o resultado seria "21". Se você conectou "2" e "4", o resultado seria "132112". Diverta-se!


2
Podemos receber / retornar uma lista de dígitos?
LegionMammal978

5
Eu fecharia as perguntas mais antigas como burras, se necessário; isso não tem restrições.
Lirtosiast

4
Não vejo isso como duplicado. Os desafios da aparência e do dizer anteriores eram muito restritivos (um sem números no código-fonte, o outro sem variáveis ​​nomeadas, funções nomeadas ou argumentos nomeados). Muito poucos idiomas permitirão respostas para os desafios anteriores que também são competitivos aqui.
Trichoplax

3
Podemos produzir como uma lista de números?
lirtosiast

Respostas:


9

Pitão, 10 8 bytes

-2 bytes por @FryAmTheEggman

ussrG8Qz

Explicação:

            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

Experimente aqui .


Mas pelo menos não saio colchetes e vírgulas; apenas espaços entre os números :-P
Luis Mendo

2
Na União Soviética,ussrG8Qz
mbomb007

8

CJam, 8 bytes

q~{se`}*

O formato de entrada é o número inicial primeiro, as iterações em segundo, separadas por algum espaço em branco.

Teste aqui.

Explicação

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

A matriz também é achatada antes de ser impressa, para que o resultado seja apenas o número necessário.


6

JavaScript, 57 bytes

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

A recursão funciona bem para esse problema. O primeiro parâmetro é o número inicial como uma sequência e o segundo é o número de iterações.


Você pode salvar três bytes com um caril recursiva estranho: b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):adescobriram que, enquanto golfe minha resposta antes de eu percebi que era praticamente idêntico ao seu;)
ETHproductions

4

MATL , 9 bytes

:"Y'wvX:!

As entradas são: número de iterações, número inicial.

Experimente 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

Se você pode saída como uma matriz, em seguida, Pyth tem 8.
lirtosiast

@ThomasKwa Good point. Presumi que era possível
Luis Mendo

4

R, 87 bytes

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

Ungolfed & Explained

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 bytes

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

Isso é o mais curto que eu consegui por enquanto, pode haver algumas sinalizações complicadas que poderiam reduzi-lo, não tenho certeza


3

Ruby, 63 bytes

Um programa completo, já que a pergunta parece pedir isso. Recebe entrada como argumentos de linha de comando.

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

Não, gsub!não pode ser usado, pois as seqüências de caracteres $*estão congeladas: /


Você poderia usar o -psinalizador para salvar bytes? Se você usá-lo, gsubopera em uma linha de STDIN como se fosse $_.gsub!. Em seguida, o argumento da linha de comandos são as iterações n,=$*, e a outra entrada é lida em STDIN.
Value Ink

3

Retina , 46 45 27 bytes

Martin fez muito para ajudar no golfe.

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

Experimente online

Recebe entrada no formato:

<start><count>

<start> é o número inicial.

<count> está em unário, todos os sublinhados e é quantas iterações são executadas.

Iteração única, 20 16 bytes:

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


2

JavaScript ES6, 71 bytes

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

Recebe a entrada como uma sequência e um número.


('1',2)me dá 12, quando deveria ser 21. Seu comprimento deve vir antes do personagem na substituição.
precisa saber é o seguinte

@ Mwr247 Opa, desculpe.
ETHproductions

2

Perl 5, 50 bytes

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

Os argumentos estão na ordem inversa (número de iterações e depois sementes). Exemplo:

> 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

As a subroutine, I can shave a byte by ending it with $_ instead of say, I suppose, but I haven't tested it. The current solution is a program.
msh210

2

05AB1E, 9 bytes (Non-competing)

Corrected due to Emigna's comments, see below/edits.

F.¡vygyÙJ

Try it online!


1
I think you missed the part about taking 2 arguments (initial number and number of iterations). Luckily you can just add F at the beginning and take the arguments as iterations,initialNo
Emigna

1
And the byte lost by that could be regained by replacing Dgs with gy.
Emigna

@Emigna what's y do in that context?
Magic Octopus Urn

1
Same as the first y, push the current value in the loop. So instead of duplicating y and swapping it to the top, you just push it again when you need it.
Emigna

@Emigna it should seem I still have a lot to learn haha.
Magic Octopus Urn

2

R, 61 57 bytes

-4 thanks to @JayCe, just when I was sure it couldn't be done any simpler!

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

Try it online!


1
Slightly golfed: TIO
JayCe

That t(sapply(z,c)) call is clever.
J.Doe

1

Mathematica, 81 73 bytes

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

Prepend your code with four spaces to get it show up as code :)
Ogaday

1

Jelly, 6 bytes (non-competing)

ŒrUFµ¡

Try it 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

1

Stax, 10 bytes

Çα▲ì4↔┌j█♀

Run and debug online!

Spent too many bytes on proper IO format ...

Explanation

Uses the unpacked version to explain.

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

The essential part is D|R{rm:f(8 bytes).

If the first input can be taken as an array of digits, the whole program can be written in 9 bytes: Run and debug online!


0

Python 3, 138 bytes

I used a recursive approach.

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)

The function accepts two ints, a and b as described.

I'm amazed at how terse the entries here are! Maybe someone will come along with a better Python method too.


0

Perl, 38 + 2 bytes

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

Requires the -p flag:

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

Input is a multi line string:

input number
numbers of iterations

If all the steps are required as well then we can change it to the following, which is 44 + 2 bytes:

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

0

Pylons, 11

i:At,{n,A}j

How it works:

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 bytes

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

Prints out all the steps. T/T is there to end the program when T is 0.





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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.