Codegolf — Произведение Цифр

  • Автор темы Жека1234
  • Обновлено
  • 21, Oct 2024
  • #1

Кажется, в последнее время нам очень нравятся прогоны цифр, поэтому вот довольно простая задача.

Учитывая положительное целое число, разделите его на серии цифр и верните результат.

Например:

 11122333 -> 813186
1112333 -> 36963
1122855098 -> 13310
98776543 -> 77
1000000 -> 0
123456789 -> undefined
1 -> undefined
99445662 -> 287496
1199999999 -> 1099999989
999999999 -> 999999999
 
would become 1199999999 , продукт которого 1099999989

Ввод может быть принят как целое число, строка или список/массив цифр/символов. Ваша запись должна работать для любого числа в пределах его представимого диапазона. Я тестировал это для 32-битных целых чисел (максимальное значение 2 ^ 32-1), и максимально возможный результат, который я нашел, это 813186 from 111, 22, 333 , что также находится в диапазоне 32-битных целых чисел. Мне еще предстоит найти число, выходное значение которого превышает входное.

Для целей этой задачи серии длиной 1 не учитываются.

Если есть только 1 прогон, верните прогон. Если запусков нет, сделайте что-нибудь (неопределенное поведение)

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

Тестовые случаи

11122333

Подсчет очков

Это так мало байтов на каждом языке побеждает!

#код-гольф #код-гольф #номер

Жека1234


Рег
12 Jun, 2014

Тем
72

Постов
207

Баллов
587
  • 26, Oct 2024
  • #2

Хаскелл, 63 55 байт

Поскольку еще никто не использовал Haskell, вот мое мнение по этому поводу. Принимает строку в качестве входных данных (конечно).

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 [ { } { } ] dip
[ 48 - 2dup swap in? [ suffix ] [ [ suffix ] dip 1array ] if ] each
suffix rest [ 0 swap [ swap 10 * + ] each ] map product
 

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

Этот код выглядит так, будто в него не играют в гольф, но я никак не могу найти способ сделать его короче.

 

Gaipleunali20


Рег
30 Dec, 2008

Тем
61

Постов
192

Баллов
527
  • 26, Oct 2024
  • #3

Япт, 10 8 байт

Принимает ввод в виде строки, выводит целое число или "*" for "undefined".

p eval gets.scan(/(.)\1+/).map(&:join)*?*

Проверьте это

  • 2 байта сэкономлены благодаря ЭТХ
 

Diaobi4886


Рег
31 Aug, 2012

Тем
61

Постов
196

Баллов
541
  • 26, Oct 2024
  • #4

05AB1E, 6 5 байт

-1 байт благодаря Эрику Аутгольфисту

q e# read string - '1112333' e` e# convert string to RLE - [[3,'1'],[1,'2'],[3,'3']] {0=1>}, e# filter out runs of length one - [[3,'1'],[3,'3']] {:*i}% e# convert sub-arrays to runs - [111,333] :* e# multiply array elements - 36963

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

Если нам не нужно игнорировать серии длиной один, 2 байта:

qe`{0=1>},{:*i}%:*

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

 

Nik2019


Рег
11 Apr, 2020

Тем
82

Постов
213

Баллов
623
  • 26, Oct 2024
  • #5

JavaScript (ES6), 46 45 38 35 байт

Принимает входные данные в виде строки, выводит целое число или выдает ошибку «не определено».

preg_match_all('#(.)\1+#',$argn,$t);echo array_product($t[0]);
  • 7 байт сэкономлено благодаря Герман.
  • 3 байта сэкономлены благодаря Крейг.

Попробуйте это

lambda n:eval('*'.join(zip(*re.findall(r'((.)\2+)',n))[0])) import re l='0' p=1 for c in input()+' ':a=c in l;p*=int(l)**(len(l)>1>a);l=l*a+c print p
 

Bigoremirep


Рег
16 Dec, 2013

Тем
66

Постов
191

Баллов
571
  • 26, Oct 2024
  • #7

Перл 5, 25 байт

24 байта + z,r;f(char*d){for(z=0;r=*d++;z=r/10?z?z*r:r:z)for(r-=48;r==*d-48;r=r*10+*d++-48);d=z;} флаг.

_

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

Совершенно прямо: _ matches the runs of more than one digit, and _ использует {`(?<=^(_+) _*)_ $1 }`^_+ _ _ as accumulator for the multiplications (because its initial value is 1 and not 0). Finally, T`d установлено на _ and implicitly printed thanks to (.)\1+ $*_ flag.

 

Vitoboss


Рег
08 Dec, 2006

Тем
75

Постов
218

Баллов
603
  • 26, Oct 2024
  • #8

Перл 6, 21 байт

(.)\1+ $*_ T`d {`(?<=^(_+) _*)_ $1 }`^_+ _ _ _

Проверьте это

Это возвращает { # bare block lambda with implicit parameter 「$_」 [*] # reduce the following using &infix:<*> .comb( # pull out substrings that match the following # (implicit method call on 「$_」) / (.) # any digit (character) $0+ # at least one more of that digit / ) } if there is no «цифровые пробеги» поскольку это базовый случай умножения.

Единственное изменение, позволяющее использовать одну цифру, - это заменить $0* with $0+ в регулярном выражении.

Расширено:

1 ||answer||

сетчатка, 47 байт

{[*] .comb(/(.)$0+/)}

Это медленно в больших тестовых случаях.

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

Объяснение

-p

Сначала замените каждую серию из 2 или более одинаковых цифр таким же количеством $. s, followed by a space for separation.

$_

Затем удалите все оставшиеся цифры.

$.

Затем запустите эти два этапа в цикле. Первый заменяет каждый $.*=$& in the second run with the entire first run, effectively multiplying them. The second stage deletes the first run.

(.)\1+

Наконец, выведите число s/(.)\1+/$.*=$&/eg;$_=$. s.

 

Benjamin00


Рег
13 Jul, 2012

Тем
70

Постов
213

Баллов
563
  • 26, Oct 2024
  • #13

CJam, 18 байт

γP

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

γ9ÝKP ||answer||

Рубин, 41 байт

ò¦ fa_Ã×

Принимает входные данные со стандартного ввода, сканирует их на наличие фрагментов длиной > 1, объединяет их 1 , evaluates and prints.

 

Menqe759skestSoky


Рег
05 Mar, 2012

Тем
63

Постов
197

Баллов
522
  • 26, Oct 2024
  • #14

Фактор, 151 байт

import Data.List f s=product[read x|x@(_:_:_)<-group s]

Лучше освоить этот язык! Все еще не думаю, что я использую достаточно комбинаторов...

 

Achiles


Рег
26 Jan, 2006

Тем
62

Постов
192

Баллов
512
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно