Скажи, що бачиш


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Виявив, що під час гольфу моя відповідь ще до того, як я зрозумів, що вона майже однакова вашій;)
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}

Ungolfed & пояснив

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
І байт, втрачений цим, можна відновити заміною Dgsна gy.
Емінья

@Emigna, що yробити в цьому контексті?
Magic Octopus Urn

1
Те саме, що і перший y, натисніть поточне значення в циклі. Тож замість того, щоб дублювати y і поміняти його на вершину, ви просто натискаєте його знову, коли вам це потрібно.
Емінья

@Emigna, здається, мені ще багато чому навчитися ха-ха.
Чарівний восьминога Урна


1

Математика, 81 73 байт

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

Додайте свій код з чотирьох пробілів, щоб він відобразився як код :)
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:f8 байт.

Якщо перший вхід можна взяти за масив цифр, всю програму можна записати в 9 байт: Запустити та налагодити в Інтернеті!


0

Пітон 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є, щоб закінчити програму, коли 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'), а потім оцінює його. Використовує рекурсію на лічильнику ( n and ...f(s,n-1)... or s), щоб уникнути необхідності визначення належної функції та циклу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.