Дев'ятна картина


9

Вступ

Я наткнувся на цю (марну) картину днями, поки дивився телевізор. Я назвав його "9 візерунком", тому що перший номер, який використовував його, був 9. Суть його полягає в тому, що ви вводите число (скажімо, x ), а потім повертаєтесь назад:

  • х
  • x + ( x / 3) [назвемо це y ]
  • дві третини y [назвемо це z ]
  • z + 1

Отже, якби я помістив всередині цього шаблону число 9 як х , це вийшло б:

  • 9 ( 9 )
  • 12 ( 9 + 9/3 ) [9 понад 3 - це 3, а 9 + 3 - 12]
  • 8 ( 12 разів дві третини) [третина з 12 - 4, а 4 * 2 - 8]
  • 9 ( 8 + 1 - 9)

Виклик

Напишіть мені функцію (будь-якою мовою програмування), яка приймає число, і виводить цілий масив, використовуючи шаблон.
Приблизно такий псуедо-код:

function ninePattern(int myInt) returns IntegerArray {  
    int iterationA = myInt + (myInt / 3);  
    int iterationB = iterationA * (2 / 3); 
    int iterationC = iterationB + 1;  
    IntegerArray x = [myInt, iterationA, iterationB, iterationC];  
    return x;  
}

Роз'яснення

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

"краще рахувати в байтах, ніж символів"

Я вибирав персонажів, бо (як мінімум, мені було б простіше судити. Звичайно, я не можу це змінити зараз. (багато відповідей уже розміщено)

"округлення"

Закруглення слідує за цією римою:

Якщо 5 або більше, піднесіть бал
Якщо це 4 або менше, нехай відпочиває

Простіше кажучи, якщо це щось на зразок 4,7 або 3,85, округляйте їх до 5 і 4 відповідно.

Приклади

Input => Result
9 => [9, 12, 8, 9]
8 => [8, 11, 7, 8]
6 => [6, 8, 5, 6]
23 => [23, 31, 21, 22]
159 => [159, 212, 141, 142]

Якщо, однак, цифри на зразок 2.3 або 10.435446, округляйте їх до 2 та 10 відповідно.

"підтримка мови"

Ви не можете використовувати функції та / або масиви ЯКЩО ТА ТІЛЬКИ, ЯКЩО обрана вами мова не підтримує їх. Якщо це станеться (навіть якщо це збільшить кількість ваших персонажів), ви повинні їх використовувати .


1
Повинно бути результатом масиву, чи чисельності самі по собі є достатніми (як відповідь Pyth)?
Девід

2
Ви можете обмежитися лише повноцінними програмами або просто функціями, але є дискусія щодо мета за замовчуванням, яка дає корисну основу на випадок, якщо це вплине на ваше рішення щодо майбутніх проблем. За замовчуванням виклики приймайте обидва, щоб дозволити більше мов змагатися.
трихоплакс

1
Існують і типові параметри для введення та виводу . Знову ж таки, вам не доведеться слідувати за ними, це просто для того, щоб ви знали.
трихоплакс

3
-1 для довільних вимог до масиву та функцій, що запобігає конкуренції мовам без типу масиву / списку або функцій.
Мего

4
Крім того, ви повинні оцінювати учасників в байтах, а не в символах. У нас є пісочниця , де ви можете отримувати відгуки про свою публікацію, перш ніж вона з’явиться в прямому ефірі.
Loovjo

Відповіді:


11

MarioLANG, 659 621 591 582 556 543 516 458 418 401 352 308 369 байт

округлення досить дороге: /

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

;>>[![( [( [( [( [( [<(([!)))!+(((-<>( >((+
:"==#================"===#== #=====""[ "==
)(  -[!)>>[![)  [)[<(!>)[<)) >))) [!!-[!((
 (  )"#="==#======="=#==="=<="=====##==#==<
 +  +>) )-+<>+)[!)+! +))![-[)>[ [([-[![<<:
 +  )-+ )(=""===#==#  ==#===)"=======#=====
 +  >!>)!>  !(- < !:+:))<  ))!((++)))< 
 )  "#"=#===#===" ======" ===#======="
 !
=#========================

Ну це було веселіше, ніж очікувалося, це, мабуть, не оптимально, але я здогадуюсь, що я туди потрапляю.

Час пояснення:

(для версії 352 байти)

спочатку дістаємо аргумент і друкуємо його:

;
:

досить простий

Потім ми переходимо до основної частини програми: введення поділу / 3

;>>[![              [( [( [<result
:"==#======================"======
)   -[!)>>[![        [<((((!   
)   )"#="==#=========="====#
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

що є дещо зміненою конверсією відділу головного мозку

[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]

які беруть для введення

n 0 d 0 0 

і поверне тобі

0 n d-n%d n%d n/d 

Як тільки ми ділимо поділ, ми використовуємо його, щоб отримати суму n і n / d та роздрукувати її

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

Потім нам потрібно зробити ще один поділ: (2 * (n + n / d)) / 3

тому ми отримуємо (2 * (n + n / d)

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))! 2*2n/d>[   -[![  <
+(  )-+ )  -"====#====# ======"======#====
+   >!>)!  >! -  <            !((++))<
    "#"=#  "#===="            #======"
 !
=#

і поставити його з 3 назад у відділ

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!      )>[   -[![  <
+(  )-+ )  -"====#====#      )"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

в цей момент все вибухає, Маріо застряє в нескінченному циклі, роблячи поділ на більшу і більшу кількість, назавжди.

і щоб встановити, що нам потрібен спосіб розмежувати перший і другий поділ, це врешті-решт, о, радість, у нас є спосіб

;>>[![              [( [( [<([!)!+(((-<
:"==#======================"==#)#====="
)   -[!)>>[![        [<((((!))< >))) [!(((
)   )"#="==#=========="====#)="="=====#==:
+(  +>) )  +>(+)[!)+))!!:+:)))>[   -[![  <
+(  )-+ )  -"====#====#======)"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

в основному ми дивимось, якщо х в

x 0 n d-n%d n%d n/d 

дорівнює 0, якщо це означає, що ми перебуваємо на першому поділі

інакше ми перебуваємо на другому поділі, і ми просто роздруковуємо результат ділення, додаємо 1, а потім знову друкуємо

і вуаля легко як пиріг.


Ласкаво просимо до PPCG!
Ерік Аутгольфер

Не закручується до специфікацій, наданих цим запитанням (звичайно, я оновив його після того, як ви опублікували свою відповідь, але вам слід принаймні оновити свою відповідь, щоб відповідати новим специфікаціям)
InitializeSahib

Зроблено. в той час як ми говоримо про тестовий випадок, ви повинні додати 10, щоб мати число, яке ви округлили під час операції кулаком.
Ефірна жаба

9

Emotinomicon 99 байт, 33 символи

😷😭,😲🆙🆙😼🆙😨😎⏬😎🆙😍➗➕🆙😨😎⏬😎😉✖😍➗🆙😨😎⏬😎😅➕😨

Пояснення:

😷                                 clear output
 😭                                begin quote string
  ,                               
   😲                              end quote string
    🆙                             duplicate top of stack
     🆙                            duplicate top of stack
      😼                           take numeric input
       🆙                          duplicate top of stack
        😨                         pop N and output as a number
         😎                        reverse stack
          ⏬                       pops and outputs top of stack as character
           😎                      reverse stack
            🆙                     duplicate top of stack
             😍                    push 3 to the stack
              ➗                   divide top two elements on stack
               ➕                  add top two elements on stack
                🆙                 duplicate top of stack
                 😨                pop N and output as a number
                  😎               reverse stack
                   ⏬              pops and outputs top of stack as character
                    😎             reverse stack
                     😉            push 2 to the stack
                      ✖           multiply top two elements on stack
                       😍          push 3 to the stack
                        ➗         divide top two elements on stack
                         🆙        duplicate top of stack
                          😨       pop N and output as a number
                           😎      reverse stack
                            ⏬     pops and outputs top of stack as character
                             😎    reverse stack
                              😅   push 1 to the stack
                               ➕  add top two elements on stack
                                😨 pop N and output as a number

3
Так, для нетрадиційних мов! : P
user48538

4

MATL, 14 байт

Xot4*3/tE3/tQv

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

Досить простий, vоб'єднує стек у масив. Xoперетворюється на цілий тип даних, і всі операції після цього є цілими операціями.


3
Специфікація полягає у поверненні масиву, а не лише в кінцевому результаті.
Значення чорнила

3
Також знайомтесь із тими, хто позначив їх на видалення через <2 хвилини: D
Девід

@David D: Я не думаю, що я можу відкликати голоси про видалення
Downgoat

@David підтримав вашу відповідь як моє співчуття :)
InitializeSahib

1
Я майже впевнений, що це теж не функція, виправте мене, якщо я помиляюся.
Мальтісен

4

Чеддар , 27 байт

b=8/9*$0
[$0,$0+$0/3,b,b+1]

$0є змінною з введенням. Cheddar просто не є зграбною мовою ¯ \ _ (ツ) _ / ¯, також це є неконкурентоспроможним, оскільки функція введення Cheddar була створена після цього виклику.

Безголівки:

IterationB := 8 / 9 * $0  // 8/9ths of the Input
[ $0,                     // The input
  $0 + $0 / 3,            // Input + (Input/3)
  IterationB,             // (see above)
  IterationB + 1          // above + 1
]

1
Сльози радості! Це зайшло так далеко! : D
Conor O'Brien

3

Ява, 86 82 84 85 символів

class c{int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}}

Буква, dрозміщена відразу після цілого числа, робить ціле число a double.

Безголівки:

class c{
    int[] i(int I) {
        int a = I + (I / 3),
            b = (int)(a * (2d / 3d));
        return new int[]{I, a, b, b + 1};
    }
}

Без класу ( class c{}становить 8 символів), він зменшується до 76 символів:

int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}

Більш точна версія в 110 символів (118 з перерахунком) - вона використовує floats, тому що для кастингу ніхто не має місця Math#round(double):

int[]i(int I){float a=I+(I/3f),b=(a*(2f/3f));return new int[]{I,Math.round(a),Math.round(b),Math.round(b+1)};}

Я думаю, що я повинен навчитися Pyth.
користувач8397947

5
+1, тому що ви знаєте, java
Джеймс

1
@dorukayhan Дивно, я, здається, отримую помилку, коли я намагаюся запустити це в Eclipse, він не може перетворити з подвійного в Int. Я побачу, чи зможу я зрозуміти, у чому проблема завтра.
Loovjo

1
Я щойно виправив код
user8397947

1
Я бачу, але це не дає правильних результатів для входів, таких як 8 або 10. Перше додавання не працює належним чином, як I + (I / 3)використовується ціле поділ, тобто фракції відкидаються, і тому результат неправильно округлюється.
Frozn

3

Ява, 56 80 байт

Як зазначали деякі користувачі, це рішення (як і деякі інші у Java) не округляє дані належним чином. Тому зараз я пропоную трохи довше рішення, яке має повернути правильний результат

int[]h(int a){int[]b={a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a};return b;}

або 60 байт версії ламда

a->new int[]{a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a}

Гольф-версія

int[]g(int a){int[]b={a,a+a/3,a*8/9,a*8/9+1};return b;}

і невольф

int[] g(int a) {
        int[] b = { a, a + a / 3, a * 8 / 9, a * 8 / 9 + 1 };
        return b;
    }

або 36 байт, визначених як лямбда

a->new int[]{a,a+a/3,a*8/9,a*8/9+1}


Не має округлення, необхідного Запитанням.
Марв

1
Як зазначав @Marv, це питання не працює коректно, наприклад, для введення 8 очікуваний результат буде [8,11,7,8], але це [8,10,7,8]
Frozn

навіщо знижувати? я виправив це, і він працює коректно зараз?
user902383

Вибачте за протокол після виправлення. Нижній потік заблокований, тому я не можу його видалити, якщо ви не внесете певних змін у свою відповідь (будь-яких
дрібницьких

@ edc65 ок, зроблено
користувач902383

2

Java, 64 байти

int[]f(int i){return new int[]{i,i+=i/3+0.5,i-=i/3-0.5,i+=1.5};}

Примітки

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

Безумовно

int[] f(int i) {
    return new int[]{
            i, 
            i += i / 3 + 0.5, 
            i -= i / 3 - 0.5, 
            i += 1.5};
}

Вихід з i = 9

[9, 12, 8, 9]


Як і в рішенні user902383, це працює не правильно, наприклад, для 8 очікуваних [8,11,7,8], але це [8,10,7,8], для 6 очікуваних [6,8,5,6] але є [6,8,6,7]
Фрозн

3
@Frozn це рішення також не працює належним чином, і для тестових випадків, які ви дали результат, такий же, як і моє старе рішення ideone.com/LVK8FU
user902383

2

Скретч, 33 байти

Сценарій
Запрошує введення, встановлює aвведення округленим, встановлює bта cїх відповідні зміни, потім говорить всі чотири числа, відокремлені комами.


2

Java 8 лямбда, 109 81 79 75 символів

Тому що ... ти знаєш ... навіть Java може бути в гольфі ...

a->{int b=(int)(.5+a*4./3),c=(int)(.5+b*2./3);return new int[]{a,b,c,++c};}

Лямбда невольф на клас:

class C {  
   static int[] a(int a) {
        int b = (int) (.5 + a * 4. / 3),
            c = (int) (.5 + b * 2. / 3);
        return new int[]{a, b, c, ++c};
    }
}

Я припускаю, що мені дозволяється використовувати longs, оскільки вони також є цілим числом. На жаль, потрібно правильно округлити цілі числа, і, таким чином, "короткий" склад не працює. Використовуючи longs, нам не потрібно повертати результати округлення до ints.

Оновлення

Використовуючи приємний маленький + 0,5 і після цього трюк, ми зберігаємо правильне округлення і зберігаємо 2 символи!

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


Ласкаво просимо до PPCG!
Ерік Атголфер

Дякую :) Я деякий час стежив за питаннями тут і зрозумів, що це може бути питання, в якому я міг би брати участь, хоча відповідь довший, ніж я очікував.
Frozn

Я поставлю "+1", сподіваючись, що ви додасте обов'язкове "тому що ... ви знаєте ... Java!"
Олів’є Дулак

@Frozn Я не впевнений, чи можна видалити a->{і остаточне значення }для -5 байт.
Ерік Аутгольфер

@OlivierDulac Ще не :)
Erik the Outgolfer

1

Mathematica - 21 байт

Щойно отримав Mathematica від моїх братів RPi, тож спробував це для розваги, і що краще, ніж виклик PPCG.

{#,4#/3,8#/9,8#/9+1}&

Визначає анонімну функцію. Спробуйте так:

In[26]:= x:={#,4#/3,8#/9,8#/9+1}&                                             

In[27]:= x[9]                                                                 

Out[27]= {9, 12, 8, 9}

Чи дасть це цілі числа в результаті чи дроби?
Девід

Цілі числа @David, якщо результати не є цілісними, в цьому випадку дроби.
Мальтісен


1

Луа, 52 байти

Ця програма приймає число за аргументом командного рядка і повертає відповідний масив. Програми в луа технічно є функціями, оскільки перекладач завжди інкапсулює їх у функції. Це також цей механізм, який використовується, коли ви "викликаєте" коди в інших файлах (в основному він використовує loadfile/ dofile).

m=math.floor x=...z=m(x*8/9)return{x,m(x*4/3),z,z+1}

1

Власне, 21 байт

`;;3@/+;32/*;uk1½+♂≈`

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

Спробуйте в Інтернеті! (додатковий .в кінці оцінює функцію і друкує результат)

Пояснення:

`;;3@/+;32/*;uk1½+♂≈`
 ;;                    make two copies of x
   3@/+                divide by 3, add that to x to get y
       ;32/*           make a copy of y and multiply by 2/3 to get z
            ;u         make a copy of z and add one
              k        push stack as a list
               1½+     add 0.5 to each element
                  ♂≈   apply int() to each element (make integers from floats by flooring; this is equivalent to rounding half-up because of adding 0.5)

1

Mathcad, [tbd] байт

введіть тут опис зображення


Еквівалентність байт кодового гольфу Mathcad ще не встановлена. Якщо вважати число клавіатури приблизним еквівалентом, рішення становить приблизно 40 байт.




1

Javascript, 50 байт

Я конвертую своє Java-рішення в JavaScript і трохи його знежирив.

var r=Math.round,g=a=>[a,r(a+a/3),a=r(a*8/9),++a]

1

C ++ 0x - 95 102 185 189 109 129 символів

int * n(int p){static int a[3];a[0]=p;a[1]=round(p+(p/3));a[2]=round((a[1]/3)*2);a[3]=a[2]+1;return a;}
  • Для цього потрібен заголовок cmath для роботи.

Degolfed

#include <cmath>
int * ninePattern(int p) {
        static int a[3]; // pattern array
        a[0] = p; // sets first iteration
        a[1] = round(p + (p / 3)); // sets second iteration
        a[2] = round((a[1] / 3) * 2); // sets third iteration
        a[3] = a[2] + 1; // sets fourth iteration
        return a; // returns array
}

2
Не будучи експертом C ++, але ви можете скоротити це шляхом повторного використання вже обчислених значень у масиві. Також ви можете видалити пробіл між собою) і {не знаю, наскільки суворий C ++.
Фрозн

Чи є ці останні два правильними в поточній версії? Тому що я щойно бачив, як ти розраховуєш, p+(p/3)*(2/3)що p+(2*p/9)замість цього(p+(p/3))*(2/3)
Фрозн

Виявляється, це була помилка з мого боку. Я ставлю - 1 замість +1 за останню ітерацію: P
InitializeSahib

0

Ерланг, 80 байт

-module(f).
-export([f/1]).
f(X)->Y=X+(X/3),Z=trunc(Y*(2/3)),[X,trunc(Y),Z,Z+1].

Для запуску збережіть як f.erl , компілюйте та викликайте функцію. Він поверне список ints:

fxk8y@fxk8y:/home/fxk8y/Dokumente/erlang/pcg# erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-    threads:10] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> c(f).
{ok,f}
2> f:f(9).
"\t\f\b\t"
3>

Зауважте, що Erlang автоматично перетворює int s в ASCII символи, якщо ви перебуваєте в діапазоні значень ASCII, оскільки Erlang не має типу char . Виклик функції 100 забезпечує кращу читаність [100,133,88,89] .

Безголівки:

-module(f).
-export([f/1]).

f(X) ->
  Y = X+(X/3),
  Z = trunc(Y*(2/3)),
  [X, trunc(Y), Z, Z+1].

0

Ерланг, 46 байт

Відповідь, натхненна @ fxk8y (я не зміг розмістити коментар до його відповіді)

F=fun(X)->Z=round(X*4/9),[X,Z*3,Z*2,Z*2+1]end.

Також ви можете побачити результати за допомогою:

2> io:fwrite("~w~n", [F(9)]).                         
[9,12,8,9]
ok

0

Pyth, 20 байт

m.RdZ[Jc*4Q3Kc*2J3hK

Пояснення:

            (Implicit print)
m           For each d in array, d =
.RdZ        Round d to zero decimal places
[           The array of
  J         The result of setting J to
    c       The float division of
      *4Q   Input * 4
      3     and 3
            ,
  K         The result of setting K to
    c       The float division of
      *2J   J * 2
      3     and 3
            , and
  hK        K + 1.
            (Implicit end array)

Тест тут


0

Джольф, 17 байт

Ώ‘Hγ+H/H3Βώ/γ3hΒ’

Визначає функцію Ώ. Він приймає вкладення неявно, тому він також є повноцінною програмою. Спробуйте тут!


Джолф стає ESMin повільно підтверджується ??? : P
Пуховик

@Upgoat ey це грецька мова. І знову півночі. : P
Conor O'Brien

> _> о. Дуже шкода, якщо я розбудив вас> _> _> _>
Пуховик

@Upgoat ще не спить;)
Conor O'Brien

: | idk, якщо це добре, що я тебе позичив, прокинув тебе, або погано, що ти все ще
буваєш

0

Математика, 51 байт

FoldList[#2@#&,{#,Round[4#/3]&,Round[2#/3]&,#+1&}]&

Анонімна функція, яка відповідає поточній (на момент публікації) версії повідомлення, яка передбачає округлення на кожному кроці.

FoldList- типова операція в програмуванні. Він викликається як FoldList[f, list]і два рази аргументує функцію fнеодноразово до результату (або першого елемента списку в першій ітерації), приймаючи наступний елемент списку як свій другий аргумент.

Ungolfed: #2 @ # &це анонімні функції, які застосовують свій другий аргумент до першого. Тому аргумент списку FoldListскладається з послідовних функцій, які слід застосувати до вводу.

FoldList[#2 @ # &,
  {#, (* note the absence of '&' here, 
         this '#' stands for the argument
         of the complete function and is 
         covered by the & at the end      *)
   Round[4 # / 3] &, (* anonymous function that rounds 4/3 of its input *)
   Round[2 # / 3] &, (* ditto, 2/3 *)
   # + 1 &           (* add one function *)
  }] &               (* and the '&' makes the entire 
                        thing an anonymous function,
                        whose argument is the '#' up
                        at the top.                  *)

Оскільки введення є цілим числом, а поділки - на 3, результат ніколи не буде, як 4.5, тому не потрібно турбуватися про правила округлення, коли остання цифра дорівнює 5: вона завжди буде чітко наближена до одного цілого чи іншого.




0

CJam, 21 байт

qi__3d/+mo_2d3/*i_)]`

Відгуки вітаються

Пояснення

  • qi__ - Прочитайте вхід як ціле число і повторіть його двічі
  • 3D/+mo - Розділіть один екземпляр введення на 3, а потім додайте його до другого примірника, щоб зробити y
  • _2d3/*i - Скопіюйте y, потім помножте на .6
  • _)] `- Dupe, приріст, загортання в масив, друк як масив (не в коді через оператора`::)

Редагувати: забули зробити перші три вдвічі, тому програму було порушено. Виправлено.


0

Аксіома, 59 байт

g(x)==round(x)::INT;f(x)==[x,a:=g(x+x/3.),b:=g(a*2./3),b+1]

тест

(3) -> [[i,f(i)] for i in [9,8,6,23,159]]
   (3)
   [[9,[9,12,8,9]], [8,[8,11,7,8]], [6,[6,8,5,6]], [23,[23,31,21,22]],
    [159,[159,212,141,142]]]
                                                      Type: List List Any


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