Від головоломки програмування до коду гольфу


74

Ваше завдання полягає в тому, щоб написати програму, яка виводить точний рядок Programming Puzzles(необов'язковий трейлінг нового рядка), але коли всі пробіли, вкладки та нові рядки видалені, він виводиться Code Golf(необов'язковий трейлінг нового рядка).

Ваш байт - це кількість першої програми, де пробіли ще є.

Примітки

  • Пробіли в Code Golf і Programming Puzzles будуть видалені як частина видалення, тому плануйте відповідно.

  • У кодуваннях, де 0x09, 0x0A та 0x20 не є вкладками, новинками чи пробілами відповідно, ці символи будуть видалені.

  • Якщо ваш код є

    42  $@ rw$
    @42
    

    то це має вивести Programming Puzzles. Також тією ж мовою,

    42$@rw$@42
    

    повинен вивести Code Golf.

Це , тому найкоротший код у байтах виграє! Удачі!


3
чи Code Golfбуде видалено простір у , що робити з тим, хто в Programming Puzzles.
colsw

2
Це буде неможливо принаймні Whirl та Whitespace .
Інженер Тост

13
Для чого тісні голоси?
OldBunny2800

12
@ OldBunny2800 гарне запитання. Я все прошу про це, але коментар видаляється ...
programmer5000

12
Близькі голоси - це відсутність входів та результатів та обмеження форматування входів та виходів. На 100%, якби у вас був розділ із позначенням «правила» із переліченим кулею списком речей, які, на вашу думку, були очевидними щодо виклику, ви мали б 0 закритих голосів. Вся справа в презентації з людьми CompSci, якщо ми можемо придумати, здавалося б, ідіотське питання, щоб задати, що може врятувати нас на байт або до, ми спробуємо протидіяти цьому ідіотизму, і ви будете чудовим письменником.
Чарівна восьминога урна

Відповіді:


65

Python 2 , 50 байт

print["Code\40Golf","Programming Puzzles"][" ">""]

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

З вилученими пробілами:

print["Code\40Golf","ProgrammingPuzzles"]["">""]

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

Завдяки Стівену С за 3 байти, та Еріку Атголфер за 1


2
Дарн, ніндзя! Я збирався просто натиснути Надіслати відповідь! +1
HyperNeutrino

1
Я думаю, ти щойно зламав мозок мого друга. Як це навіть працює?
Stevoisiak

11
@StevenVascellaro Це дуже просто. У першому випадку " ">""повертається True, оскільки, лексикографічно, пробіл більший, ніж порожній рядок. У другому випадку "">""повертається False, оскільки ніщо не може бути більшим за себе. Trueі Falseє фактично справедливими 1і 0відповідно просто у boolтипі даних замість intабо long. У першому випадку пробіли зберігаються, таким чином, елемент у індексі 1, "Programming Puzzles"повертається дослівно. У другому випадку пробіли пропали, отже, \x20в елементі з індексом 0 "Code\x20Golf"зберегти пробіл.
Erik the Outgolfer

9
@StephenS Ні, оскільки на відміну від JavaScript, Python не має одержимості неявного кастингу.
Mego

1
Якщо виявити брак одержимості Python тривожним.
Джон Дворак


22

05AB1E , 15 байт

”ƒËŠˆ”" "v”–±ÇÀ

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

Пояснення

”ƒËŠˆ”           # push "Code Golf"
      " "v       # for each character in the string " " do
          ”–±ÇÀ  # push "Programming Puzzles"
                 # implicitly output top of stack

... Я просто не розумію. Чи використовується це стиснення словника чи щось таке?
LegionMammal978

@ LegionMammal978 Я майже впевнений, що це так.
NoOneIsHere

@ LegionMammal978: Він дійсно використовує стиснення словника.
Емінья

5
@Emigna Добре, тому що останній раз я перевірив, що жоден із цих рядків не міг би вміститися в 4 байти: p
LegionMammal978

1
@ Draco18s: Кевін написав чудовий підручник на сторінці підказок, яку ви можете використовувати, щоб краще зрозуміти, як ним користуватися.
Емінья


16

CJam , 38 байт

" ""Programming Puzzles""Dpef!Hpmg":(?

Спробуйте в Інтернеті! або з пробілами

Пояснення

" "                    e# Push this string.
"Programming Puzzles"  e# Push "Programming Puzzles".
"Dpef!Hpmg":(          e# Push "Dpef!Hpmg" and decrement each char, giving "Code Golf".
?                      e# If the first string is true (non-empty) return the second string,
                       e#   else return the third.

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


27
Ваш код сумний:(
Roman Gräf

14
Якщо ви готові використовувати недруковані версії, "Bncd\x19Fnke":)замість цього (замініть \x19).
Erik the Outgolfer

15

Желе , 18 байт

“½ċṭ6Ỵ»ḷ
“Ñ1ɦ+£)G»

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

Пояснення

У написаній програмі перший рядок - це допоміжна функція, яка ніколи не виконується. Другий рядок (останній у програмі) є основною програмою і являє собою стиснене представлення рядка "Programming Puzzles"(який потім друкується неявно).

Якщо ви видалите новий рядок, вся справа стає однією великою програмою. “½ċṭ6Ỵ»- стиснене представлення рядка "Code Golf". оцінює, але ігнорує його аргумент правою рукою, залишаючи те саме значення, що і раніше; його можна використовувати для оцінки функцій за їх побічними ефектами (що я робив раніше), але також можна використовувати, як тут, для ефективного коментування коду.

Цікаво, що фактична логіка тут коротша, ніж запис 05AB1E, але код у цілому виходить довше, оскільки струнний компресор менш хороший для стиснення цих конкретних рядків.


Це виявляється дійсним.
Ерік Аутгольфер

Наскільки мені відомо, деякі з цих символів можна зберегти, використовуючи один байт, припускаючи добре відомі кодування. в UTF-8 я отримую 36 байт ... Я помиляюся?
steffen

@steffen: Jelly використовує власне кодування символів , в якому всі 256 різних символів, які він використовує, можуть зберігатися в одному байті. (Єдина причина, чому це робиться, а не використання раніше існуючого кодування, - це читабельність (!); Ви можете тривіально записати програму, закодовану, скажімо, на кодовій сторінці 437, і вона запускатиметься в інтерпретаторі Jelly, але зазвичай це буде набагато важче читати.)

13

Желе , 17 байт

“Ñ1ɦ+£)G“½ċṭ6 Ỵ»Ṃ

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

Як це працює

Як і в іншій відповіді Jelly, Ñ1ɦ+£)Gі ½ċṭ6Ỵкодуйте рядки Програмування головоломки та Code Golf . починається рядковий літерал і відокремлює один рядок від іншого, в той час як »вибирає тип літералу (стиснення на основі словника), тому це дає

["Programming Puzzles", "Code Golf"]

то приймає мінімум, поступаючись Code Golf .

Однак, додавши пробіл між ½ċṭ6і , ми отримуємо зовсім інший другий рядок, і буквальний оцінює до

["Programming Puzzles", "caird coinheringaahing"]

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


Так само зробив і з“½ċṭ6Ỵ“Ñ1ɦ +£)G»Ṁ
Джонатан Аллан

Наскільки мені відомо, жоден із цих символів не може бути збережений, використовуючи один байт, припускаючи добре відомі кодування. в UTF-8 я отримую 34 байти ... Я помиляюся?
steffen

@steffen Jelly використовує користувацьку кодову сторінку, що кодує кожен із 256 символів, які він розуміє як один байт.
Денніс

@Dennis дякую за уточнення.
steffen

13

Javascript, 46 43 42 байт

x=>" "?"Programming Puzzles":"Code\40Golf"

console.log((x=>" "?"Programming Puzzles":"Code\40Golf")())
console.log((x=>""?"ProgrammingPuzzles":"Code\40Golf")())


5
Ви можете замінити \x20в першому рядку пробілом.
Кудлатий

Побийте мене до цього, чудово зроблено. Чи потрібен цей трейлінг ;?
ricdesi

@ricdesi ні, це не так.

3
@ricdesi, оскільки це кодовий гольф, якщо програма працює, вона працює. ;s іноді не потрібні в JavaScript.
Стівен

2
Ви можете замінити \x20з \40зберегти байт :-)
ETHproductions

10

Мова Вольфрам, 62 байти

"Programming Puzzles"[ToExpression@"\"Code\\.20Golf\""][[0 1]]

Простір у [[0 1]]- це неявне множення, тому це еквівалентно [[0]]. Без місця 01просто 1. 0 та 1-а частина цього виразу - це рядки, які ми хочемо.

Ще одне рішення сумнівної дійсності (44 байти, 2 збережено Келлі Лоудер):

"Programming Puzzles"["Code\.20Golf"][[0 1]]

\.20Замінюється пропуском відразу при введенні в середовищі Mathematica, так що не ясно , якщо він буде видалено разом з іншими просторами ...


1
Щойно ви вставляєте (або вводите) це в Mathematica (послідовність виходу з хмари чи ні), \:0020перетворюється на пробіл, і таким чином буде видалено, тому я не впевнений, що це відповідає. Також \.20коротше.by два символи. "Programming Puzzles"["Code"<>FromCharacterCode@32<>"Golf"][[01]]буду працювати.
Келлі Лоудер

1
@KellyLowder, хм, це хороший момент. Я додав ще одне рішення, яке повинно уникати цього питання. (Дякую за \.20пропозицію - як ти це знайшов? Я думав, що я переглянув всю документацію…)
Не дерево

1
Я знайшов \.20друкарську помилку. Здається, працює лише для двозначних кодів символів. Я не думаю, що це в документації.
Келлі Лоудер

8

Excel - 56 байт

=IF(""=" ","Code"&CHAR(32)&"Golf","Programming Puzzles")

Дуже схожий на більшість інших відповідей ... тут нічого фантазії.


8

Haskell, 48 байт

a _="Programming Puzzles";a4="Code\32Golf";f=a 4
a_="ProgrammingPuzzles";a4="Code\32Golf";f=a4

Визначає функцію, fяка повертає відповідний рядок.

Для довідки, стара версія:

Haskell, 49/47 байт

f""="Code\32Golf";f(_)="Programming Puzzles";f" "

з видаленими пробілами

f""="Code\32Golf";f(_)="ProgrammingPuzzles";f""

Дві прості відповідність візерунка. (_)відповідає всім моделям. Ви можете покращити версію без пробілів на один байт, визначивши другий шаблон як f" "=/ f""=, але це дає попередження "Збіг шаблонів є зайвим".

Альтернативне рішення з тим самим числом байтів:

last$"Code\32Golf":["Programming Puzzles"|" ">""]
last$"Code\32Golf":["ProgrammingPuzzles"|"">""]

7

Ом , 33 32 байти

Використовує кодування CP437.

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀
▀4>~H├MS░l╬δ

Спробуйте в Інтернеті! або спробуйте без пробілів

Пояснення

З пробілом:

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀    Main wire

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀    Push "Programming Puzzles" (compressed string)
                       Implicitly output the top stack element


▀4>~H├MS░l╬δ           Helper wire (never called)

Без пробілів:

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀▀4>~H├MS░l╬δ    Main wire

▀Bn¬i≈╣Ü╝Rb╡°╧S½uÇ▀                Push "Programming Puzzles" (compressed string)
                   ▀4>~H├MS░l╬δ    Push "Code Golf" (compressed string)
                                   Implicitly output top stack element

Я такий радий, що нарешті закінчив стискання струни!
Нік Кліффорд

1
@ NickClifford Цікавим, що я помітив, було те, що Code Golfвін стискався довше, коли стискався . Я думаю, це через столиці? Так чи інакше, це все-таки коротше, ніж писати це зазвичай, тому що я не можу використовувати тут буквальний простір.
Ділова кішка

Так, Смаз такий дивний.
Нік Кліффорд

FYI, не соромтесь надіслати мені повідомлення в чаті, якщо у вас є якісь запитання або запити щодо функції Ohm.
Нік Кліффорд

7

Japt , 29 байт

З пробілами:

`Co¸{S}Golf`r `PžgŸmÚÁ Puzz¤s

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

Без пробілів:

`Co¸{S}Golf`r`PžgŸmÚÁPuzz¤s

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


Це використовує той факт, що в Japt простір закриває виклик методу. З пробілами код приблизно еквівалентний цьому коду JavaScript:

("Code"+(S)+"Golf").r(),"Programming Puzzles"

Це оцінюється як JavaScript, а результат надсилається до STDOUT. Оскільки останній вираз є "Programming Puzzles", цей рядок друкується.

Без пробілів код приблизно еквівалентний:

("Code"+(S)+"Golf").r("ProgrammingPuzzles")

(Якщо ви до цього часу не з'ясували, Sзмінна - це єдиний пробіл.) .r()Метод у рядку, якщо він заданий одним аргументом, видаляє всі екземпляри цього аргументу з рядка. Оскільки "Code Golf"не містить "ProgrammingPuzzles", він повертається "Code Golf"без змін, який потім надсилається до STDOUT.


Я навіть не думав використовувати заміну. Хороший!
Том

Наскільки мені відомо, деякі з цих символів можна зберегти, використовуючи один байт, припускаючи добре відомі кодування. в UTF-8 я отримую 36 байт ... Я помиляюся?
steffen

@steffen Japt використовує кодування ISO-8859-1, в якому кожен знак представляє один байт. Але деякі символи були б недрукованими у цій програмі, тому я тут застосував кодування Windows-1252 (насправді це було автогенеровано TIO )
ETHproductions

6

Брахілог , 44 байти

" "Ṣ∧"Programming Puzzles"w|"Code"wṢw"Golf"w

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

Пояснення

" "Ṣ                                           If " " = Ṣ (which is itself " ")
    ∧"Programming Puzzles"w                    Write "Programming Puzzles"
                           |                   Else
                            "Code"w            Write "Code"
                                   Ṣw          Write " "
                                     "Golf"w   Write "Golf"

1
Закреслений 44 все ще 44 :( Редагуйте &nbsp;обидві сторони, щоб виправити :)
HyperNeutrino

@HyperNeutrino Це не закреслено, 44 - довжина з пробілами, а 42 - без.
Фаталізувати

Ой. Уопс. Ну, це занадто схоже, щоб я не міг сказати, не дивлячись на розмітку, зайшовши в правки. Неважливо: P
HyperNeutrino

5

Аліса , 44 байти

/"floG!"t"edoC"#
 /"selzzuP gnimmargorP"d&o@

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

Без пробілів:

/"floG!"t"edoC"#/"selzzuPgnimmargorP"d&o@

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

Пояснення

У першій програмі два дзеркала /перенаправляють вказівний інструмент на другий рядок. "selzzuP gnimmargorP"висуває необхідні точки коду в порядку поваги, dвисуває глибину стека і &oдрукує багато байтів. @припиняє програму.

Без пробілів програма все в одному рядку. У цьому випадку покажчик інструкцій не може переміщатися в звичайному режимі, тому /фактично не працює (технічно IP-адреса просто не рухається ні на один крок, те ж саме /виконується знову, і IP відбивається назад у кардинальному режимі ). Тож якщо ми скинемо ці програми з програми, це виглядає приблизно так:

"floG!"t"edoC"#"selzzuPgnimmargorP"d&o@

Щоб включити простір Code Golf, ми замість цього використовуємо знак оклику та декрементуємо його t. Після того, як ми отримаємо всі точки коду на стеку, #пропускає наступну команду, яка є всією другою рядком. d&oпотім знову друкує стек і @завершує програму.


Ви повинні гольфувати це (закреслено 44 - 44)
MilkyWay90,

5

PHP, 44 байт

потрійний оператор

<?=" "?"Programming Puzzles":"Code\x20Golf";

PHP, 51 байт

коментар

<?=/** /"Code\x20Golf"/*/"Programming Puzzles"/**/;

PHP, 57 байт

перемикач масиву

<?=["Code\x20Golf","Programming Puzzles"][(ord("
")/10)];

5

Лист звичайний (SBCL), 52 байти

(format`,t"~[Programming Puzzles~;Code~@TGolf~]"0 1)

Друкує Programming Puzzles

(format`,t"~[ProgrammingPuzzles~;Code~@TGolf~]"01)

Друкує Code Golf

Безголівки:

(format t "~[Programming Puzzles~;Code Golf~]" 0 1)

Пояснення:

Трюк в основному походить від того, як #'formatпрацює в Common Lisp.

У CL більшість пробілів можна опустити за умови, що немає двозначності щодо початку та закінчення лексем. Перший трюк - розділення символів formatта tсимволів. Мені довелося однозначно закінчувати formatсимвол, не змінюючи того, як tйого інтерпретували. На щастя, `у CL закінчується попередній маркер, перш ніж він обробляється, і ,скасовує ефект` (`використовується для реалізації шаблону, де наступний вираз після нього отримує" цитується ", але будь-який підвираз з префіксом" a " ,оцінюється і результат, що входить до шаблону, так `, майже не працює.

Третій аргумент format- це рядок шаблону. formatподібний до printf в C, але має набагато більш потужні директиви щодо форматування і використовуйте ~ для позначення їх замість%. ~ [і ~] дозволяють вибирати між декількома варіантами друку, за допомогою ~; відокремлюючи їх. Додатковий аргумент подається до форматування - числовий індекс, який ви бажаєте надрукувати. Для того, щоб переконатися, що "" у Code Golf виживає, я використав директиву складання таблиць ~ T, яка використовується для вставки пробілів, як правило, для вирівнювання тексту у стовпці. ~ @ T - це варіант, який просто вставляє задану кількість пробілів, за замовчуванням до 1.

Нарешті, є два аргументи для форматування - 0 і 1. Перед тим, як буде видалено пробіл, 0 використовується ~ [~; ~] для вибору "Пазлів програмування", а аргумент додаткового формату (1) відмінено (я не впевнений, наскільки стандартні аргументи додаткового формату, але це працює на Steel Bank Common Lisp). Після того, як пробіли будуть видалені, є лише один аргумент (01), який замість нього вибирає "Код гольфу".


1
+1, лише одне: "але будь-який підвираз з префіксом a ,оцінюється і зрощується в" Не ,@потрібен для сплайсингу?
PrzemysławP

Визначимо, "сплайсинг" - це поганий термін для цього. Технічно ,вирівнюється наступний вираз і включає результат у шаблон, тоді як ,@припущення, що вираз буде еквівалентним до списку і безпосередньо містить вміст цього списку в шаблоні. Традиційно у спільноті lisp ,@його називають "сплайсінг", але я не впевнений, що це найбільш очевидний вибір. Я спробую трохи переробити це.
djeis


4

C # 88 81 70 63 байт

Func<string>@a=()=>" "==""?"Code\x20Golf":"Programming Puzzles";

Із позбавленим пробілом:

Func<string>@a=()=>""==""?"Code\x20Golf":"ProgrammingPuzzles";

Дякую BrianJ за те, що він показав мені, як не має місця між типом повернення методу та назвою методу, PeterTaylor для збереження 7 18 байт та Патріком Хуізінга за збереження 7 байт.

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


1
ви можете префіксувати ім'я функції за допомогою @, тож у вас є void@a...та уникнути помилки компіляції "без повернення типу" (також додає байти, хоча :()
Brian J

.Length<1зберігає один байт; \u0020економить шість, якщо я правильно порахував; і ви можете зробити дійсну відповідь (і зберегти кілька байтів одночасно), подавши лямбда замість функції верхнього рівня. Func<string>a=()=>...
Пітер Тейлор

@BrianJ Хм, не знав цього, дивуйся, чому це працює з точки зору компілятора. У будь-якому випадку, він може втратити байти, але також технічно робить цю відповідь неконкурентною, тому вона того варта. Дякую!
Skidsdev

@Mayube the @в основному використовується, якщо вам потрібно використовувати зарезервоване слово як ім'я змінної (еквівалент оточує []у VB.NET (і MS SQL Server)).
Брайан Дж.

1
Так, це вимагає повернення рядка; але якщо ви використовуєте =>замість returnвас, вам не потрібні пробіли. (І навіть якщо ви користуєтесь return, можете return(...)).
Пітер Тейлор

4

Java 8, 74 50 48 байт

()=>" "==""?"Code\040Golf":"Programming Puzzles"

@NonlinearFruit ти маєш рацію, я змінив цю, щоб бути некомпетентною
Khaled.K

1
Я не думаю, що друк не є вимогою, тому ви можете просто повернути рядок. Я не перевіряв його, але ==оператор також повинен працювати,()=>""==""?"Code\u00A0Golf":"Programming Puzzles"
NonlinearFruit

1
\u00A0-> \040для економії в 2 байти.
Пукайте





3

постійний струм , 50

[pq]sm[Programming Puzzles]dZ19=m[Code]n32P[Golf]p

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

[ ]визначає рядок - Zвимірює її довжину. Якщо довжина становить 19, то вона містить пробіл, і макрос, що зберігається в m-регістрі, називається, який друкує Programming Puzzlesі закриває. Інакше Code Golfдрукується.


Чи можете ви зв’язатись з перекладачем постійного струму / docs / github?
програміст5000

@ programmer5000 Просто виберіть dc на TIO, а потім натисніть назву мови.
Денніс

@ Денніс спасибі, я навіть не знав, що TIO це робить!
програміст5000


3

T-SQL, 96 82 81 67 байт

print+iif(len(' x')=2,'Programming Puzzles','Code'+char(32)+'Golf')

Спробуйте в Інтернеті | Без пробілів

Стара версія (96 байт):

select(case'x'when(replace(' ',' ','x'))then'Programming Puzzles'else'Code'+nchar(32)+'Golf'end)

Хороша робота, ви можете дістатися до 67, втративши зовнішні парени та змінивши стан наiif(len(' x')=2
BradC

@BradC Близький, але зовнішній параметр заважає потребувати місця після print. Я використовував +натомість, і це спрацювало.
mbomb007

Потрібно вставити та порахувати неправильний. І я теж не знав, але плюс був першим персонажем, який я спробував, і це спрацювало.
mbomb007

3

Perl 5 , 43 41 байт

say" "?"Programming Puzzles":Code.$".Golf

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

Використовує той факт, що ' 'правда в perl і ''хибна. $"Мінлива встановлюється в простір за замовчуванням.

Дякуємо @NahuelFouilleul за видалення двох байтів.


можливо, пізно, але "Code$\"Golf"коротше і Code.$".Golfтеж
Nahuel Fouilleul

@NahuelFouilleul Так, я був зовсім новим, коли писав цю відповідь. Дякую, хоча!
Кріс


2

Befunge , 76 байт

" "0`#v_"floG"84*"edoC",,,,,,,,,@
,,,,,@>"selzzuP gnimmargorP",,,,,,,,,,,,,,

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

Не найкомпактніше рішення, але знову писати код Befunge без пробілів досить складно.

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


Що роблять ,s?
програміст5000

@ programmer5000 Кожен друкує один символ.
Мартін Ендер

Порада для друку великої кількості символів до тих пір, поки ви не досягнете позначки 0 - це >:#,_може заощадити багато байтів
MildlyMilquetoast,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.