แทนที่ twos ด้วย threes


36

ป.ร. ให้ไว้เป็นจำนวนเต็มบวก n เขียนโค้ดบางส่วนที่จะใช้ตัวประกอบนายกและแทนที่ทุกปัจจัยของการมี23

ตัวอย่างเช่น

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

Fractran 3 ไบต์

3/2

Fractran แท้จริงมีเพียงหนึ่ง builtin แต่มันเกิดขึ้นเพื่อทำสิ่งที่งานนี้ขอ (มันเป็นทัวริงที่สมบูรณ์ด้วยตัวมันเอง)

ภาษานั้นไม่มีไวยากรณ์หรือล่ามที่ได้มาตรฐาน ล่ามนี้ (ในความคิดเห็นในบล็อกโพสต์ - เป็นภาษาที่ง่ายมาก) จะยอมรับไวยากรณ์ที่แสดงที่นี่ (มีล่าม Fractran อื่น ๆ ที่มีไวยากรณ์อื่น ๆ เช่นบางคนจะเขียนโปรแกรมนี้เป็น3 2หรือแม้กระทั่งการใช้3และ2เป็นอาร์กิวเมนต์บรรทัดคำสั่งซึ่งจะนำไปสู่คะแนน 0 + 3 ไบต์ฉันสงสัยว่าเป็นไปได้ที่จะทำดีกว่า 3 ใน แม้ว่าล่ามที่มีอยู่แล้ว)

คำอธิบาย

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

10
พูดคุยเกี่ยวกับเครื่องมือที่เหมาะสมสำหรับงาน ..
Kevin Cruijssen

23
"อย่าแก้ปัญหาเรื่องไม่สำคัญที่ใช้บิวด์อินอย่างง่าย" ในกรณีนี้: รู้ว่ามีภาษา "Fractran" ที่มีบิลด์เดียวที่แก้งานเฉพาะนี้ได้ด้วยตนเอง
Stewie Griffin

3
รหัส SO เกี่ยวข้องกอล์ฟ (pre-PPCG): เขียนล่าม Fractran
ฮอบส์

1
@AnderBiguri: มองหาภาษาทัวริงที่สมบูรณ์ที่ง่ายมาก / ใช้งานง่าย Fractran นั้นสง่างามอย่างแท้จริง ส่วนใหญ่จะมีขอบที่ขรุขระมากขึ้นกรณีพิเศษหรือรายละเอียดที่สามารถเปลี่ยนแปลงได้โดยไม่ทำให้เกิดความแตกต่างมากนัก

3
@AderderBiguri ดูเหมือนว่ามันจะออกมาจากการศึกษาของเขาในการคาดคะเน Collatz; เขาพิสูจน์ให้เห็นว่าลักษณะทั่วไปของ 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**klog_2(3)-1


นีซนี่คือทางออกของฉันอย่างแน่นอน!
ข้าวสาลีตัวช่วยสร้าง

@WeatWizard ฉันเช่นกัน aha!
Graviton

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 by 1 byte เพียงเพราะตัวประกอบเฉพาะเป็นเพียงหนึ่งไบต์ที่นี่ :(
HyperNeutrino

5
@HyperNeutrino: ฉันก็สังเกตเห็นเช่นกันว่า: "ทำไมเดนนิสถึงใช้ 05AB1E? โอ้อัลกอริธึมเหมือนกัน ดังนั้นฉันต้องไปหาภาษาที่ฉันสามารถทำได้ในไบต์ที่น้อยกว่าผ่านการใช้ชุดบิวอินที่เหมาะสมยิ่งขึ้น

14

Haskell, 24 23 ไบต์

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

หารด้วยสองแล้วคูณด้วย 3 จนกระทั่งเล่ห์เหลี่ยมแปลก ๆ ใน Haskell

ลองออนไลน์!

ทางเลือกที่มีแลมบ์ดาแทนฟังก์ชั่น pointfree และมีจำนวนไบต์เท่ากัน:

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

แก้ไข: @ ais523 บันทึกไบต์ในเวอร์ชันดั้งเดิมและ @ Ørjan Johansen ในเวอร์ชันอื่นดังนั้นทั้งสองรุ่นจึงมีความยาวเท่ากัน ขอบคุณ!


3
เวอร์ชั่นแลมบ์ดาสามารถย่อให้เล็กลงodd`until`\x->div(x*3)2ได้
Ørjan Johansen

2
เวอร์ชันดั้งเดิมสามารถย่อให้สั้นลงหนึ่งไบต์ผ่านการใช้$เพื่อแทนที่วงเล็บ: ลองออนไลน์!

@ ØrjanJohansen: ดีจัง! ขอบคุณ
nimi

@ ais523: ฉันจะพลาดได้อย่างไรขอบคุณ!
nimi

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
Christoph

3
@ Christoph ขอบคุณ แต่เพื่อที่จะเรียกตัวเองf(x*1.5)ว่ามันต้องมีชื่อfด้วยเหตุนี้จึงf=รวมอยู่ด้วย
ETHproductions

@ETHproductions เอ่อ ... แน่นอน! ฉันคิดถึงสิ่งนั้น มีเมตาใด ๆ ในสิ่งที่รหัสการโทรดูเหมือนว่า?
Christoph

2
@Christoph นี่คือเมตาโพสต์ที่เกี่ยวข้อง
ETHproductions

8

Brain-Flak , 76 ไบต์

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

ลองออนไลน์!

คำอธิบาย

โปรแกรมนี้ทำงานโดยการหารจำนวนด้วยสองและสามเท่าจนกว่าจะได้ส่วนที่เหลือจากการหาร จากนั้นจะหยุดการวนซ้ำและเพิ่มเป็นทวีคูณและเพิ่มหนึ่งในหมายเลขสุดท้าย

คำอธิบายรายละเอียดเพิ่มเติมในที่สุด ...


> เร็ว ๆ นี้ ...
Wheat Wizard

7

Mathematica, 22 19 ไบต์

ขอบคุณ lanlock4 สำหรับการบันทึก 3 ไบต์!

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

ฟังก์ชั่นเพียวที่ทำการทดแทนซ้ำ ๆ ซึ่งเป็นปัจจัยหนึ่งของ 2 ครั้ง ทำงานบนจำนวนเต็มบวกทั้งหมดน้อยกว่า 2 65,537


จะx_?EvenQทำงานแทนx_/;EvenQ@xหรือไม่
ไม่ใช่ต้นไม้

1
คุณพูดถูก!
Greg Martin

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 ไบต์
Luis Mendo

6

05AB1E , 6 5 ไบต์

บันทึกขอบคุณไบต์Adnan

ÒDÈ+P

ลองออนไลน์!

คำอธิบาย

Ò       # 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È+Pควรบันทึกไบต์
Adnan

@Adnan: ขอบคุณ!
Emigna

6

อลิซ 9 ไบต์

2/S 3
o@i

ลองออนไลน์!

อลิซมีในตัวเพื่อแทนที่ตัวหารของตัวเลขด้วยอีกตัว ฉันไม่คิดว่าจริง ๆ แล้วฉันจะได้ใช้ประโยชน์จากมันในไม่ช้า ...

โดยใช้จุดรหัสของตัวละครสำหรับ I / O นี้จะกลายเป็น 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
ความหลงใหลของคุณได้รับการยืนยันอย่างเป็นทางการ
Leun 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เป็นจำนวนเฉพาะคู่และจำนวนน้อยที่สุด
Dennis

@ เดนนิสฉันเห็น ใช่เข้าใจแล้ว ขอบคุณ! :)
HyperNeutrino

ขอแสดงความยินดีกับการเรียนรู้เจลลี่
Leun Nun

@LeakyNun ขอบคุณ! และขอขอบคุณที่สอนให้ฉัน :)
HyperNeutrino

ยินดีด้วยกับคำตอบนี้!
Erik the Outgolfer

4

Pyth - 14 10 9 ไบต์

*^1.5/PQ2

นับจำนวน 2s ในการแยกตัวประกอบเฉพาะ (/ PQ2) คูณอินพุตด้วย 1.5 ^ (# ของ 2s)

ลองมัน


วิธีการที่น่าสนใจ - แย่มากมันไม่สั้นเท่ากับโซลูชัน Pyth ที่มีอยู่
แยกผลไม้

@ Challenger5 ฉันไม่เห็นโซลูชัน Pyth อื่น ๆ ที่นี่
Maria

1
โอ้ตกลงแล้ว มันเป็นวิธีที่น่าสนใจมากกว่าวิธีทั่วไปสำหรับความท้าทายนี้
แยกผลไม้


4

Hexagony , 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 Version เพื่อการอ่านที่ดีขึ้น:

Ungolfed

เค้าโครงหน่วยความจำโดยประมาณ

ป้อนคำอธิบายรูปภาพที่นี่

เส้นทางสีเทา (การกำหนดค่าเริ่มต้นหน่วยความจำ)

?     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"

Red Path (ค่าจะไม่หารด้วย 2)

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

1
ยินดีต้อนรับสู่ PPCG! :)
Martin Ender

@MartinEnder ขอบคุณภาษายอดเยี่ยม btw :)
Manfred Radlwimmer

1
ขอบคุณที่ใช้มัน! :) คุณไม่สามารถลดความซับซ้อนของรูปแบบหน่วยความจำ (และปริมาณการเคลื่อนไหวที่คุณต้องทำ) หากคุณคำนวณ%2และ:2ทั้งสองเข้าไปในส่วน "โมดูโล" (ดังนั้นคุณสามารถกำจัดขอบสองด้านบน) จากนั้นคุณสามารถแนบสาขา "ตัวคูณ" เข้ากับขอบ "โมดูโล" แทนขอบ "ตัวหาร" ดังนั้นคุณจึงต้องการการเคลื่อนไหวน้อยลงหลังจากแต่ละสาขา (คุณอาจหมุนส่วนนั้นเพื่อให้ "ผล" หรือ "อุณหภูมิ 2" สัมผัส "โมดูโล" ซึ่งหมายความว่าคุณจะต้องคัดลอกผลลัพธ์สุดท้ายหนึ่งครั้งก่อนที่จะสามารถคำนวณผลิตภัณฑ์ได้)
Martin Ender

@MartinEnder Uhhhm คงเป็นไปได้ ฉันยังคงเดินทางไปรอบ ๆ ส่วน "ความเจ็บปวด" ของภาษาดังนั้นตอนนี้ฉันอาจจะทำให้ตารางเล็กลงโดยไม่ต้องสัมผัสตรรกะ ^^
Manfred Radlwimmer


3

Brachylogขนาด 7 ไบต์

~×₂×₃↰|

ลองออนไลน์!

มันทำงานอย่างไร

~×₂×₃↰|      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 ไบต์

[:*/q:+2=q:

ลองออนไลน์!

[: หมวก (ตัวยึดตำแหน่งที่จะเรียกคำกริยาถัดไปเป็นแบบเดี่ยว)

*/ ผลิตภัณฑ์ของ

q: ปัจจัยสำคัญ

+ เครื่องหมายบวก (เช่นเมื่อเพิ่มอีกหนึ่งตำแหน่ง)

2 สอง

= เท่ากับ (แต่ละแห่ง)

q: ปัจจัยสำคัญ


ฉันคิดว่าคุณ[:น่าขยะแขยง
Leun Nun

@LeakyNun ฉันทำ แต่ผมก็ไม่ได้ฉลาดเป็นConor โอไบรอัน
อดัม

2

J , 15 12 10 ไบต์

(+2&=)&.q:

ลองออนไลน์! ทำงานคล้ายกับด้านล่างก็มีตรรกะที่แตกต่างกันเกี่ยวกับการเปลี่ยนด้วย23

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

@ Adámโอ้ฮ่าฮ่า คำตอบที่ดี! ฉันไม่สามารถต้านทานโอกาสที่จะใช้rollที่นี่ :)
Conor O'Brien

จริงๆแล้วฉันอาจจะสามารถบันทึกไบต์ได้อีก ... แก้ไขบันทึกบางส่วน: D
Conor O'Brien

ตลกที่คุณเรียกมันว่าม้วนฉันเรียกมันว่าใต้ หวังว่าจะได้รับมันใน APL เร็ว ๆ นี้
Adám

@ Adám Haha จริงๆแล้วมันถูกเรียกว่าภายใต้ ฉันได้คำศัพท์สับสน
Conor O'Brien


2

Japt , 19 16 10 9 7 ไบต์

k ®w3Ã×

ลองออนไลน์!

คำอธิบาย

 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

ฮ่า ๆ ๆ JS นั้นผูกติดอยู่กับ Japt สัญญาณที่แน่นอนว่ามีทางออกที่สั้นกว่ามาก ;-)
ETHproductions

คำแนะนำ: ×เป็นทางลัดสำหรับr@X*Y}1(หรือเพียงr*1) ซึ่งอาจมีประโยชน์ นอกจากนี้ยังมีซึ่งเป็นXwY Math.max(X,Y)
ETHproductions

ขอบคุณแม้ว่าการแก้ปัญหาแบบเรียกซ้ำจริงๆนั้นสั้นที่สุด
ลุ

ทำได้ดีนี่! ฉันคิดว่าคุณสามารถทำได้k m_w3Ã×เพื่อบันทึกไบต์ นอกจากนี้ยังสามารถลงไปm_ ®
Oliver



2

Hexagony , 28 27 26 ไบต์

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

ลองออนไลน์!

ออก:

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

สิ่งนี้จะทำงานโดยทั่วไป:

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

ณ จุดนี้เป็นการออกกำลังกายเกี่ยวกับวิธีทรมานฉันจะได้รับเส้นทางลูปเพื่อลดไบต์


ฉันไม่คิดอย่างนั้น
หรอก

1
@ManfredRadlwimmer ไม่ต้องกังวลการเขียนโค้ดใน Hexagony คือความสำเร็จในตัวเอง
Jo King



1

R, 42 ไบต์

จำนวนไบต์ที่ถูกต้องเท่านั้นในคำตอบ

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

ค่อนข้างตรงไปตรงมาใช้gmpแพ็คเกจเพื่อแยกตัวประกอบxแทนที่ 2s ด้วย 3s แล้วส่งคืนผลิตภัณฑ์


1

Befunge-93 , 20 bytes

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

ลองออนไลน์!

& - 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 ไบต์

{1.5**.lsb*$_}

lsbส่งคืนตำแหน่งบิตที่มีนัยสำคัญน้อยที่สุดนับจากทางขวา นั่นคือจำนวนศูนย์ต่อท้ายในการแสดงเลขฐานสองซึ่งเท่ากับจำนวนของปัจจัย 2 ดังนั้นยก 3/2 ให้ได้พลังนั้นและเราก็เสร็จแล้ว

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.