Код Гольф: форварды sdrawkcaB sdrawkcaB форварды форварды sdrawkcaB

14

задача

  • Пользователь вводит предложение - только слова. Любой ввод, кроме букв или пробелов, включая целые числа и знаки препинания, должен вызывать исключение: «Приговор должен использовать только буквы».
  • Вывод имеет шаблон, где некоторые слова поменялись местами, а другие слова являются нормальными.
  • Шаблон начинается как обычное слово, следующие два слова меняются местами, затем следующие два слова являются нормальными, и шаблон продолжается.
  • Ниже приведен пример того, где слова должны быть нормальными, а где слова обратными:

Нормальный - Перевернутый - Обратный - Нормальный - Нормальный - Обратный - Обратный - Нормальный ...

Пример ввода

Она продает морские раковины на берегу моря

Пример вывода

Она бросает снаряды на берег

Дополнительные правила

  • Если используются заглавные буквы, они должны оставаться на том же письме, на котором они были первоначально размещены.
  • Любые несколько пробелов, первоначально размещенных на входе, должны быть уменьшены до одного пробела. Например Programming Puzzles and Code GolfстановитсяProgramming selzzuP dna Code Golf

Самый короткий код выигрывает!

Удачного кодирования ...

Belfield
источник
8
Многие языки программирования не имеют исключений.
дверная ручка
15
@nimi Кажется совершенно ненужным ограничивать вызов небольшим подмножеством языков по такой тривиальной причине.
дверная ручка
10
Этот, в остальном, хороший вызов рушится правилом. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Это означает выполнение вторичной задачи, совершенно не связанной с задачей обращения слов, вырезает языки, которые не имеют исключений, и требует жесткого кодирования или сжатия длинной строки, которая занимает много времени. количество байтов
xnor
2
@Belfield Да, я вижу твою связь. Я думаю, что вы ничего не можете сделать сейчас. В будущем попробуйте опубликовать в Песочнице, чтобы получить обратную связь перед публикацией.
xnor
3
@ Белфилд хороший вызов гораздо сложнее, чем хороший ответ. В любом случае, я наслаждался этим, и следующий будет лучше.
edc65

Ответы:

15

TeaScript , 55 байтов 58 60 69 76 78 80 87 89

xO`a-z `?xl(#~-i&2?l:lv(),/ +/):Ld`SÀZn­ Û § «e Ò5s`

Это очень коротко, я очень доволен этим.

Последние ~ 20 символов могут показаться бессмысленными, но в коде «Предложение должно использоваться только буквы». Все символы имеют коды символов ниже 256, поэтому каждый из них равен одному байту.

объяснение

xO`a-z `?  // If input contains only a-z and space...

   xl(#       // Loop through input 
      ~-i&2?  // If (index - 1 "unary and"ed with 2) isn't 0...
          :l,     // Leave alone
          lv()    // Otherwise, reverse string
       / +/ // Loops on spaces
   )

:Ld`SÀZn­ Û § «e Ò5s` // Otherwise... decompress and print  the error string
Downgoat
источник
Спасибо за публикацию теста - очень приятно. Все находятся в одной лодке, когда дело доходит до ошибки - нет игры в гольф этой линии
Belfield
Странно, теперь это работает в Firefox. Но я также использовал Firefox ранее.
Якуб
Лучший ответ на данный момент!
Belfield
Какая? Ты победил Пита ?! С языком на основе JS?!? Как это вообще возможно?!?!
ETHproductions
2
@ETHproductions Вы всегда можете выиграть, если Деннис не участвует в соревнованиях: p
Downgoat
4

Haskell, 141 байт

r=reverse
f x|all(`elem`(' ':['a'..'z']++['A'..'Z']))x=unwords$zipWith($)(cycle[id,r,r,id])$words x|1<2=error"Sentence must only use letters"

Почти 2/3 кода предназначены для проверки ошибок. Кажется, это первый вызов в реальном мире.

Выполняется работа, unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xкоторая разбивает входные данные на список слов, упаковывает их в циклический список функций [id,reverse,reverse,id,id,reverse...]и объединяет результат с пробелами в одну строку.

Спасибо @Christian Irwan за 2 байта.

Ними
источник
«Предложение должно содержать только буквы пользователя» может быть изменено на «Предложение должно содержать только буквы» - моя ошибка в ошибке!
Белфилд
@Belfield: исправлено
nimi
Почему нет r=reverse?
Akangka
@ChristianIrwan: Спасибо! (В ранней версии у меня была функция pointfree без имени, поэтому она использовалась два раза reverseи r=reverseимела одинаковую длину из-за отсутствия f=. Больше не проверялось при переходе на non pointfree).
Ними
3

JavaScript (ES6) 122

f=s=>/[^a-z ]/i.test(s)?"Sentence must only use letters":s.split(/ +/).map((w,i)=>~-i&2?w:[...w].reverse().join``).join` `

alert(f(prompt('?','She sells Sea shells on the Sea shore')))

edc65
источник
Когда во входе есть
новая строка
1
@ Vɪʜᴀɴ это сложно, пример о нескольких пробелах, но тогда нет нескольких пробелов - только 1 новая строка. Я думаю, что это было искажено редактором SO. Если нам нужно управлять символами новой строки и другим общим пространством, количество байтов увеличивается на 2
edc65
2

Сетчатка , 103 байта

\s+

(?<=^\S+ (\S+ )?((\S+ ){4})*)
;
+`(;\S*)(\S)
$2$1
;

i`.*[^a-z ].*
Sentence must only use letters

Во второй строке должен быть один пробел, который SE, похоже, глотает. Запустите код из одного файла с -sфлагом.

Retina не имеет понятия исключений, поэтому вывод просто заменяется, Sentence must only use lettersесли на входе есть непробельные непробельные символы.

Мартин Эндер
источник
2

Питон, 163 160 157 145

k=raw_input()
k=["Sentence tsum ylno use letters",k][k.replace(' ','').isalpha()]
for i,x in enumerate(k.split()):print x[::-1if(i+1)/2%2else 1],

Удалено 15 символов, спасибо Мего !!

лось
источник
Да, боюсь, у Ними есть смысл ...
Белфилд
Стреляй, я пропустил это. Я пересмотрю это.
лось
@Mego, re.search возвращает None (который не может использоваться в качестве индекса), если результат не найден, и добавление «! = None» фактически на один байт длиннее, чем мой оригинальный метод. Я сохранил 3 байта, объединив последние две строки. Благодарность!
Лось
1

Bash + coreutils, 108

[ ${@//[a-zA-Z]/} ]&&echo Sentence must only use letters||for t;{
((++i/2%2))&&rev<<<$t||echo $t
}|tr \\n \ 

Последний символ этой программы - пробел.

Ввод берется из командной строки:

$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf
Programming selzzuP dna Code Golf $ 
$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf1
Sentence must only use letters
$ 
Цифровая травма
источник
1

Пиф, 72

=zflTc?:z"[^A-Za-z ]"0"Sentence tsum ylno use letters"zdjd.e?%/hk2 2_bbz

Не бьет другой ответ Пайта, но я уже потратил время на его написание. Это в основном перевод моего Python-ответа .

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

лось
источник
1

Юлия, 109 байт

s->(i=0;join([isalpha(w)?(i+=1)%4>1?reverse(w):w:error("Sentence must only use letters")for w=split(s)]," "))

i=0и (i+=1)%4>1используются, чтобы решить, получает ли каждое слово reversed или нет. isalphaприменяется к словам после разделения, используя, split(s)чтобы определить, есть ли символы, которые не являются буквами (пробелы уже были удалены к этому моменту). joinвосстанавливает строку после манипуляции, если errorне брошено.

Глен О
источник
1

Юлия, 150 134 байта

s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))

Ungolfed:

function f(s::AbstractString)
    if ismatch(r"[^a-z ]"i, s)
        error("Sentence must only use letters")
    else
        i = 3
        a = [(i += 3; isodd((i + 1)i ÷ 2) ? reverse(w) : w) for w = split(s)]
        return join(a, " ")
    end
end

Сохранено 16 байт благодаря Glen O!

Алекс А.
источник
Прежде всего, могу ли я предложить изменить логику первоначального условия и присвоить rего результат? То есть r=ismatch(...)||error(...)- сбрит несколько символов и обратит условное выражение, которое использует r. Еще раз прокомментирую, я подозреваю, еще немного сбережений
Глен О
Небольшая коррекция - мне пришлось ||иметь дело с отрицанием, потом понял, что отрицание не нужно. Обратный обратно &&. И даже лучше, используйте ?:вместо этого, чтобы сделать это еще лучше. s->(r=ismatch(r"[^a-z ]"i,s))?error("Sentence must only use letters"):join([(iseven(i)&&(r=!r);r?reverse(w):w)for(i,w)=enumerate(split(s))]," ")для 144 байтов. И я думаю, что я могу сделать лучше внутри join...
Глен O
Вот упрощенная версия вашего решения с 134 байтами:s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))
Глен O
@GlenO Потрясающие предложения, спасибо!
Алекс А.
0

Pyth, 55 байтов

?--rz0Gd"Sentence must only use letters"jd.e_W%%k4 3bcz

Заимствовал %%k4 3 бит от Pietu1998. Сохранен еще один байт.

Попробуйте онлайн: демонстрация или тестовый набор

объяснение

?--rz0Gd"..."jd.e_W%%k4 3bcz   implicit: z = input string
   rz0                         convert z to lower-case
  -   G                        remove all letters
 -     d                       remove all spaces
?                              if there is some chars left than
        "..."                    print the string "Sentence must only ..."
                               else:
                          cz     split z by spaces or multiple spaces
               .e                map each pair (k index, b string) of ^ to: 
                 _       b          b or reversed of b, depending on
                  W%%k4 3           (k mod 4) mod 3
             jd                  join the result by spaces
Jakube
источник
0

Java, 215 байт

Regex это весело

s->{if(s.split("[^a-zA-Z ]").length>1)throw new Error("Sentence must only contains letters");else{int i=1;for(String a:s.split(" "))System.out.print((i++%2<1?new StringBuffer(a).reverse():a)+(a.isEmpty()?"":" "));}}

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

Бенджамин Уркхарт
источник
Ваш вывод в настоящее время не является правильным. Теперь вы выводите She slles aeS shells no the aeS shore, но это должно быть She slles aeS shells on eht aeS shoreвместо этого (сначала нормальное, затем чередование в парах по 2 в обратном порядке или нет). Это связано с двумя проблемами. Теперь вы увеличиваете, iдаже если предмет пуст, и i++%2<1должен быть i++%4>1вместо этого. Здесь исправлена 211-байтовая версия.
Кевин Круйссен
@KevinCruijssen это то, что я получаю за то, что не читаю достаточно внимательно
Бенджамин Уркхарт
0

Желе , 39 байт

³Ḳ¹ƇUJ2&TƲ¦K
“*[,ṛDṾȧƤ°Ġṛ©¦»
ØẠ” ṭ³eƇ⁼£

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

Благодаря Эрику Outgolfer. Он спас меня от нескольких лишних байтов и многих часов разочарования.

Вот 46-байтовое решение

Фактически выдает синтаксическую ошибку Python, когда ввод содержит недопустимые символы.

³Ḳ¹ƇUJ2&TƲ¦K
“çỤḷṁŀDṀẠṠGmḟĖƲƑ⁽Ḳḟ»ŒV
ØẠ” ṭ³eƇ⁼£

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

Zylviij
источник
0

Japt v2.0a0 -S, 41 байт

¸¬è\L ?`SÀZn­ Û § «e Ò5s`:UeS²S ¸ËzEc2

Попытайся

¸¬è\L ?`...`:UeS²S ¸ËzEc2     :Implicit input of string U
¸                             :Split on spaces
 ¬                            :Join
  è                           :Count occurrences of
   \L                         :RegEx /[^A-Z]/gi
      ?`...`:                 :If truthy return the compressed string "Sentence must only use letters", else
             Ue               :Recursively replace in U
               S²S            :  Two spaces with one
                   ¸          :Split on spaces
                    Ë         :Map each element at 0-based index E
                     z        :  Rotate clockwise by 90 degrees multiplied by
                      Ec2     :    E rounded up to the nearest multiple of 2
                              :Implicit output, joined with spaces
мохнатый
источник
0

05AB1E , 36 байт

ðKDáÊi“¸–ƒ—€É€Å™ê“.ªFë#áεN4%>2÷iR]ðý

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

Выдает следующую ошибку, когда входные данные не только содержат [A-Za-z ]:

(RuntimeError) Не удалось преобразовать предложение, должны использовать только буквы в целое число.

Объяснение:

ðK                   # Remove all spaces from the (implicit) input-string
  Dá                 # Create a copy, and remove everything except for letters from this copy
    Êi               # If the copy with letters removed and the original are NOT equal:
      “¸–ƒ—€É€Å™ê“   #  Push dictionary string "sentence must only use letters"
                   #  With sentence capitalization
      F              #  And try to loop that many times, causing the error above
     ë               # Else:
      #              #  Split the (implicit) input-string on spaces
       á             #  Only keep letters (which will remove empty items caused by multiple
                     #  adjacent spaces in the input, which is shorter than `õK`)
        ε            #  Map each word to:
         N4%>2÷      #   Calculate ((index modulo-4) + 1) integer-divided by 2
                     #   (results in 0,1,1,2,0,1,1,2,0,1 for indices 0,1,2,3,4,5,6,7,8,9)
               i     #   If this is exactly 1:
                R    #    Reverse the current word
     ]               # Close the if-statement, map, and if-else statement
      ðý             # Join the modified word-list by spaces
                     # (and then output it implicitly as result)

Смотрите этот 05AB1E наконечник шахты (раздел Как использовать словарь? ) , Чтобы понять , почему “¸–ƒ—€É€Å™ê“это "sentence must only use letters".

Кевин Круйссен
источник
0

PHP , 147 байт

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))throw new Exception('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

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

Или, если die()это приемлемо как «Исключение»:

PHP , 131 байт

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))die('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

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

640 КБ
источник