Світ закінчується в ред


21

Знімається прямо з конкурсу зимового програмування ACM 2013. Ви людина, яка любить сприймати речі буквально. Тому для вас - кінець Світу; останні літери "The" і "World" об'єднані.

Створіть програму, яка бере речення, і виведіть останню букву кожного слова в цьому реченні якомога менше місця (найменше байтів). Слова відокремлені чим-небудь, крім букв з алфавіту (65 - 90, 97 - 122 на таблиці ASCII), що означає, що підкреслення, тильди, могили, фігурні дужки тощо є роздільниками. Між кожним словом може бути більше одного сепаратора.

asdf jkl;__zxcv~< vbnm,.qwer| |uiop-> flvmrp
pigs, eat dogs; eat Bob: eat pigs-> ststbts
looc si siht ,gnitirw esreveR-> citwR
99_bottles_of_beer_on_the_wall->sfrnel


Чи можете ви додати тестовий випадок, включаючи цифри та підкреслення?
grc

10
Світ закінчується в ед? Я знав, що vim і Emacs не змогли виміряти!
Джо З.

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

Чи будуть входи лише ASCII?
Phil H

Відповіді:


16

Perl 5, 18 байт

s/\pL*(\pL)|./$1/g

Потрібен -pперемикач командного рядка. Названа властивість Lвідповідає лише символам літер A-Za-z. Існує кілька сотень таких іменованих властивостей, але при роботі з текстом ASCII дуже мало їх цікаво. Окрім того \pL, єдина інша реальна примітка \pP, яка відповідає пунктуації.

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


Perl 5, 17 байт

Покращення в один байт Дом Гастінгс

print/\pL*(\pL)/g

Потрібна -n-lдля підтримки декількох входів).

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


Використання зразка

$ more in.dat
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
99_bottles_of_beer_on_the_wall

$ perl -p ends-in-ed.pl < in.dat
flvmrp
ststbts
citwR
sfrnel

Я думаю, що \wтакож відповідає цифрам і підкреслюється.
grc

Хм, справді. Це потрібно буде оновити.
примо

2
Блискуча. Регекс був очевидним рішенням, але |.не був очевидним (як мінімум, для мене).
Пітер Тейлор

1
Щойно помітив -1в print/\pL*(\pL)/g, здається, виходить те ж саме для ваших тестових випадків!
Дом Гастінгс

18

ред., 35 символів

s/[a-zA-Z]*\([a-zA-Z]\)\|./\1/g
p
Q

Отже, світ закінчується в ред. Оскільки мені подобається бути занадто буквальним, я вирішив написати рішення, щоб написати рішення з ed - і, мабуть, це насправді мова програмування . Це дивно коротко, навіть якщо врахувати, що в цій темі вже існує багато коротших рішень. Було б приємніше, якби я міг використовувати щось інше [a-zA-Z], однак, враховуючи, що Ed не є мовою програмування, це насправді досить добре.

По-перше, я хотів би сказати, що це лише розбирає останній рядок у файлі. Можна було б проаналізувати більше, просто введіть ,на початку два перші рядки (цей заданий діапазон "все", на відміну від стандартного діапазону останнього рядка), але це збільшить розмір коду до 37 символів.

Тепер для пояснень. Перший рядок робить саме те, що робить рішення Perl (за винятком підтримки без символів Unicode). Я не копіював рішення Perl, я просто вигадав щось подібне за збігом обставин.

Другий рядок друкує останній рядок, щоб ви могли бачити вихід. Третій рядок змушує вийти - я повинен це зробити, інакше edнадрукував би, ?щоб нагадати, що ви не зберегли файл.

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

ed -s testcase < program

-sмовчить. Це запобігає edвиведенню некрасивого розміру файлу на початку. Зрештою, я використовую його як сценарій, а не редактор, тому мені не потрібні метадані. Якщо я цього не зробив, Ед показав би розмір файлу, який я не міг запобігти інакше.


Я встановив Ед лише для того, щоб спробувати це.
примо

6

Javascript, 49

alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))

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

Завдяки tomsmeding за гарне покращення.


3
Ви можете, можливо, покращити це, зробивши невідчутливий регістр, наприклад у:alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
tomsmeding

6

С, 78

Гольф:

main(int c,char**s){for(;c=*s[1]++;)isalpha(c)&&!isalpha(*s[1])?putchar(c):0;}

З пробілом:

main(int c,char**s)
{
  for(;c=*s[1]++;)
    isalpha(c)&&!isalpha(*s[1])?putchar(c):0;
}

Вихід:

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


1
Ви можете зберегти 4 байти за допомогою декларації K&R та дефолту c:main(c,s)char**s;{for
Toby Speight,

5

GNU Sed, 40 38 37

s/[a-z]\b/&\n/g; s/[^\n]*\(.\)\n/\1/g

Тестування

cat << EOF > data.txt
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
EOF

Виконати sed:

sed 's/[A-Za-z]\b/&\n/gi; s/[^\n]*\(.\)\n/\1/g' data.txt

Вихід:

flvmrp
ststbts
citwR

Пояснення

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

Редагувати

  • Використовуйте нечутливий до регістру прапор (-2), завдяки манатурності .
  • Не рахуйте пробілів (-1).

sed«S sкоманда має iпрапор для випадків нечутливим відповідності: s/[a-z]\b/&\n/gi.
манатура

@manatwork: хороший момент, це зробило б це лише GNU sed, але, здається, це вже є, дякую.
Тор

\bвважає _s буквою, тож якщо якісь слова в тесті END з _, остання літера цього слова не включена у висновок
Marty Neal

3

Греп і Паст, 36 34 28

> echo 'asdf jkl;__zxcv~< vbnm,.qwer| |uiop' | grep -io '[a-z]\b' | tr -d \\n
flvmrp

> echo 'pigs, eat dogs; eat Bob: eat pigs'   | grep -io '[a-z]\b' | tr -d \\n
ststbts

echo 'looc si siht ,gnitirw esreveR'         | grep -io '[a-z]\b' | tr -d \\n
citwR

Якщо потрібен остаточний новий рядок, замініть tr -d \\nна paste -sd ''.

Редагувати

  • Використовуйте нечутливий регістр греп (-2), завдяки манатурності .
  • Використовуйте trзамість paste(-4), завдяки манатурності .
  • Не рахуйте пробілів навколо труби (-2).

Досить творчий з цим paste -sd '', але tr -d \\nкоротший. Що стосується grep, він має -iперемикач значення «ігнорувати регістр», який може зробити його коротше: grep -io '[a-z]\b'.
манатура

@manatwork, trтакож видаліть заключний новий рядок. Режим нечутливого до справи, звичайно, коротший, дякую.
Тор

не існує правила, яке вимагає остаточного нового рядка.
манатура

@manatwork: Я можу погодитися з цією оновленою відповіддю.
Тор

3

sed, 37 chars

Дорівнює довжині відповіді Тор , але, я думаю, простіше.

s/[a-z]*\([a-z]\)/\1/ig;s/[^a-z]*//ig

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


3

Математика, 39

""<>StringCases[#,(__~~x_)?LetterQ:>x]&

Тест:

""<>StringCases[#,(__~~x_)?LetterQ:>x]& /@
 {"asdf jkl;__zxcv~< vbnm,.qwer| |uiop",
  "pigs, eat dogs; eat Bob: eat pigs",
  "looc si siht ,gnitirw esreveR",
  "99_bottles_of_beer_on_the_wall"}
{"flvmrp", "ststbts", "citwR", "sfrnel"}

Хороший. LetterQслід називати LettersQ:) Я не думав про це для тестування цілих рядків.
Доктор Белісарій

@belisarius Власне, з цією конструкцією він застосовується символом, тому він може бути буквальним "LetterQ" і все ще працювати.
Mr.Wizard

2

К, 49

{last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}

.

k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"looc si siht ,gnitirw esreveR"
"citwR"

2

Скала, 59 (або 43)

Припустимо, що рядок уже в s:

s.split("[^a-zA-Z]+").map(_.last).mkString

Якщо вам потрібно читати з підказки та друкувати, а не використовувати висновок REPL, перетворіть sна нього readLineта заверніть println()59.


2

x86: 54 байти

Припустимо процедуру cdecl з підписом void world_end(char *input, char *output):

60 8b 74 24 24 8b 7c 24 28 33 d2 8a 0e 8a c1 24
df 3c 41 72 08 3c 5a 77 04 8a d1 eb 09 84 d2 74
05 88 17 47 33 d2 46 84 c9 75 e0 84 d2 74 03 88
17 47 88 0f 61 c3

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

2

Xi, 32

println$ @{=>.-1}<>input re"\W+"

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


2

Математика 62 57 52

Row@StringTake[StringCases[#,LetterCharacter..],-1]&

Тестування

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", 
     "pigs,eat dogs;eat Bob:eat pigs", 
     "looc si siht,gnitirw esreveR"}

Row@StringTake[StringCases[#,LetterCharacter..],-1]&/@ l
(*{flvmrp,ststbts,citwR}*)

Я помилково відредагував вашу, але потім відкотив її назад. Ооопс.
DavidC

2

Python3, 59 символів

import re;print(re.sub('.(?=[a-z])|[^a-z]','',input(),0,2))

Правильно має справу з великими літерами та підкресленнями. 2 повинен пройти re.subна re.IGNORECASEпрапор без необхідності використання re.I.


2

Пітона, 76 символів

import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))


Ви можете видалити пробіл після print.
flornquake

Скоротіть, перейшовши на Python 3:import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Steven Rumbalski

1

Python 3.x, 64 байти

import re;print(''.join(a[-1] for a in re.split('\W+',input())))

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

Ви можете видалити пробіл раніше for.
Бакуріу


1

Математика 71 47 45 61

Після повернення до @belisarius знайшли помилку в коді.

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" &

Тестування

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", "asdf jkl__zxcv~<vbnm,.qwer| |uiop", 
"pigs,eat dogs;eat Bob:eat pigs", "looc si siht,gnitirw esreveR"};

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" & /@ l

{"flvmrp", "flvmrp", "ststbts", "citwR"}


\\wвідповідає _, тому це не працює (наприклад)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Dr. belisarius

Почекайте, Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"дає мені flvmrp, але #~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"повертається fvmrpсюди. Ми отримуємо однакові результати ??
Доктор Белісарій

@belisarius Ви мали рацію щодо помилки в моїй попередній версії. Я тестував це неправильною стрічкою!
DavidC

Hehe, +1 ще раз
Dr. belisarius

@belisarius хлопці, будь ласка, дивіться відповідь, яку я опублікував. Якщо це правильно, це коротше.
Mr.Wizard

1

Пітон 2, 88 80 75 69 68

s=p=''
for c in raw_input()+' ':a=c.isalpha();s+=p[a:];p=c*a
print s

Вхід: 435_ASDC__uio;|d re;fG o55677jkl..f

Вихід: CodeGolf


Це рішення можна скоротити до 67 символів, якщо ви дозволите, щоб у вихідний сигнал було включено символи зворотного простору (ASCII код 8) на початку. Вихід буде візуально однаковим.

s=p='<BS>'
for c in raw_input()+p:a=c.isalpha();s+=p[a:];p=c*a
print s

Той самий вхід, (візуально) той же вихід. <BS>мається на увазі як символ зворотного простору.


1

C #

Метод, 105 байт: (передбачає вживання для System, System.Text.RegularExpressions та System.Linq)

string R(string i){return string.Concat(Regex.Split(i,"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last()));}

Програма, 211 байт:

using System;using System.Text.RegularExpressions;using System.Linq;class A{static void Main(){Console.WriteLine(string.Concat(Regex.Split(Console.ReadLine(),"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last())));}}

1

VBA, 147 161

Sub a(s)
For n=0 To 255:m=Chr(n):s=Replace(s,IIf(m Like"[A-Za-z]","",m)," "):Next
For Each r In Split(s," "):t=t & Right(r,1):Next
MsgBox t
End Sub

1

Ruby 2.0, 25 (+1) символів

gsub(/(\w+)\W*/){$1[-1]}

Потрібно запустити за допомогою -pперемикача:

 $ ruby -p ed.rb <<< "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
flvmrp

Вкажіть, будь ласка, rubyверсію. 1.9.2 виводи "# <Перелік: 0x9f65e10> # <Перелік: 0x9f65d98> # <Перелік: 0x9f65d34> # <Перелік: 0x9f65cd0>".
манатура

Ти правий. Я зовсім забув, що встановив його, але моя поточна версія Ruby - 2.0 ( ruby 2.0.0p0 (2013-02-24 revision 39474). При запуску програми з версією 1.8.7 вона виводить значення ASCII! Не знав, що між версіями існує стільки відмінностей.
daniero

Дякую, обов'язково доведеться оновити мій Ruby. (. І перекладач і знання) Друга група записи не є необхідною: gsub(/(\w+)\W*/){$1[-1]}.
манатура

О, звичайно, це не так. Дякую, оновлено :)
daniero



1

Java 8, 43 байти

s->s.replaceAll("(?i).(?=[a-z])|[^a-z]","")

Порт @ mbomb007 «и Retina відповідь .

Пояснення:

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

s->  // Method with String as both parameter and return-type
  s.replaceAll("(?i).(?=[a-z])|[^a-z]","")
     //  Remove every match of this regex, and return as result

Додаткове пояснення для регулярного вираження:

"(?i).(?=[a-z])|[^a-z]"  // Main regex to match
 (?i)                    //  Case insensitive
     .                   //   Any character
      (?=[a-z])          //   Followed by a letter (as positive look-ahead)
               |[^a-z]   //   or a non-letter

""                       // Replace it with: nothing

1
Це насправді (?i)для прапора.
Якоб

0

Smalltalk , Squeak / Pharo аромат
122 char із традиційним форматуванням цього методу, доданого до String:

endOfWords
    ^(self subStrings: (CharacterSet allCharacters select: #isLetter) complement) collect: #last as: String

62 символи в Pharo 1.4, з регулярним виразом та дивним форматуванням

endOfWords^''join:(self regex:'[a-zA-Z]+'matchesCollect:#last)

0

J: 60 символів (або 38 символів для менш правильної версії)

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0

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

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:

Проба зразка:

    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'asdf jkl;__zxcv~< vbnm,.qwer| |uiop'
flvmrp
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'pigs, eat dogs; eat Bob: eat pigs'
ststbts
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'99_bottles_of_beer_on_the_wall'
sfrnel

1
38 байт (для правильної версії): (#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:або 43 байта для не-явної версії: (#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:. Для цього використовується дієслово індексу інтервалу I., яке інтерпретується 64 90 96 122як набір інтервалів (__, 64] (64, 90], (90, 96], (96, 122], (122, _), і повертає індекс ітерації, до якого належить його аргумент, код ascii char. Якщо цей індекс непарний, це не за алфавітом.
Bolce Bussiere

@BolceBussiere чомусь не працює з підкресленнями (останній тестовий випадок).
FrownyFrog

@FrownyFrog ах, я розумію, чому, ;:інтерпретує abc_як одне слово, оскільки імена змінних можуть містити підкреслення. +10 байт, щоб додати (#~~:&'_'), ймовірно, неефективне виправлення
Bolce Bussiere

@BolceBussiere це просто '_'-.~щось подібне.
FrownyFrog

0

Це в PHP . 197 байт :( Я початківець

$l=$_GET['line'];
$l=preg_replace('/(\W|_)+/',' ',$l);
$s=explode(' ',$l);
foreach($s as $d){
$a=substr($d,-1,1);
$o=ORD($a);
if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){
echo $a;
  }
}

ВИДАЛЕНО Зараз це 171 байт

<?$l=$_GET['l'];$l=preg_replace('/(\W|_)+/',' ',$l);$s=explode(' ',$l);foreach($s as $d){$a=substr($d,-1,1);$o=ORD($a);if(($o>=97&&$o<=122)||($o>=65&&$o<=90)){echo$a;}}

1
Що стосується гольфу, вам слід якомога менше зменшити свої імена змінних до одиничних символів.
Гаффі

1
редагував це. Дякую, що мені сказали. Я тут новий.
Сасорі

Звичайно. Ви також можете шукати тут додаткову допомогу, що стосується PHP.
Гаффі

foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}це 149, якщо це працює.
Чарівний восьминога Урна

\W|_виключає цифри; тож вам слід додати \dдо свого регексу або використовувати/[^a-z]+/i
Тит

0

К 30

q)k)f:{x@&-1=-':(1_x," ")in,/.Q`a`A}
q)f "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
q)f "pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
q)f "looc si siht ,gnitirw esreveR"
"citwR"
q)f "99_bottles_of_beer_on_the_wall"
"sfrnel"

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