Програмування Головоломка Mode Golf


43

Ваше завдання - надрукувати текст Good morning, Green orb!, причому кожен символ повторюється на місці стільки разів, скільки найчастіший байт у вашому джерелі (режимі). Додатковий новий рядок дозволений і його не потрібно повторювати.

Наприклад, якщо ваше джерело було

print p

Оскільки pз’являється двічі, і кожен інший байт з’являється один раз, коли вам потрібно буде надрукувати

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

Відповіді будуть оцінені за результатом їх кількості байтів і кількістю повторень результатів. Наприклад, наведений вище код (якщо він працював) набрав би 7 * 2 = 14 . Метою має бути мінімізація балів.

Ваш код повинен містити щонайменше 1 байт.

Використовуйте цю програму для перевірки відповідності вашого коду та виводу


Функції дозволені, правда?
повністюлюдсько

1
@totallyhuman Так, поки вони не беруть вклад.
Пшеничний майстер

1
Чи не слід це позначати quine ?
FantaC

Ранок не може бути використаний з великої літери, чи не так?
Чарівний восьминіг Урна

@magicoctopusurn Ні, текст має бути однаковим.
Пшеничний майстер

Відповіді:


18

Мозок-Флак , 384 * 106 366 * 100 = 36 600

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

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

Пояснення

Перше, що я роблю - це штовхати струну

!bro neerG ,gninrom dooG

до стеку, використовуючи досить стандартну тактику складності мозку Колмогорова.

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

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

Далі ми одночасно перевертаємо рядок і дублюємо кожен символ на місце правильну кількість разів. Зокрема лічильник + 1.

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

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


9
Ага так, просто досить стандартна тактика Колмогорова - складність. Це - річ.
Джон Кітс

Ти, мій молодець, повинен бути злий, щоб навіть спробувати це. Я просто збираюся поставити +1 і піти, перш ніж мій мозок вибухне, намагаючись зрозуміти всі дужки.
caird coinheringaahing

15

Haskell , 37 байт × 3 = 111

-20 завдяки H.PWiz. -25 завдяки німі.

"Good m\111rning, Green orb!"<*[2..4]

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

Оператори Haskell FTW.

Нагадування про те, що ніколи не займатися гольфом на мобільних пристроях. Я продовжую робити грубі помилки. Я можу покласти хоча б половину провини на мобільний. : P


5
Використання <*для збереження байтів (зауважте, що я не перевіряв його дійсність)
H.PWiz

... Кривавий чорт, у Haskell майже занадто багато операторів. Дякую!
повністюлюдсько

15

мозковий ебать , 235 х 77 = 18 095 балів

Редагувати: -2 байти завдяки @Dennis

-[>--<-------]>-[>+++++>+>+>+>+++++>+>+>+>+>+++>+++++>-->+>+>+>+>+>+>+>+++++>+>+>+>+++[<]>-]>>----------->+++++>++>->+>-------->-------->+++++>>->++++++>------>+>---->+>+++++>++>>->--------->++>++>>-[>+<---]>--------<<[>>[-<+<.>>]<<,<]

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

Тест TIO

Зачекайте, це не код боулінгу ?? \ с

Маючи лише 8 придатних символів, мозковий ебать - це одна з найгірших мов для вирішення цього питання. Мені довелося почати з мінімізації того, який персонаж неминуче виявиться найбільше, як правило, +або -. Написавши першу ітерацію коду, я виявив його жахливо незбалансованим на користь +s. Я переставив частини коду, такі як генерація більших чисел, щоб використовувати більше -. Нарешті, я закінчив в якості рівного кількості двох символів на 77 одиницю менше , -ніж +. Це, безумовно, можливо, зменшити це ще більше, на що я завітаю вже завтра.

Але ей, принаймні я побив відповідь Брейнфлака


Гей, вітаю! Я не можу повірити, що це навіть можливо в BF ... Досить, якщо це можна зробити ;#мовою (͡ ° ͜ʖ ͡ °)
RedClover

13

Желе , 13 байт * 1 = 13

“¢Ȧ@XĊ'WÑṭḂ#»

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


3
Нарешті хтось керує невловимою * 1 відповіддю. У мене було відчуття, що Jelly буде мовою це зробити ...
ETHproductions

@ETHproductions Ха-ха, просто вдвічі зменшив мій код, зберігаючи * 1
Містер Xcoder

Ха-ха, я щойно знайшов це після того, як ви його відредагували
dylnan

З цікавості, в чому саме різниця? Яким чином новий стислий рядок наполовину перевищує старий?
ETHproductions

@ETHproductions Я в основному спочатку використовував неоптимальний стислий рядок, потім використовував оптимізований компресор Jelly, який знайшов відповідність у словнику.
Містер Xcoder

10

Аліса , 49 байт * 2 = 98 144

/:G!4o3r8"1=5',0Grey9Z<@
\"b0=dnm 2'i%g<7R6~e.;o/

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

Пояснення

/...@
\.../

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

"G04d3m821i5g,7G6ee9;<:b!=onr "'=%'<0Rr~y.Zo@

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

input: "G04d3m821i5g,7G6ee9;<:b!"
from:  "0123456789:;<"
to:    "onr "

Спосіб транслітерації в Alice полягає в тому, що fromі toрядки спочатку повторюються до LCM їх довжини, хоча в цьому випадку все має значення довжина fromрядка, тому ми отримуємо:

from:  "0123456789:;<"
to:    "onr onr onr o"

Таким чином, ми отримуємо чотири різних символи для представлення os, і по три для n, rі пробіл. Ми можемо створити fromрядок, використовуючи розширення діапазону наступним чином:

'<   Push "<".
0    Append a zero.
R    Reverse.
r    Range expansion.

Єдине питання в тому, що нам знадобиться чотири "як для, так inputі для toрядка. Щоб уникнути цього, ми кладемо їх обидва в одну рядок і розділяємо їх, =використовуючи як роздільник.

"G04d3m821i5g,7G6ee9;<:b!=onr "
     Push the string containing both parts.
'=%  Split around "=".

Решта просто:

~   Swap "from" and "to".
y   Transliterate.
.Z  Duplicate and interleave. This duplicates each character.
o   Print.
@   Terminate the program.


6

C (gcc) , 74 × 6 = 444 перекреслено 444, все ще регулярно 444 77 × 5 = 385 81 × 4 = 324

f(q){char*a="Go\157d morning, G\162een o\162b!";for(q=0;q<96;)putchar(a[q++/4]);}

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


16
o0 wat ви зробили ваш заголовок допису
повністюлюдсько

9
трохи повеселилися
betseg

куди пішов перекреслений 44 мета-пост?
NieDzejkob

5

C (gcc) , 68 × 3 = 204

0000000: 6a 3b 6d 61 69 6e 28 29 7b 77 68 69 6c 65 28 6a  j;main(){while(j
0000010: 3c 37 32 29 70 75 74 63 68 61 72 28 7e 22 b8 90  <72)putchar(~"..
0000020: 90 9b df 92 90 8d 91 96 91 98 d3 df b8 8d 9a 9a  ................
0000030: 91 df 5c 32 32 30 8d 9d de 22 5b 6a 2b 2b 2f 33  ..\220..."[j++/3
0000040: 5d 29 3b 7d                                      ]);}

Дякуємо @MDXF за економію 9 балів та прокладення шляху ще 6!

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

Альтернативна версія для друку ASCII, 69 × 3 = 207

j;main(k){while(j<72)putchar("Gnmg$hiuf`dl -I}ut|3{gt6"[k=j++/3]^k);}

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



5

APL (Dyalog Unicode) , 46 байт × 2 = 92

(Містить недруковані матеріали)

2/⎕UCS18+⍳24)+⎕UCS'X~r-yz|wqum1$Jtfemln]'

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

+ Багато байтів завдяки кодовій сторінці Dyalog, завдяки @ Adám за те, що вказав на це.



Це справді геніально, @ Adám
Zacharý

Я боюся , що ви повинні погодитися на 92 так ~⎕AV∊⍨⎕UCS 18.
Adám

5

Vim, 42 41 натискання клавіш × 3 = 123

iGod morning, Green orb!<Esc>2|qsyl2pl@sqX0@s

Пояснення:

  1. iGod morning, Green orb!<Esc>
    Напишіть рядок God morning, Green orb!(один oвідсутній).
  2. 2|
    Перейти до першого o.
  3. qsyl2pl@sq
    Створіть рекурсивний макрос s. Як побічний ефект потрійний струм o.
  4. X0
    Вийміть один oі перескочіть до початку.
  5. @s
    Запустіть макрос s, який повторює кожен символ двічі.

4

C, 78 × 4 = 312

*s=L" ÞÞÈ@ÚÞäÜÒÜÎX@äÊÊÜ@ÞäÄB";main(y){while(*++s)for(;y++%5;putchar(*s/2));}

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

356 332


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

І це для кодування рядка.
MD XF

3

Япт , 24 байти * 2 = 48

`Good ¶rÍÁ,
GÎ9 b!`m²·¸

Містить недруковану версію. Перевірте це в Інтернеті!

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

Good morning,
Green orb!

а потім mапс кожного персонажа, повторивши це ²дотепно , це було трохи розтягнення . Пробіл - єдиний символ, який 3 рази з’являється у стисненій рядку; щоб зберегти один екземпляр, ми замінюємо його новим рядком, а потім використовуємо ·¸для розділення на нові рядки та негайно приєднання до пробілів. Хоча на 2 байти довше, це значно знижує бал (з 66 до 48).

Тепер якби був лише короткий спосіб зробити це без використання символу двічі ...


Тому що я не бачу цього: який символ триває в джерелі? Я бачу кілька речей, які мають кількість 2, але не 3.
Draco18s

1
@ Draco18s Немає, оцінка 24 * 2.
ETHproductions

Тоді вихід неправильний. Ви друкуєте кожен символ 3 рази замість двічі.
Draco18s

@ Draco18s Dangit, розмістив неправильне посилання ... Дякую за вказівку на це.
ETHproductions

*salute*А тепер, коли я дивлюсь на вашу відповідь, я бачу, що у неї є ², тоді як у посилання було ³ :)
Draco18s

3

SNOBOL4 (CSNOBOL4) , 97 байт * 10 = 970

	S ='Good Morning, Green orb!'
y	S	LEN(1) . y rem . s	:f(p)
	x	=x DUPL(y,10)	:(y)
p	OUTPUT	=x
END

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

так ........ SNOBOL вимагає, щоб оператори були розділені пробілом, і є вимоги пробілу, які досить незручні. У коді є 9 '\t'і 10 ' ', тому будь-які вдосконалення потребують досить значних змін у підході.




3

Perl 5 , 59 × 2 = 118 балів

$_="GSSdYmoVRing,YGVIen orb!";y<H-Z>[d-t ],s<.>[$&x2]eg;say

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

Perl 5 , 51 × 3 = 153156 бали

s""GOOd morning, Green orb!";y'O'o';s/./$&x3/eg;say

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

Perl 5 , 43 × 4 = 172 бали

say"Good morning, Green orb!"=~s/./$&x4/egr

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

Збережено 2 байти у кожному рішенні завдяки @Xcali (кілька змін тому). Для всіх оптимізацій дивіться правки.


Зробити це програмою замість функції, врятується 2 байти (4 бали): Спробуйте в Інтернеті!
Xcali

@Xcali, але для вашої зміни потрібен нестандартний варіант -M5.010, який також вважається
mik




2

Пітон 2 , 62 * 4 = 248

Дякуємо @ovs та @Giuseppe!

lambda:"".join(c*4for(c)in"G\x6f\x6fd mor\x6eing, Green orb!")

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

Пітон 2 , 51 * 6 = 306

print"".join(c*6for c in"Good morning, Green orb!")

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

Пітон 2 , 70 * 5 = 350

lambda:"".join(c*5for(c)in"Gxxd mxrning, Green xrb!".replace('x','o'))

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

Завдяки @Mr. Xcoder для збереження байту з обох версій!


Ви можете видалити пробіл між 6і for.
Містер Xcoder

@ Mr.Xcoder Дякую!
Steadybox


@ovs це не зовсім правильно, я думаю, що вам потрібні два \x6fs, що все ще добре для 244
Джузеппе




2

05AB1E , Оцінка: 22 (22 байти * 1)

…‚¿•´,„ˆ¨èã).ªðý23£'!«

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

Пояснення:

ПРИМІТКА 1: Стек загортання в список вбудованих )використовується замість вбудованої пари , оскільки це вже частина словника good.
Примітка 2: Дві коми в коді і ,можуть виглядати однаково, але це різні символи Юнікоду . Перший зазвичай використовується для вбудованої пари , а другий для вбудованого друку до STDOUT із заднім рядком . У цьому випадку вони використовуються для словника слова good, але очікувана кома у висновку, однак.

…‚¿•´,        # 3-word dictionary string "good morning," (the comma counts as the third word)
„ˆ¨èã         # 2-word dictionary string "green orbit"
)             # Wrap everything on the stack into a list: ["good morning,","green orbit"]
            # Sentence capitalize all strings: ["Good morning,","Green orbit"]
   ðý         # Join by spaces: "Good morning, Green orbit"
     23£      # Only leave the first 23 characters: "Good morning, Green orb"
        '!«  '# Append a "!": "Good morning, Green orb!" (and output the result implicitly)

Дивіться цей мінний наконечник 05AB1E (розділ Як користуватися словником? ), Щоб зрозуміти, чому …‚¿•´,це так "good morning,"і „ˆ¨èãє "green orbit".


2

PowerShell , 46 байт * 4 = 184 бали

"Good morning, Green orb!"-replace'.',('$0'*4)

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


1
Це розумно. Я повністю забув про це$0
Веска

: | зачекайте, я спробував це, але тільки після створення формату, щоб він не працював так добре, як це було
лише ASCII

¯ \ _ (ツ) _ / ¯, що стосується TIO-посилання?
mazzy


1

Желе , 31 байт × 2 = 62 бали

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2

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

Пояснення

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2
“2ðƈZ(Øṡdȷ¿Ɱ’                     Base 250 number
              “God mrnig,eb!”     Unique characters of "Good morning..."
             ṃ                    Convert the base 250 number in base 13 then index into the string "God mr..."
                             x2   Repeat each character twice because “ occurs twice in the source (and now 2)

1

JavaScript (ES6), 61 байт * 3 = 183

_=>'Good morning, Gr\145en \x6f\x72b!'.replace(/./g,"$&$&$&")

JavaScript (ES6), 51 байт * 4 = 204

_=>'Good morning, Green orb!'.replace(/./g,'$&$&$&$&')

Відповідь, запропонована @ETHproductions .

JavaScript (ES6), 73 байти * 4 = 292

_=>`G00d mo1ning, G244n orb!`.replace(/./g,_=>(('o'+!0)[_]||_).repeat(4))

JavaScript (ES6), 58 байт * 6 = 348

_=>'Good morning, Green orb!'.replace(/./g,_=>_.repeat(6))


Крім того, перейдіть _=>_на'$&'
ETHproductions

1
Альтернативно, я думаю, що ви можете просто зробити '$&$&$&$&$&$&'заміну, яка тоді, я думаю, дозволяє вам видалити два екземпляри і перейти до того, щоб кілька символів було прив’язано до 4, різко зменшивши рахунок ...
ETHproductions

@ETHproductions Спасибі, не знав про цю схему заміни!
darrylyeo


1

Рубін, 55х4 = 220 балів

"Good morning, Green orb!".split(//).each{|x|print x*4}

Мене дуже дратує те, що використання кожного_char робить кількість r's 5.


1

Пухнастий , 36 * 2 = 72

`GXVWOP^4W_[afdc\hiB`N$29+L-''.

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

Основний принцип цієї відповіді полягає в тому, що кожен символ nзберігається так n + index - 29, щоб уникнути повторення в початковому рядку. Таке відображення створило рядок у задніх полях. Решта програми просто розшифровує це і друкує кожен символ двічі:

` ... `              \ Push the encoded string
       N             \ Remove printing delimiter
        $            \ While there are items left on stack:
         29+         \   Add 29 to top of stack
            L-       \   Subtract current length from top of stack
              ''.    \   Print twice, then pop

Байти, що використовуються двічі: `'W

Журнал змін

  • Довжина для гольфу від 41 до 38, змінюючи метод розшифровки.
  • Довжина для гольфу від 38 до 37, віднімаючи 29 від кожного кодованого символу, щоб запобігти багатобайтовим символам.
  • Довжина для гольфу від 37 до 36, використовуючи неявну 'кінцеву петлю'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.