Замініть двійки трійками


36

З огляду на позитивне ціле число п написати код , щоб взяти його розкладання на прості множники і заміни всіх його чинників 2з 3.

Наприклад

12 = 2 * 2 * 3 -> 3 * 3 * 3 = 27

Це тому мета - мінімізувати кількість байтів вашої відповіді.

Тестові справи

1 -> 1
2 -> 3
3 -> 3
4 -> 9
5 -> 5
6 -> 9
7 -> 7
8 -> 27
9 -> 9
10 -> 15
11 -> 11
12 -> 27
13 -> 13
14 -> 21
15 -> 15
16 -> 81
17 -> 17
18 -> 27
19 -> 19
20 -> 45
21 -> 21
22 -> 33
23 -> 23
24 -> 81
25 -> 25
26 -> 39
27 -> 27
28 -> 63
29 -> 29

Відповіді:


63

Фрактран , 3 байти

3/2

У Fractran буквально є лише один вбудований, але трапляється робити саме те, про що вимагає це завдання. (Це також Тьюрінг-повний, сам по собі.)

Мова насправді не має стандартизованого синтаксису чи інтерпретатора. Цей перекладач (у коментарі до публікації в блозі - це дуже проста мова) прийме показаний тут синтаксис. (Є й інші інтерпретатори Fractran з іншими синтаксисами, наприклад, деякі записують цю програму як 3 2, або навіть використовують 3і 2як аргументи командного рядка, що призведе до оцінки 0 + 3 байти. Я сумніваюся, що це можливо зробити краще, ніж 3 у a однак уже існуючий перекладач.)

Пояснення

3/2
 /   Replace a factor of
  2  2
3    with 3
     {implicit: repeat until no more replacements are possible}

10
Поговоріть про правильний інструмент для роботи ..
Кевін Кройсейсен

23
"Не вимагайте тривіальних рішень, у яких використовується лише простий вбудований файл." Ну, у цьому випадку: Знання, що існує мова "Fractran", яка має єдиний вбудований елемент, який вирішує цю конкретну задачу, саме по собі вражає.
Стюі Гріффін

3
Пов'язаний код SO гольфу (до PPCG): Напишіть перекладач Fractran .
варення

1
@AnderBiguri: Скоріш за все, шукаєш повну мову Тьюрінга, яка дуже проста / проста у виконанні. Fractran дійсно елегантний, як іде Тюрпіт Тюрінг; у більшості є набагато більш шорсткі краї, спеціальні корпуси або деталі, які можна змінити, не змінюючи великих змін.

3
@AnderBiguri Схоже, це вийшло з його досліджень гіпотези Колатца; він довів, що узагальнення Collatz еквівалентно Fractran і що Fractran є повним Тьюрінга, тому узагальнений Collatz не можна визначити.
панночки

21

Python 2 , 28 байт

f=lambda n:n%2*n or 3*f(n/2)

Спробуйте в Інтернеті!

Рекурсивно ділимо число на 2 і множимо результат на 3, доки число є парним. Непарні числа повертаються самі.

32 байт alt:

lambda n:n*(n&-n)**0.58496250072

Спробуйте в Інтернеті . Є деяка помилка поплавця. Постійна є log_2(3)-1.

Використовує (n&-n)для пошуку найбільшого коефіцієнта потужності-2 n, перетворюється 3**kна 2**kйого, піднімаючи його на потужність log_2(3)-1.


Приємно, це саме моє рішення!
Пшеничний майстер

@WheatWizard Мені також, ага!
Гравітон

18

05AB1E , 4 байти

Ò1~P

Спробуйте в Інтернеті!

Як це працює

Ò     Compute the prime factorization of the input.
 1~   Perform bitwise OR with 1, making the only even prime (2) odd (3).
   P  Take the product of the result.

Це б'є Jelly на 1 байт просто тому, що основний
чинник

5
@HyperNeutrino: Я також помітив це: "чому Денніс використовує 05AB1E? О, однаковий алгоритм, коротші вбудовані назви". Тому мені довелося піти і знайти мову, де я міг би це зробити в ще меншій кількості байтів, використовуючи ще більш відповідний набір вбудованих.

14

Haskell, 24 23 байти

until odd$(*3).(`div`2)

Ділимось на два і помножимо на 3, доки непарний трюк у Haskell.

Спробуйте в Інтернеті!

Альтернатива з лямбда замість функції точкової візки і з тим же числом байтів:

odd`until`\x->div(x*3)2

Редагувати: @ ais523 зберег байт у вихідній версії, а @ Ørjan Johansen - в альтернативній версії, тому обидві версії мають однакову довжину. Спасибі!


3
Версію лямбда можна скоротити до odd`until`\x->div(x*3)2.
Ørjan Johansen

2
Оригінальну версію можна також скоротити на один байт, використовуючи $заміну пари дужок: Спробуйте в Інтернеті!

@ ØrjanJohansen: ах, приємно! Спасибі.
німі

@ ais523: Як я міг пропустити це, Дякую!
німі

2
Я думаю, ви забули видалити пару ()з версії лямбда
CAD97

8

JavaScript (ES6), 19 байт

f=x=>x%2?x:f(x*1.5)

Поки вхід ділиться на два, помножимо його на 1,5, що еквівалентно діленню на 2 та множенню на 3.


2
x*3/2має той самий облік рахунку
Leaky Nun

1
f=не потрібен js.
Крістоф

3
@Christoph Спасибі, але для того, щоб називати себе, f(x*1.5)йому потрібно мати ім'я f, отже, чому f=це включено.
ETHproductions

@ETHproductions Гм ... звичайно! Я пропустив це. Чи є мета на те, як саме виглядає дзвінок?
Крістоф

2
@Christoph Ось відповідний мета-пост.
ETHproductions

8

Мозок-Флак , 76 байт

{{({}[()]<([({})]()<({}{})>)>)}{}([{}]()){{}((({})){}{})<>}<>}<>({}({}){}())

Спробуйте в Інтернеті!

Пояснення

Ця програма працює, діливши число на два і потроюючи, поки не отримає залишок одиниці від ділення. Потім він перестає циклічно розкручуватися і подвоюється та додає одне до кінцевого числа.

Більш детальне пояснення зрештою ...



7

Математика, 22 19 байт

Завдяки lanlock4 за збереження 3 байтів!

#//.x_?EvenQ:>3x/2&

Чиста функція, яка робить заміну повторно, один коефіцієнт 2 одночасно. Працює на всіх натуральних чисел менше 2 65537 .


Чи x_?EvenQпрацювали б замість цього x_/;EvenQ@x?
Не дерево

1
Ви абсолютно праві, дякую!
Грег Мартін

6

MATL , 7 , 6 байт

Yf1Z|p

Спробуйте в Інтернеті!

1 байт збережено завдяки геніальному спостереженню Денніса


Найкращий спосіб пояснити це - показати стек у різних точках.

Yf  % Prime factors

[2 2 2 3]

1Z| % Bitwise OR with 1

[3 3 3 3]

p   % Product

81

Альтернативне рішення:

Yfto~+p

Приємно! У мене було Yf3H$X>p8 байт
Луїс Мендо


6

Аліса , 9 байт

2/S 3
o@i

Спробуйте в Інтернеті!

Аліса має вбудований для заміни дільника числа на інший. Я не думав, що насправді так скоро скористаюся ...

Використовуючи кодові точки символів для вводу-виводу, це стає 6 байтів: I23SO@ .

Пояснення

2   Push 2 (irrelevant).
/   Reflect to SE. Switch to Ordinal.
i   Read all input as a string.
    The IP bounces up and down, hits the bottom right corner and turns around,
    bounces down again.
i   Try to read more input, but we're at EOF so this pushes an empty string.
/   Reflect to W. Switch to Cardinal.
2   Push 2.
    The IP wraps around to the last column.
3   Push 3.
S   Implicitly discard the empty string and convert the input string to the integer
    value it contains. Then replace the divisor 2 with the divisor 3 in the input.
    This works by multiplying the value by 3/2 as long as it's divisible by 2.
/   Reflect to NW. Switch to Ordinal.
    Immediately bounce off the top boundary. Move SW.   
o   Implicitly convert the result to a string and print it.
    Bounce off the bottom left corner. Move NE.
/   Reflect to S. Switch to Cardinal.
@   Terminate the program.

1
Ваша одержимість офіційно підтверджена.
Leaky Nun

4

Желе , 8 5 байт

Æf3»P

Æf3»P  Main Link, argument is z
Æf     Prime factors
  3»   Takes maximum of 3 and the value for each value in the array
    P  Takes the product of the whole thing

Спробуйте в Інтернеті!

-3 байти завдяки підказці від @Dennis!


2
Підказка: 2 є і єдиним парним, і найменшим простим числом.
Денніс

@Денніс я бачу. Так, зараз. Спасибі! :)
HyperNeutrino

Вітаємо з навчанням Jelly.
Leaky Nun

@LeakyNun Дякую! І дякую, що виклали це мені. :)
HyperNeutrino


4

Pyth - 14 10 9 байт

*^1.5/PQ2

Підраховує кількість 2s в основній факторизації (/ PQ2). Помножує введення на 1,5 ^ (# з 2s)

Спробуй це


Цікавий підхід - занадто погано, що він не такий короткий, як існуюче рішення Pyth.
Esolanging Fruit

@ Challenger5 Я не бачу тут жодного іншого рішення Pyth.
Марія

1
О, гаразд тоді. Це більш цікавий підхід, ніж типовий для цього виклику.
Esolanging Fruit


4

Гексагонія , 112 91 байт

Розмір сітки 6 (91 байт)

      ? { 2 . . <
     / = { * = \ "
    . & . . . { _ '
   . . { . . } ' * 2
  _ } { / . } & . ! "
 . > % . . < | . . @ |
  \ . . \ . | ~ . . 3
   . . " . } . " . "
    . & . \ = & / 1
     \ = { : = } .
      [ = { { { <

Компактна версія

?{2..</={*=\".&...{_'..{..}'*2_}{/.}&.!".>%..<|..@|\..\.|~..3..".}.".".&.\=&/1\={:=}.[={{{<

Розмір сітки 7 (112 байт)

       ? { 2 " ' 2 <
      / { * \ / : \ "
     . = . = . = | . 3
    / & / { . . } { . "
   . > $ } { { } / = . 1
  _ . . } . . _ . . & . {
 . > % < . . ~ & . . " . |
  | . . } - " . ' . @ | {
   . . . = & . . * ! . {
    . . . _ . . . _ . =
     > 1 . . . . . < [
      . . . . . . . .
       . . . . . . .

Спробуйте в Інтернеті!

Компактна версія:

?{2"'2</{*\/:\".=.=.=|.3/&/{..}{.".>$}{{}/=.1_..}.._..&.{.>%<..~&..".||..}-".'.@|{...=&..*!.{..._..._.=>1.....<[

Невикористана версія для кращої читабельності:

Ungolfed

Приблизний макет пам'яті

enter image description here

Сірий шлях (ініціалізація пам'яті)

?     Read input as integer (Input)
{     Move to memory edge "Divisor left"
2     Set current memory edge to 2 
" '   Move to memory edge "Divisor right" 
2     Set current memory edge to 2
"     Move to memory edge "Multiplier" 
3     Set current memory edge to 3
"     Move to memory edge "Temp 2" 
1     Set current memory edge to 1 
{ { { Move to memory edge "Modulo"
=     Turn memory pointer around 
[     Continue with next instruction pointer

Цикл запису

%     Set "Modulo" to Input mod Divisor
<     Branch depending on result

Зелений шлях (значення все ще ділиться на 2)

} } {     Move to memory edge "Result"
=         Turn memory pointer around 
*         Set "Result" to "Temp 2" times "Multiplier" (3) 
{ = &     Copy "Result" into "Temp2" 
{ { } } = Move to "Temp"
:         Set "Temp" to Input / Divisor (2)
{ = &     Copy "Temp" back to "Input"
"         Move back to "Modulo"

Червоний шлях (значення більше не ділиться на 2)

} = & " ~ & ' Drag what's left of "Input" along to "Multiplier"
*             Multiply "Multiplier" with "Temp 2"
! @           Output result, exit program

1
Ласкаво просимо до PPCG! :)
Мартін Ендер

@MartinEnder Спасибі, дивовижна мова btw. :)
Манфред Радлвіммер

1
Дякуємо, що використовували його! :) Чи не можете ви спростити компонування пам’яті (і тим самим обсяг руху, який вам потрібно зробити), якщо обчислити %2і :2обидва в край «модуля»? (Таким чином, ви можете просто позбутися двох верхніх країв.) А потім, чи можете ви прикріпити гілку "множника" на край "модуля" замість краю "дільник", щоб вам було менше руху після кожної гілки? (Ви, можливо, навіть можете повернути цей розділ, щоб "результат" або "темп 2" торкнувся "модуля", що означатиме, що вам потрібно скопіювати кінцевий результат лише один раз, перш ніж ви зможете обчислити продукт.)
Мартін Ендер,

@MartinEnder Uhhhm, певно. Я все ще обходжу частину мови "Агонія", тому зараз, мабуть, я буду дотримуватися того, щоб зменшити сітку, не торкаючись логіки ^^
Манфред Радлвіммер



2

J , 11 байт

[:*/q:+2=q:

Спробуйте в Інтернеті!

[: cap (заповнювач для виклику наступного дієслова монадично)

*/ продукт

q: основні фактори

+ плюс (тобто з доданим куди)

2 два

= дорівнює (кожен з)

q: основні фактори


Я думав, ти [:вважаєш огидним.
Leaky Nun

@LaakyNun Я це роблю, але я був не такий розумний, як Конор О'Браєн .
Адам

2

J , 15 12 10 байт

(+2&=)&.q:

Спробуйте в Інтернеті! Працює аналогічно нижче, тільки має іншу логіку в відношенні заміни 2з 3.

15 байт

(2&={,&3)"+&.q:

Спробуйте в Інтернеті!

Пояснення

(2&={,&3)"+&.q:
           &.    "under"; applies the verb on the right, then the left,
                 then the inverse of the right
             q:  prime factors
(       )"+      apply inside on each factor
     ,&3         pair with three: [factor, 3]
 2&=             equality with two: factor == 2
    {            list selection: [factor, 3][factor == 2]
                 gives us 3 for 2 and factor for anything else
           &.q:  under prime factor

Ага, ти перемикав алгоритм, поки я писав свою. Зараз ми використовуємо те саме.
Адам

@ Adám О, ха-ха. Гарна відповідь! Я не втримався від можливості використовувати rollтут. :)
Conor O'Brien

Насправді я міг би зберегти ще кілька байтів ... редагувати збережені деякі: D
Conor O'Brien

Funny you call it Roll, I call it Under. Hope to get it into APL soon.
Adám

@Adám Haha it's actually called under. I got the terms confused
Conor O'Brien


2

Japt, 19 16 10 9 7 bytes

k ®w3Ã×

Try it online!

Explanation

 k ®   w3Ã ×
Uk mZ{Zw3} r*1
U              # (input)
 k m           # for every prime factor
    Z{Zw3}     # replace it by the maximum of itself and 3
           r*1 # output the product

Hah, JS is tied with Japt. A sure sign there's a much shorter solution ;-)
ETHproductions

Hints: × is a shortcut for r@X*Y}1 (or just r*1), which might come in handy. There's also XwY which is Math.max(X,Y).
ETHproductions

Thanks, though the recursive solution really is the shortest.
Luke

Nice one! I think you can do k m_w3Ã× to save a byte. Also, m_ can be shortened to ®.
Oliver


2

CJam, 10 9 bytes

rimf1f|:*

Really simple.

Explanation:

ri  e# Read integer:         | 28
mf  e# Prime factors:        | [2 2 7]
1   e# Push 1:               | [2 2 7] 1
f|  e# Bitwise OR with each: | [3 3 7]
:*  e# Product:              | 63

2

Hexagony, 28 27 26 bytes

?'2{{(\}}>='!:@=$\%<..>)"*

Try it online!

Laid out:

    ? ' 2 {
   { ( \ } }
  > = ' ! : @
 = $ \ % < . .
  > ) " * . .
   . . . . .
    . . . .

This basically runs:

num = input()
while num%2 == 0:
    num = (num/2)*3
print num

At this point it's an exercise on how torturous I can get the loop path to minimise bytes.


Well damn, I didn't think of that
Manfred Radlwimmer

1
@ManfredRadlwimmer Don't worry, coding anything in Hexagony is an achievement in itself
Jo King

1

Japt, 7 bytes

k mw3 ×

Try it online!

Explanation

k mw3 ×

k        // Factorize the input.
  mw3    // Map each item X by taking max(X, 3).
      ×  // Take the product of the resulting array.
         // Implicit: output result of last expression


1

R, 42 bytes

The only right amount of bytes in an answer.

x=gmp::factorize(scan());x[x==2]=3;prod(x)

Pretty straightforward, uses the gmp package to factorize x, replaces 2s by 3s, and returns the product.


1

Befunge-93, 20 bytes

&>:2%!#v_.@
 ^*3/2 <

Try it online!

& - take in input and add it to the stack
> - move right
: - duplicate the top of the stack
2 - add two to the stack
% - pop 2 and the input off the stack and put input%2 on the stack
! - logical not the top of the stack
# - jump over the next command
_ - horizontal if, if the top of the stack is 0 (i.e. input%2 was non zero) go 
    right, else go left

If Zero:
. - output the top of the stack
@ - end code

If Not Zero:
v - move down
< - move left
2 - add 2 the top of the stack
/ - pop top two, add var/2 to the stack
3 - add 3 to stack
* - pop top two, add var*3 to the stack
^ - move up
> - move right (and start to loop)


1

Perl 6, 14 bytes

{1.5**.lsb*$_}

lsb returns the position of the least-significant bit, counted from the right. That is, how many trailing zeroes in the binary representation, which is the same as the number of factors of 2. So raise 3/2 to that power and we're done.

say {$_*1.5**.lsb}(24);
> 81


0

Actually, 9 bytes

w⌠i1|ⁿ⌡Mπ

Try it online!

Explanation:

w⌠i1|ⁿ⌡Mπ
w          factor into [prime, exponent] pairs
 ⌠i1|ⁿ⌡M   for each pair:
  i          flatten
   1|        prime | 1 (bitwise OR)
     ⁿ       raise to exponent
        π  product
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.