Скажи, что ты видишь


30

Последовательность «Смотри и говори» или «Скажи, что ты видишь» - это последовательность чисел, каждая из которых описывает последнюю.

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

Во всяком случае, это обычная задача игры в гольф (выигрывает наименьшее количество байт), чтобы создать программу, которая принимает два аргумента, начальное число и количество итераций. Например, если вы подключили «1» и «2», результатом будет «21». Если вы подключили «2» и «4», результатом будет «132112». Повеселись!


2
Можем ли мы получить / вернуть список цифр?
LegionMammal978

5
Я бы закрыл старые вопросы как дураки, если это необходимо; это не имеет ограничений.
lirtosiast

4
Я не вижу это как дубликат. Как предыдущий взгляд, так и задачи были очень ограничительными (один без чисел в исходном коде, другой без именованных переменных, именованных функций или именованных аргументов). Очень немногие языки позволят ответить на предыдущие вызовы, которые здесь также конкурентоспособны.
Трихоплакс

3
Разрешено ли выводить в виде списка чисел?
lirtosiast

Ответы:


9

Pyth, 10 8 байт

-2 байта @FryAmTheEggman

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

Рекурсия хорошо работает для этой проблемы. Первый параметр - это начальное число в виде строки, а второй - количество итераций.


Вы можете сэкономить три байта с помощью странного рекурсивного карри: b=>F=a=>b--?F(a.replace(/(.)\1*/g,c=>c.length+c[0])):aобнаружил, что во время игры в гольф мой ответ, прежде чем я понял, что он в значительной степени идентичен
вашему

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

@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.
Value Ink

3

Retina , 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
И потерянный байт можно восстановить, заменив Dgsна gy.
Emigna

@ Emigna, что yделать в этом контексте?
Волшебная урна осьминога

1
То же, что и первый y, нажмите текущее значение в цикле. Таким образом, вместо того, чтобы дублировать y и поменять его на верх, вы просто нажимаете его снова, когда вам это нужно.
Emigna

@ Emigna, похоже, мне еще многое предстоит узнать, ха-ха.
Волшебная Урна Осьминога

2

R , 61 57 байт

-4 спасибо @JayCe, как раз тогда, когда я был уверен, что это сделать нельзя проще!

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

Попробуйте онлайн!


1
Слегка golfed: TiO
Jayce

Этот t(sapply(z,c))призыв умный.
J.Doe

1

Mathematica, 81 73 байта

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

Добавьте в код четыре пробела, чтобы он отображался в виде кода :)
Огадай,


1

Stax , 10 байт

Çα▲ì4↔┌j█♀

Запускать и отлаживать онлайн!

Потратил слишком много байтов на правильный формат ввода-вывода ...

объяснение

Использует распакованную версию для объяснения.

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)

Функция принимает два целых, 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/Tтам, чтобы закончить программу, когда Т 0.





0

Python 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*)регулярное выражение), делает f-строку из их длины и самого символа ( r'{len("\1")}\2'), затем оценивает его. Использует рекурсию на counter ( n and ...f(s,n-1)... or s), чтобы избежать необходимости определять правильную функцию и цикл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.