Ters Collatz Konjonktürü


13

Bence Collatz Konjonktürü zaten çok iyi biliniyor. Ama kuralları tersine çevirirsek ne olur?

N> = 1 tamsayısıyla başlayın.

Aşağıdaki adımları tekrarlayın:

N ise bile , çarpma bunu 3 ile ve 1 ekleyin.

N garip ise , 1 çıkarın ve 2'ye bölün.

0'a ulaştığında dur

Yinelenen sayıları yazdırın.

Test senaryoları:

 1        => 1, 0
 2        => 2, 7, 3, 1, 0
 3        => 3, 1, 0
10        => 10, 31, 15, 7, 3...
14        => 14, 43, 21, 10, ...

Kurallar:

  • Bu dizi, sonsuz bir döngüye girdiğinden çok sayıda sayı için çalışmaz. Bu davaları ele almanıza gerek yok. Sadece yukarıdaki test senaryolarını yazdırmak yeterlidir.

  • Devam etmek için geçerli bir tamsayı vermek için 1'in çıkarılmasını ve ikiye bölünmesini önerdim, ancak bu şekilde hesaplanması gerekmez. 2'ye bölebilir ve tamsayıya veya beklenen çıktıyı verecek diğer yöntemlere atabilirsiniz.

  • İlk girişi de yazdırmanız gerekir.

  • Çıktının test senaryoları olarak biçimlendirilmesi gerekmez. Bu sadece bir öneriydi. Ancak, yinelenen düzene uyulmalıdır.

  • En küçük kod kazanır.


9
Bu, birkaç saat içinde üçüncü sorunuz olduğu için , genellikle geri bildirim için soru taslakları gönderdiğimiz ve kopya olmadıklarından emin olmak için Sandbox'a göz atmanızı tavsiye ederim .
Caird Coinheringaahing

Teşekkürler @cairdcoinheringaahing. Bu sayfayı bilmiyordum.
Eduardo Hoefel

0Sonunda yazdırmak zorunda mıyız ?
flawr

2
Çok uzun olmadıkları için son iki test vakasını genişletmek isteyebilirsiniz
Jo King

3
@JoKing Sıkıştırdım çünkü diğer satırlardaki çıktıları tekrarlıyor. 3'e ulaştığınız noktada , ondan başladığınızda aynı çıktıya sahiptir. Aynı şey 10 veya başka herhangi bir sayı için de geçerlidir.
Eduardo Hoefel

Yanıtlar:


5

Perl 6 , 30 bayt

{$_,{$_%2??$_+>1!!$_*3+1}...0}

Çevrimiçi deneyin!

Bir sıra döndüren anonim kod bloğu.

Açıklama:

{$_,{$_%2??$_+>1!!$_*3+1}...0}
{                            }   # Anonymous code block
   ,                     ...     # Define a sequence
 $_                              # That starts with the given value
    {                   }        # With each element being
     $_%2??     !!               # Is the previous element odd?
           $_+>1                 # Return the previous element bitshifted right by 1
                  $_*3+1         # Else the previous element multiplied by 3 plus 1
                            0    # Until the element is 0




2

Python 2, 54 52 44 bayt

n=input()
while n:print n;n=(n*3+1,n/2)[n%2]

Bay Xcoder sayesinde -2 bayt

Kesinlikle daha hızlı bir yol olmalı. Tuhaf bir şekilde, bir lambda denediğimde aynı bayt sayıldı. Muhtemelen halüsinasyon görüyorum.

Çevrimiçi deneyin!



@ Mr.Xcoder Ah, teşekkürler.
Quintec


0Şimdi isteğe bağlı olmasına rağmen, ikinci kurtulmak için daha kısaprint
Jo King

Gerçekten, şimdi 44'te yapabilirsiniz
Bay Xcoder

2

Haskell , 76 69 61 56 bayt

Bunun çok uzun olduğunu hissediyorum. Burada lters-collatz dizisinin sonsuz bir listesini üretir ve ilk satırdaki anonim işlev onu doğru yerde keser.

-5 bytes @ ØrjanJohansen için teşekkürler!

fst.span(>0).l
l r=r:[last$3*k+1:[div k 2|odd k]|k<-l r]

Çevrimiçi deneyin!


Negatif sayılar yoktur, bu yüzden (>0)yeterli olmalıdır. Ayrıca bir oddişlevi var.
Ørjan Johansen

@ ØrjanJohansen Çok teşekkürler!
Kusur


2

05AB1E , 15 14 bayt

[Ð=_#Èi3*>ë<2÷

@MagicOctopusUrn sayesinde -1 bayt .

Çevrimiçi deneyin.

Açıklama:

[             # Start an infinite loop
 Ð            #  Duplicate the top value on the stack three times
              #  (Which will be the (implicit) input in the first iteration)
  =           #  Output it with trailing newline (without popping the value)
   _#         #  If it's exactly 0: stop the infinite loop
     Èi       #  If it's even:
       3*     #   Multiply by 3
         >    #   And add 1
      ë       #  Else:
       <      #   Subtract 1
        2÷    #   And integer-divide by 2

[Ð=_#Èi3*>ë<2÷ile =yerine D,.
Sihirli Ahtapot Urn

@MagicOctopusUrn Ah, bunu unutmak oldukça kötüydü .. Teşekkürler! :)
Kevin Cruijssen

2

JAEL , 18 bayt

![ؼw>î?èÛ|õÀ

Çevrimiçi deneyin!


1
Kalıcı bağlantınız çalışmıyor gibi görünüyor. Program sadece girişi yazdırır ve durur.
Dennis

Evet haklısın. "Onlardan" en son sürümü çekmelerini isteyeceğim: P
Eduardo Hoefel

JAEL'i golf dilleri listesine ekledim . Herhangi bir bilgi yanlış varsa lütfen bana bildirin :-)
ETHproductions

@ETHproductions Çok teşekkür ederim: DI uzmanlık programcı kodu sıkıştırmak için yardımcı programı olduğunu söyleyebiliriz düşünüyorum, ama bu sadece ben onu mal çalışıyor.
Eduardo Hoefel



1

Wolfram Dili (Mathematica) , 35 bayt

0<Echo@#&&#0[3#+1-(5#+3)/2#~Mod~2]&

Çevrimiçi deneyin!

0<Echo@# && ...&kısa devre değerlendirmesidir: girişi yazdırır, #pozitif olup olmadığını kontrol eder ve varsa değerlendirir .... Bu durumda, ...bir #0[3#+1-(5#+3)/2#~Mod~2]; çünkü #0(sıfırıncı yuvası) işlevi kendisidir, bu konuda bir özyinelemeli çağrısıdır 3#+1-(5#+3)/2#~Mod~2, için basitleştirir 3#+1zaman #bile, ve (#-1)/2ne zaman #garip.




1

Emojicode 0.5 , 141 bayt

🐖🎅🏿🍇🍮a🐕😀🔡a 10🔁▶️a 0🍇🍊😛🚮a 2 1🍇🍮a➗a 2🍉🍓🍇🍮a➕✖️a 3 1🍉😀🔡a 10🍉🍉

Çevrimiçi deneyin!

🐖🎅🏿🍇
🍮a🐕      👴 input integer variable 'a'
😀🔡a 10      👴 print input int
🔁▶️a 0🍇      👴 loop while number isn’t 0
🍊😛🚮a 2 1🍇     👴 if number is odd
🍮a➗a 2       👴 divide number by 2
🍉
🍓🍇      👴 else
🍮a➕✖️a 3 1   👴 multiply by 3 and add 1
🍉
😀🔡a 10     👴 print iteration
🍉🍉


1

MathGolf , 12 bayt

{o_¥¿½É3*)}∟

Çevrimiçi deneyin!

açıklama

{             Start block of arbitrary length
 o            Output the number
  _           Duplicate
   ¥          Modulo 2
    ¿         If-else with the next two blocks. Implicit blocks consist of 1 operator
     ½        Halve the number to integer (effectively subtracting 1 before)
      É       Start block of 3 bytes
       3*)    Multiply by 3 and add 1
          }∟  End block and make it do-while-true

MathGolf'u golf fenerleri listesine ekledim
çekinmeyin

Eklediğiniz için teşekkürler! Her şey bana doğru görünüyor.
maxb

1

x86 makine kodu, 39 bayt

00000000: 9150 6800 0000 00e8 fcff ffff 5958 a901  .Ph.........YX..
00000010: 0000 0074 04d1 e8eb 066a 035a f7e2 4009  ...t.....j.Z..@.
00000020: c075 dec3 2564 20                        .u..%d 

Montaj (NASM sözdizimi):

section .text
	global func
	extern printf
func:					;the function uses fastcall conventions
	xchg eax, ecx			;load function arg into eax
	loop:
		push eax
		push fmt
		call printf	;print eax
		pop ecx
		pop eax
		test eax, 1	;if even zf=1
		jz even		;if eax is even jmp to even
		odd:		;eax=eax/2
			shr eax, 1
			jmp skip
		even:		;eax=eax*3+1
			push 3
			pop edx
			mul edx
			inc eax
		skip:
		or eax, eax
		jne loop	;if eax!=0, keep looping
	ret			;return eax
section .data
	fmt db '%d '

Çevrimiçi deneyin!


1

R , 66 61 bayt

Ifelse ifparantez içine ve kaldırma konsolide Robert S. sayesinde -5 bayt ve x! = 0 to x> 0

print(x<-scan());while(x>0)print(x<-`if`(x%%2,(x-1)/2,x*3+1))

onun yerine

print(x<-scan());while(x!=0){print(x<-ifelse(x%%2,(x-1)/2,x*3+1))}

Çevrimiçi deneyin!



0

perl -Minteger -nlE, 39 bayt

{say;$_=$_%2?$_/2:3*$_+1 and redo}say 0

0

++ , 38 35 33 bayt ekle

D,f,@:,d3*1+$2/iA2%D
+?
O
Wx,$f>x

Çevrimiçi deneyin!

Nasıl çalışır

f(x)x

f(x)={xis even,3x+1xis odd,x2

f(x)S=[x]

dS=[x,x]3x+13*1+x2S=[3x+1,x2]

xSxx%2a%babS=[3x+1,x2,(x%2)]D(x%2)03x+1x2

f(x)xx

+?x+?xxxx0$f>xf(x)xx


Sadece anlamak için: Kesme çizgisi kodun bir parçası mı? Yoksa sadece daha iyi bir açıklama için mi? Bu dili gerçekten bilmiyorum.
Eduardo Hoefel

@EduardoHoefel Kesme çizgisi?
Caird Coinheringaahing

@cairdcoinheringaahing Muhtemelen yeni satır karakterleri.
Lynn

0

Retina 0.8.2 , 46 bayt

.+
$*
{*M`1
^(..)+$
$&$&$&$&$&$&111
1(.*)\1
$1

Çevrimiçi deneyin! Açıklama:

.+
$*

Tekli'ye dönüştür.

{

Değer değişmeyi bırakana kadar tekrarlayın.

*M`1

Değeri ondalık olarak yazdırın.

^(..)+$
$&$&$&$&$&$&111

Eşitse, 6 ile çarpın ve 3 ekleyin.

1(.*)\1
$1

1 çıkarın ve 2'ye bölün.

Sondaki satırsonu ;önce a eklenerek bastırılabilir {.




0

C # (.NET Core) , 62 bayt

a=>{for(;a>0;a=a%2<1?a*3+1:a/2)Console.Write(a+" ");return a;}

Çevrimiçi deneyin!

Ungolfed:

a => {
    for(; a > 0;                // until a equals 0
        a = a % 2 < 1 ?             // set a depending on if a is odd or even
                a * 3 + 1 :             // even
                a / 2                   // odd (minus one unnecessary because of int casting)
    )
        Console.Write(a + " "); // writes the current a to the console
    return a;                   // writes a to the console (always 0)
}


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.