Odwrotna hipoteza Collatza

13

Myślę, że hipoteza Collatza jest już dobrze znana. Ale co, jeśli odwrócimy zasady?

Zacznij od liczby całkowitej n> = 1.

Powtórz następujące kroki:

Jeśli n jest parzyste , pomnóż go przez 3 i dodaj 1.

Jeśli n jest nieparzyste , odejmij 1 i podziel ją przez 2.

Zatrzymaj się, gdy osiągnie 0

Wydrukuj iterowane liczby.

Przypadki testowe:

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

Zasady:

  • Ta sekwencja nie działa dla wielu liczb, ponieważ wchodzi w nieskończoną pętlę. Nie musisz zajmować się tymi sprawami. Wystarczy wydrukować powyższe przypadki testowe.

  • Zasugerowałem, aby odjąć 1 i podzielić przez dwa, aby podać prawidłową liczbę całkowitą, aby kontynuować, ale nie jest konieczne obliczanie w ten sposób. Możesz podzielić przez 2 i rzutować na liczbę całkowitą lub dowolną inną metodę, która da oczekiwany wynik.

  • Musisz również wydrukować początkowe dane wejściowe.

  • Dane wyjściowe nie muszą być sformatowane jako przypadki testowe. To była tylko sugestia. Jednak kolejność iterowana musi być przestrzegana.

  • Najmniejszy kod wygrywa.

Eduardo Hoefel
źródło
9
Ponieważ jest to twoje trzecie pytanie w ciągu tylu godzin, radzę zajrzeć do piaskownicy , miejsca, w którym zwykle publikujemy projekty pytań w celu uzyskania opinii i upewnienia się, że nie są duplikatami.
caird coinheringaahing
Dziękuję @cairdcoinheringaahing. Nie wiedziałem o tej stronie.
Eduardo Hoefel,
Czy musimy wydrukować 0na końcu?
flawr
2
Być może zechcesz rozszerzyć dwa ostatnie przypadki testowe, ponieważ nie są one zbyt długie
Jo King,
3
@JoKing Skompresowałem go, ponieważ powtarza wyjście z innych linii. W punkcie, w którym osiągniesz 3 , ma on taką samą moc wyjściową, jak na początku. To samo dotyczy 10 lub dowolnego innego numeru.
Eduardo Hoefel,

Odpowiedzi:

5

Perl 6 , 30 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który zwraca sekwencję.

Wyjaśnienie:

{$_,{$_%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
Jo King
źródło
2

Python 2, 54 52 44 bajty

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

-2 bajty dzięki Mr. Xcoder

Z pewnością musi być szybszy sposób. Dziwne, że kiedy próbowałem lambda, było tak samo. Prawdopodobnie mam halucynacje.

Wypróbuj online!

Quintec
źródło
-2 bajty
Mr. Xcoder,
@ Mr.Xcoder Ah, dzięki.
Quintec,
1
50 bajtów
Jo King
Chociaż 0jest to teraz opcjonalne, więc krócej jest pozbyć się drugiegoprint
Jo King
Rzeczywiście, teraz możesz to zrobić w 44
Mr. Xcoder,
2

Haskell , 76 69 61 56 bajtów

Wydaje mi się, że to za długo. Tutaj lpowstaje nieskończona lista sekwencji odwrotnej-collatz, a anonimowa funkcja w pierwszym wierszu po prostu odcina ją we właściwym miejscu.

Dzięki za -5 bajtów @ ØrjanJohansen!

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

Wypróbuj online!

wada
źródło
Nie ma liczb ujemnych, więc (>0)powinno wystarczyć. Jest też oddfunkcja.
Ørjan Johansen
@ ØrjanJohansen Wielkie dzięki!
flawr
2

05AB1E , 15 14 bajtów

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

-1 bajt dzięki @MagicOctopusUrn .

Wypróbuj online.

Wyjaśnienie:

[             # 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
Kevin Cruijssen
źródło
[Ð=_#Èi3*>ë<2÷z =zamiast D,.
Magic Octopus Urn
@MagicOctopusUrn Ah, to było całkiem źle zapomnieć .. Dzięki! :)
Kevin Cruijssen
2

JAEL , 18 bajtów

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

Wypróbuj online!

Eduardo Hoefel
źródło
1
Twój link bezpośredni nie działa. Program po prostu drukuje dane wejściowe i zatrzymuje się.
Dennis,
Tak, masz rację. Poproszę „ich” o
pobranie
Dodałem JAEL do listy języków golfowych . Daj mi znać, jeśli popełniłem błąd :-)
ETHproductions
@ETHproductions Dziękuję bardzo: DI Myślę, że mogę powiedzieć, że specjalnością jest pakiet narzędzi, który pomaga programiście skompresować kod, ale to tylko ja próbuję go sprzedać.
Eduardo Hoefel,
1

JavaScript (ES6), 31 bajtów

f=n=>n&&n+' '+f(n&1?n>>1:n*3+1)

Wypróbuj online!

Lub 30 bajtów w odwrotnej kolejności.

Arnauld
źródło
1

Wolfram Language (Mathematica) , 35 bajtów

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

Wypróbuj online!

0<Echo@# && ...&to ocena zwarcia: drukuje wejście #, sprawdza, czy jest ono dodatnie, a jeśli tak, ocenia .... W tym przypadku ...jest #0[3#+1-(5#+3)/2#~Mod~2]; ponieważ #0(szczelina zerowa) jest samą funkcją, jest to wywołanie rekurencyjne 3#+1-(5#+3)/2#~Mod~2, które upraszcza, 3#+1kiedy #jest parzysta, a (#-1)/2kiedy #jest nieparzysta.

Misza Ławrow
źródło
1

PowerShell, 53 52 bajty

param($i)for(;$i){$i;$i=(($i*3+1),($i-shr1))[$i%2]}0

Wypróbuj online!

Edycja:
-1 bajt dzięki @mazzy

J. Bergmann
źródło
możesz spróbować for(;$i)zamiast tegowhile($i)
mazzy
1

Emojicode 0,5 , 141 bajtów

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

Wypróbuj online!

🐖🎅🏿🍇
🍮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
🍉🍉
X1M4L
źródło
1

MathGolf , 12 bajtów

{o_¥¿½É3*)}∟

Wypróbuj online!

Wyjaśnienie

{             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
maxb
źródło
Dodałem MathGolf do listy golfistów - możesz mnie poprawić, jeśli coś mi się nie
uda
Dzięki za dodanie! Wszystko wygląda mi dobrze.
maks.
1

kod maszynowy x86, 39 bajtów

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 

Zestaw (składnia NASM):

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 '

Wypróbuj online!

Logern
źródło
1

R , 66 61 bajtów

-5 bajtów dzięki Robertowi S. w konsolidacji ifelse ifi usuwaniu nawiasów, a x! = 0 do x> 0

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

zamiast

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

Wypróbuj online!

Sumner18
źródło
1
61 bajtów
Robert S.
0

perl -Minteger -nlE, 39 bajtów

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

źródło
0

Dodaj ++ , 38 35 33 bajtów

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

Wypróbuj online!

Jak to działa

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

Cairney Coheringaahing
źródło
Żeby zrozumieć: czy linia podziału jest częścią kodu? A może to tylko dla lepszego wyjaśnienia? Naprawdę nie znam tego języka.
Eduardo Hoefel,
@EduardoHoefel Break line?
caird coinheringaahing
@cairdcoinheringaahing Prawdopodobnie znaki nowej linii.
Lynn
0

Retina 0.8.2 , 46 bajtów

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

Wypróbuj online! Wyjaśnienie:

.+
$*

Konwertuj na unary.

{

Powtarzaj, aż wartość przestanie się zmieniać.

*M`1

Wydrukuj wartość dziesiętną.

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

Jeśli jest równy, pomnóż przez 6 i dodaj 3.

1(.*)\1
$1

Odejmij 1 i podziel przez 2.

Końcowy znak nowej linii można pominąć, dodając znak ;przed {.

Neil
źródło
0

Rakieta , 75 bajtów

(define(f n)(cons n(if(= n 0)'()(if(odd? n)(f(/(- n 1)2))(f(+(* 3 n)1))))))

Wypróbuj online!

Odpowiednik rozwiązania Common Lisp firmy JRowan.

Galen Iwanow
źródło
0

C # (.NET Core) , 62 bajty

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

Wypróbuj online!

Nie golfowany:

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)
}
Surykatka
źródło