Зворотна кольцева конституція


13

Я думаю, що Колац Концектура вже добре відома. Але що робити, якщо ми перевернули правила?

Почніть з цілого числа n> = 1.

Повторіть наступні дії:

Якщо n парне , помножте його на 3 і додайте 1.

Якщо n непарне , віднімаємо 1 і ділимо його на 2.

Зупиніться, коли вона досягне 0

Роздрукуйте повторені числа.

Тестові приклади:

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

Правила:

  • Ця послідовність не працює для багатьох чисел, тому що вона входить у нескінченний цикл. Вам не потрібно займатися цими справами. Досить лише роздрукувати тестові приклади вище.

  • Я запропонував відняти 1 і розділити на два, щоб дати дійсне ціле число для продовження, але обчислювати його не потрібно. Ви можете розділити на 2 і передати цілому чи будь-яким іншим методам, які дадуть очікуваний результат.

  • Вам також потрібно роздрукувати початковий ввід.

  • Вихід не потрібно форматувати як тестові випадки. Це була лише пропозиція. Однак ітераційний порядок повинен дотримуватися.

  • Виграє найменший код.


9
Оскільки це ваше третє питання за стільки годин, я рекомендую вам ознайомитись з пісочницею , місцем, де ми зазвичай розміщуємо чернетки запитань для зворотного зв’язку, і переконатися, що вони не є дублікатами.
caird coinheringaahing

Дякую @cairdcoinheringaahing. Я не знав про цю сторінку.
Едуардо Гоефель

Чи потрібно друкувати 0наприкінці?
flawr

2
Можливо, ви захочете розширити останні два тестові справи, оскільки вони не такі довгі
Джо Кінг

3
@JoKing Я стиснув його, тому що він повторює вихід з інших рядків. У точці, до якої ви досягнете 3 , вона має такий же вихід, як і при запуску з неї. Те саме стосується 10 або будь-якого іншого числа.
Едуардо Гоефель

Відповіді:


5

Perl 6 , 30 байт

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

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

Блок анонімного коду, який повертає послідовність.

Пояснення:

{$_,{$_%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 байт

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

-2 байти завдяки панові Xcoder

Звичайно, має бути швидший шлях. Як не дивно, коли я спробував лямбда, це був той самий рахунок. Я, мабуть, галюциную.

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



@ Mr.Xcoder Ах, спасибі
Квінтек


Хоча 0це зараз необов’язково, тому позбутися другого коротшеprint
Jo King

Дійсно, тепер ви можете це зробити в 44
Містер Xcoder

2

Haskell , 76 69 61 56 байт

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

Дякую за -5 байт @ ØrjanJohansen!

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

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


Від’ємних цифр немає, тому (>0)має бути достатньо. Також є oddфункція.
Ørjan Johansen

@ ØrjanJohansen Дякую велике!
flawr


2

05AB1E , 15 14 байт

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

-1 байт завдяки @MagicOctopusUrn .

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

Пояснення:

[             # 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÷з =замість D,.
Чарівний восьминіг Урна

@MagicOctopusUrn Ах, це було дуже погано забути .. Дякую! :)
Кевін Кройсейсен

2

JAEL , 18 байт

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

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


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

Так, ви праві. Я попрошу "їх" витягнути останню версію: Р
Едуардо Хоефель

Я додав JAEL до списку мов для гольфу . Будь ласка, повідомте мене, якщо я неправильно отримав інформацію :-)
ETHproductions

@ETHproductions Дуже дякую: DI думаю, що я можу сказати, що спеціальність - це утилітний пакет, який допомагає програмісту стиснути код, але це я просто намагаюся продати його.
Едуардо Гоефель



1

Мова Вольфрама (Mathematica) , 35 байт

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

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

0<Echo@# && ...&це коротке замикання: воно друкує вхід #, перевіряє, чи є воно позитивним, а якщо так, то оцінює .... У цьому випадку ...є #0[3#+1-(5#+3)/2#~Mod~2]; оскільки #0(нульовий слот) є самою функцією, це рекурсивний виклик 3#+1-(5#+3)/2#~Mod~2, який спрощує, 3#+1коли #парне, а (#-1)/2коли #непарне.




1

Emojicode 0,5 , 141 байт

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

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

🐖🎅🏿🍇
🍮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 байт

{o_¥¿½É3*)}∟

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

Пояснення

{             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 до списку гольф-гольфу --безкоштовно виправляйте мене, якщо я щось помилився :-)
ETHproductions

Дякуємо, що додали його! На мене все виглядає правильно.
maxb

1

машинний код x86, 39 байт

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 

Збірка (синтаксис 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 '

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



0

perl -Minteger -nlE, 39 байт

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

0

Додати ++ , 38 35 33 байт

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

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

Як це працює

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


Просто, щоб зрозуміти: чи є частина перериву частиною коду? Або просто для кращого пояснення? Я справді не знаю цієї мови.
Едуардо Гоефель

@EduardoHoefel лінія перерви?
caird coinheringaahing

@cairdcoinheringaahing Нові символи рядка, імовірно.
Лінн

0

Сітківка 0,8,2 , 46 байт

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

Спробуйте в Інтернеті! Пояснення:

.+
$*

Перетворити в одинарне.

{

Повторюйте, поки значення перестане змінюватися.

*M`1

Роздрукуйте значення у десятковій частині.

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

Якщо це парне число, помножте на 6 і додайте 3.

1(.*)\1
$1

Віднімаємо 1 і ділимо на 2.

Зворотний новий рядок можна придушити, додавши a ;до {.




0

C # (.NET Core) , 62 байти

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

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

Безголівки:

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)
}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.