İkileri üçlü ile değiştirin


36

Pozitif bir tamsayı Verilen n onun asal çarpanlara alıp onun faktörlerin hepsini yerine bazı kod yazmak 2ile 3.

Örneğin

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

Bu olduğundan amaç, cevabınızın bayt sayısını en aza indirmektir.

Test durumları

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

Yanıtlar:


63

Fractran , 3 bayt

3/2

Fractran kelimenin tam anlamıyla yalnızca bir yerleşik yapıya sahiptir, ancak tam olarak bu görevin istediği şeyi yapar. (Aynı zamanda Turing tamamlandı, kendi başına.)

Dil gerçekten standart bir sözdizimine veya tercümana sahip değildir. Bu tercüman (bir blog gönderisine yapılan bir yorumda - çok basit bir dildir) burada gösterilen sözdizimini kabul edecektir. (Diğer sözdizimleriyle birlikte başka Fractran tercümanları da var, örneğin bazıları bu programı 0 + 3 baytlık bir puana götürecek komut satırı argümanları olarak kullanacaklar ve 3 2hatta kullanacaklardı. önceden var olan tercüman.32

açıklama

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

10
İş için doğru alet hakkında konuşun ..
Kevin Cruijssen

23
"Sadece basit bir yerleşik kullanan önemsiz çözümleri azaltmayın." Eh, bu durumda: Bu belirli görevi çözen tek bir yerleşimi olan bir dil "Fractran" olduğunu bilmek, kendi başına etkileyicidir.
Stewie Griffin

3
İlgili SO kodu golf (PPCG öncesi): Bir Fractran tercüman yazın .
Ocaklar

1
@AnderBiguri: Muhtemelen uygulaması çok basit / kolay olan bir Turing tamamlanmış dilini arıyorum. Turp tarpitleri giderken Fractran gerçekten de zarif; birçoğunun, daha büyük bir fark yaratmadan değiştirilebilecek daha pürüzlü kenarları, özel durumları veya detayları vardır.

3
@AnderBiguri Collatz varsayımı üzerine yaptığı çalışmalardan ortaya çıktı; Collatz'ın genelleştirilmesinin Fractran'a eşdeğer olduğunu ve Fractran'ın Turing tamamlandığını, bu nedenle genelleştirilen Collatz'ın kararsız olduğunu kanıtladı.
Ocaklar

21

Python 2,28 bayt

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

Çevrimiçi deneyin!

Tekrarlayan sayıyı 2'ye bölün ve sonucu eşit olduğu sürece 3 ile çarpın. Tek sayılar kendilerini döndürür.

32 bayt alt:

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

Çevrimiçi deneyin . Bazı şamandıra hatası var. Sabit log_2(3)-1.

Kullanımları (n&-n)büyük güç-of-2 faktör bulmak için ndönüştürür, 3**kiçin 2**kgücüne bunu yükselterek log_2(3)-1.


Güzel bu benim çözümüm!
Buğday Sihirbazı

@WheatWizard Beni de, aha!
Graviton,

18

05AB1E , 4 bayt

Ò1~P

Çevrimiçi deneyin!

Nasıl çalışır

Ò     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.


5
@HyperNeutrino: Ben de şunu farkettim: "Dennis neden 05AB1E kullanıyor? Ah, özdeş algoritma, daha kısa yerleşik isimler". Bu yüzden, daha uygun bir yapı kümesi kullanarak, daha az baytta bile yapabileceğim bir dil bulmalıydım.

14

Haskell, 24 23 bayt

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

Haskell'de tuhaf bir numara olana kadar ikiye bölün ve 3 ile çarpın.

Çevrimiçi deneyin!

Noktasız işlev yerine lambda ve aynı byte sayısında alternatif:

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

Düzenleme: @ ais523 orijinal sürümde bir bayt ve alternatif sürümde @ Ørjan Johansen bir bayt kaydetti, bu nedenle her iki sürüm de aynı uzunluktadır. Teşekkürler!


3
Lambda versiyonu kısaltılabilir odd`until`\x->div(x*3)2.
Ørjan Johansen

2
Orijinal versiyon, $bir çift parantez yerine kullanılarak bir bayt kısaltılabilir : Çevrimiçi deneyin!

@ ØrjanJohansen: ah, güzel! Teşekkürler.
nimi

@ ais523: Bunu nasıl kaçırmış olabilirim, Teşekkürler!
nimi

2
Sanırım bir çiftini ()lambda versiyonundan çıkarmayı unuttun
CAD97

8

JavaScript (ES6), 19 bayt

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

Girdi ikiye bölünebilirken, onu 2 ile bölmeye ve 3 ile çarpmaya eşdeğer olan 1,5 ile çarpın.


2
x*3/2aynı bayt sayısına sahip
Leaky Nun

1
f=genellikle js için gerekli değildir.
Christoph

3
@Christoph Teşekkürler, ancak kendisini çağırmak f(x*1.5)için isminin olması gerekir f, bu nedenle neden f=dahil edilir.
ETHproductions

@ETHproductions Uhm ... elbette! Onu özledim. Çağıran kodun tam olarak neye benzediğine dair herhangi bir meta var mı?
Christoph

2
@Christoph İşte ilgili meta yazı.
ETHproductions

8

Brain-Flak , 76 bayt

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

Çevrimiçi deneyin!

açıklama

Bu program, sayıyı ikiye bölerek ve bölümden bir tanesinin kalanını alana kadar üçe katlanarak çalışır. Sonra döngü durur ve iki katına çıkar ve son sayıya bir ekler.

Sonunda daha ayrıntılı bir açıklama ...


> Çok yakında ...
Buğday Sihirbazı

7

Mathematica, 22 19 bayt

3 byte tasarrufu için lanlock4'e teşekkürler!

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

Değişimi tekrarlayan saf fonksiyon, bir seferde 2 faktör. 2. 65537'den küçük tüm pozitif tamsayılarla çalışır .


Yerine x_?EvenQişe yarar mıydı x_/;EvenQ@x?
Bir ağaç

1
Tamamen haklısın, teşekkürler!
Greg Martin,


6

05AB1E , 6 5 bayt

Adnan sayesinde bir bayt kaydedildi .

ÒDÈ+P

Çevrimiçi deneyin!

açıklama

Ò       # push list of prime factors of input
 D      # duplicate
  È     # check each factor for evenness (1 if true, else 0)
   +    # add list of factors and list of comparison results
    P   # product

2
ÒDÈ+Pbir bayt kurtarmalı
Adnan

@Adnan: Teşekkürler!
Emigna

6

Alice , 9 bayt

2/S 3
o@i

Çevrimiçi deneyin!

Alice, bir sayının bölenini bir başkasıyla değiştirmek için yerleşik bir kısma sahiptir. Aslında bu kadar çabuk faydalanabileceğimi düşünmedim ...

I / O için karakter kodu noktalarını kullanarak, bu 6 bayt olur: I23SO@.

açıklama

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
Takıntın resmen doğrulandı.
Leaky Nun

4

Jöle , 8 5 bayt

Æ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

Çevrimiçi deneyin!

@Dennis'den bir ipucu sayesinde -3 bayt!


2
İpucu: 2 hem tek, hem de en küçük asal sayıdır.
Dennis,

@Dennis görüyorum. Evet, şimdi anladım. Teşekkürler! :)
HyperNeutrino

Jelly'i öğrendiğin için tebrikler.
Sızdıran Rahibe,

@LeakyNun Teşekkürler! Ve bana öğrettiğin için teşekkürler. :)
HyperNeutrino,

Bu cevap için tebrikler!
Outgolfer Erik,

4

Pyth - 14 10 9 bayt

*^1.5/PQ2

Asal çarpanlara ayırma işleminde (/ PQ2) 2s sayısını sayar. Girişi 1,5 ^ ile çarpar (2s sayısı)

Dene


İlginç yaklaşım - çok kötü, mevcut Pyth çözümü kadar kısa değil.
Esolanging Meyve

@ Challenger5 Burada başka bir Pyth çözümü göremiyorum.
Maria,

1
AA tamam o zaman. Bu meydan okuma için tipik olandan daha ilginç bir yaklaşım.
Esolanging Fruit, 5:17


4

Altıgen , 112 91 bayt

Izgara boyutu 6 (91 bayt)

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

Kompakt versiyon

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

Izgara boyutu 7 (112 bayt)

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

Çevrimiçi deneyin!

Kompakt Versiyon:

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

Daha iyi okunabilirlik için Ungolfed Version:

Ungolfed

Yaklaşık Bellek Düzeni

görüntü tanımını buraya girin

Gri Yol (Bellek başlatma)

?     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

Döngü girişi

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

Yeşil Yol (değer hala 2 ile bölünebilir)

} } {     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"

Kırmızı Yol (değer artık 2'ye bölünemez)

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

1
PPCG'ye Hoşgeldiniz! :)
Martin Ender

@MartinEnder Teşekkürler, harika bir dil btw. :)
Manfred Radlwimmer

1
Kullandığınız için teşekkürler! :) Hesaplarsanız %2ve :2her ikisini de "modulo" kenarına koyarsanız bellek düzenini (ve böylece yapmanız gereken hareket miktarını) basitleştiremez misiniz ? (Böylece sadece ilk iki kenardan kurtulabilirsiniz.) Ve sonra "çarpan" dalını "bölen" kenarı yerine "modulo" kenarına bağlayabilir misiniz, böylece her daldan sonra daha az harekete ihtiyacınız olur mu? (Bu bölümü bile döndürebilirsiniz, böylece "sonuç" veya "temp 2", "modulo" yu dokunur ki bu, ürünü hesaplayabilmeden önce yalnızca son sonucu kopyalamanız gerektiği anlamına gelir.)
Martin Ender

Muhtemelen @MartinEnder Uhhhm. Hala dilin "Acı" kısmını dolaşıyorum bu yüzden şimdilik mantığa dokunmadan ızgarayı küçültmeye devam
edeceğim


3

Brachylog , 7 bayt

~×₂×₃↰|

Çevrimiçi deneyin!

Nasıl çalışır

~×₂×₃↰|      original program
?~×₂×₃↰.|?.  with implicit input (?) and output (.) added

?~×₂         input "un-multiplied" by 2
    ×₃       multiplied by 3
      ↰      recursion
       .     is the output
        |    or (in case the above fails, meaning that the input
                 cannot be "un-multiplied" by 2)
         ?.  the input is the output


2

J , 11 bayt

[:*/q:+2=q:

Çevrimiçi deneyin!

[: kapak (bir sonraki fiili monadik olarak çağırmak için yer tutucusu)

*/ ürünü

q: ana faktörler

+ artı (yani, biri eklendiğinde)

2 iki

= eşittir (her biri)

q: ana faktörler


[:İğrenç bulduğunu sanıyordum .
Sızdıran Rahibe,

@LeakyNun Yaparım ama Conor O'Brien kadar zeki değildim .
Adám

2

J , 15 12 10 bayt

(+2&=)&.q:

Çevrimiçi deneyin! Aşağıdakine benzer işler, sadece değiştirilmesiyle ilgili farklı bir mantık 2vardır 3.

15 bayt

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

Çevrimiçi deneyin!

açıklama

(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

Huh, sen benimkileri yazarken algoritmayı değiştirdin. Şimdi aynı kullanıyoruz.
Adám

@ Adám Oh, haha. Güzel cevap! rollBurada kullanma fırsatına karşı koyamadım . :)
Conor O'Brien,

Aslında bazı baytları da kaydedebilirim ... edit bazılarını kaydet : D
Conor O'Brien

Komik sen buna Rulo diyorsun, Ben altında diyoruz. Yakında APL içine almak dileğiyle.
Adám

@ Adám Haha aslında altında denir. Şartları karıştırdım
Conor O'Brien,


2

Japt , 19 16 10 9 7 bayt

k ®w3Ã×

Çevrimiçi deneyin!

açıklama

 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 Japt ile bağlanmıştır. Çok daha kısa bir çözüm olduğuna emin bir işaret ;-)
ETHproductions

İpuçları: İşe yarayabilecek ×bir kısayol r@X*Y}1(ya da sadece r*1). Olan da XwYvar Math.max(X,Y).
ETHproductions

Teşekkürler, özyinelemeli çözüm gerçekten en kısa olsa da.
Luke

Güzel bir! k m_w3Ã×Bir bayt kurtarmak için yapabileceğini düşünüyorum . Ayrıca, m_kısaltılabilir ®.
Oliver


2

CJam, 10 9 bayt

rimf1f|:*

Gerçekten basit.

Açıklama:

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

Altıgen , 28 27 26 bayt

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

Çevrimiçi deneyin!

Ortaya koydu:

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

Bu temelde çalışır:

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

Bu noktada, baytları en aza indirmek için döngü yolunu nasıl başarabileceğim konusunda bir alıştırma.


Kahretsin, bunu düşünmedim
Manfred Radlwimmer

1
@ManfredRadlwimmer Endişelenmeyin, Hexagony'deki herhangi bir şeyi kodlamak başlı başına bir başarıdır
Jo King

1

Japt , 7 bayt

k mw3 ×

Çevrimiçi deneyin!

açıklama

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 bayt

Bir cevapta sadece doğru miktarda bayt.

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

Oldukça basit, gmppaketi çarpanlara ayırmak için kullanır, x2'ler 3s ile değiştirir ve ürünü iade eder.


1

Befunge-93 , 20 bayt

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

Çevrimiçi deneyin!

& - 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 bayt

{1.5**.lsb*$_}

lsb , sağdan sayılan en az anlamlı bitin konumunu döndürür. Yani, ikilik gösterimde kaç tane sıfır sayılır, bu da 2 faktörün sayısı ile aynıdır. Yani bu güce 3/2 yükseltin ve işimiz bitti.

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


0

Aslında 9 bayt

w⌠i1|ⁿ⌡Mπ

Çevrimiçi deneyin!

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.