От программирования головоломок до Code Golf


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"]["">""]

Попробуйте это онлайн!

Спасибо Стивену S за 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"сохраняются пробелы.
Эрик 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 Хорошо, потому что в последний раз я проверял, ни одна из этих строк не может быть
помещена

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
Ваш код грустный:(
Роман Gräf

14
Если вы готовы использовать непечатаемые файлы, "Bncd\x19Fnke":)используйте вместо этого счастливый код (замените \x19).
Эрик Outgolfer

15

Желе , 18 байт

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

Попробуйте онлайн!

объяснение

В написанной программе первая строка - это вспомогательная функция, которая никогда не запускается. Вторая строка (последняя в программе) является основной программой и представляет собой сжатое представление строки "Programming Puzzles"(которая затем печатается неявно).

Если вы удалите перевод строки, все это станет одной большой программой. “½ċṭ6Ỵ»является сжатым представлением строки "Code Golf". оценивает, но игнорирует аргумент правой руки, оставляя то же значение, что и до запуска; его можно использовать для оценки функций на предмет их побочных эффектов (то, что я делал раньше), но его также можно использовать, как здесь, для эффективного закомментирования кода.

Интересно, что действительная логика здесь короче, чем запись 05AB1E, но код в целом получается длиннее, потому что компрессор строк хуже справляется со сжатием этих конкретных строк.


Это оказывается действительным.
Эрик Outgolfer

Насколько мне известно, некоторые из этих символов могут быть сохранены с использованием одного байта при условии хорошо известных кодировок. в UTF-8 я получаю 36 байтов ... я не прав?
Штеффен

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

13

Желе , 17 байт

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

Попробуйте онлайн!

Как это устроено

Как и в другом желе, отвечайте Ñ1ɦ+£)Gи ½ċṭ6Ỵкодируйте строки Programming Puzzles и Code Golf . начинает строковый литерал и отделяет одну строковую форму от другой, а »выбирает тип литерала (сжатие на основе словаря), так что получается

["Programming Puzzles", "Code Golf"]

затем берет минимум, уступая Code Golf .

Однако, добавив пробел между ½ċṭ6и , мы получим совершенно другую вторую строку, и литерал оценивается как

["Programming Puzzles", "caird coinheringaahing"]

Поскольку caird coinheringaahing лексикографически больше, чем Programming Puzzles , вместо этого выбирается первая строка.


Просто сделал то же самое с“½ċṭ6Ỵ“Ñ1ɦ +£)G»Ṁ
Jonathan Allan

Насколько мне известно, ни один из этих символов не может быть сохранен с использованием одного байта, при условии хорошо известных кодировок. в UTF-8 я получаю 34 байта ... я не прав?
Штеффен

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

@ Денис спасибо за разъяснения.
Штеффен

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, так как это codegolf, если программа работает, она работает. ;Иногда это не требуется в JavaScript.
Стивен

2
Вы можете заменить \x20на, \40чтобы сохранить байт :-)
ETHproductions

10

Язык Wolfram, 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 объекты get заменяются пробелом, поэтому неясно, удаляются ли они вместе с другими пробелами…


1
Как только вы вставляете (или вводите) это в Mathematica (облачная или нет) управляющая последовательность, она \:0020превращается в пробел и, таким образом, будет удалена, поэтому я не уверен, что это подходит. И \.20короче. На два символа. "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больше при сжатии. Я думаю, это из-за столиц? В любом случае, это все же короче, чем писать его обычно, потому что я не могу использовать здесь буквальное пространство.
Бизнес кошка

Да, Смаз такой странный.
Ник Клиффорд

К вашему сведению, не стесняйтесь пинговать меня в чате, если у вас есть какие-либо вопросы или пожелания по Ом.
Ник Клиффорд

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 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 без.
Fatalize

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

5

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

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

Попробуйте онлайн!

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

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

Попробуйте онлайн!

объяснение

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

Без пробелов программа находится в одной строке. В этом случае указатель инструкций не может перемещаться в обычном режиме, поэтому он /фактически становится no-ops (технически, 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)];


4

C # 88 81 70 63 байта

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

С пропущенными пробелами:

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

Спасибо BrianJ за то, что показали, как не должно быть пробела между типом возвращаемого метода и именем метода, PeterTaylor за сохранение 7 18 байтов и Patrick Huizinga за сохранение 7 байтов.

Тот же метод, что и все остальные на самом деле, технически это можно считать недействительным, поскольку метод не указывает тип возвращаемого значения для метода, но между типом возвращаемого значения и именем метода должен быть пробел.


1
вы можете добавить к имени функции префикс @, так что тогда вы void@a...избежите ошибки компиляции «no return type» (также добавляет байты :()
Brian J

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

@BrianJ Хм, не знал этого, удивляюсь, почему это работает с точки зрения компилятора. В любом случае, он может потерять байты, но технически делает этот ответ неконкурентным, так что оно того стоит. Спасибо!
Скидсдев

@Mayube the @прежде всего используется, если вам нужно использовать зарезервированное слово в качестве имени переменной (эквивалент находится []в VB.NET (и MS SQL Server)).
Брайан Дж

1
Да, это требует возврата строки; но если вы используете =>вместо returnвас не нужно никаких пробелов. (И даже если вы используете return, вы можете return(...)).
Питер Тейлор

4

Common Lisp (SBCL), 52 байта

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

Печать Programming Puzzles

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

Печать Code Golf

Ungolfed:

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

Explaination:

Хитрость в основном заключается в том, как #'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 ,оценивается и объединяется в« Не ,@обязательно для объединения?

по общему признанию, «сращенный» - плохой термин для этого. Технически, ,исключает следующее выражение и включает результат в шаблон, в то время как ,@предполагает, что выражение будет преобразовано в список и включает содержимое этого списка непосредственно в шаблон. Традиционно в сообществе lisp ,@это называется «сплайсинг», но я не уверен, что это самый очевидный выбор. Я постараюсь перефразировать это немного.
djeis

4

Java 8, 74 50 48 байт

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

@NonlinearFruit Вы правы, я изменил этот, чтобы быть некомпетентным
Khaled.K

1
Я не думаю, что печать является обязательным требованием, поэтому вы можете просто вернуть строку. Я не проверял это, но ==оператор также должен работать,()=>""==""?"Code\u00A0Golf":"Programming Puzzles"
NonlinearFruit

1
\u00A0-> \040для экономии 2 байта.
Poke





3

постоянный ток , 50

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

Попробуйте онлайн .

[ ]определяет строку - Zизмеряет ее длину. Если длина равна 19, то она содержит пробел и вызывается макрос, сохраненный в регистре m, который печатает Programming Puzzlesи завершает работу. В противном случае Code Golfпечатается.


Не могли бы вы дать ссылку на интерпретатор dc / docs / github?
programmer5000

@ programmer5000 Просто выберите dc на TIO, затем нажмите название языка.
Деннис

@ Денис спасибо, я даже не знал, что TIO это делает!
programmer5000


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тоже
Науэль Фуйе

@NahuelFouilleul Да, я был довольно нов, когда написал этот ответ. Спасибо хоть!
Крис


2

Befunge , 76 байт

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

Попробуйте онлайн!

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

В самом начале он сравнивает пробел с 0. Если он больше, он переходит в нижний ряд. Если это не так, что происходит, когда вы заменяете пробел ничем, он остается в первом ряду.


Что делают ,с?
programmer5000

@ programmer5000 Каждый печатает один символ.
Мартин Эндер

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