Какое расширение файла?

10

Ваша задача состоит в том, чтобы найти расширение файла с указанным именем файла:

hi.txt -> txt or .txt
carrot.meme -> meme or .meme
lol (undefined behavior)
what..is..this..file -> file or .file
.bashrc -> bashrc or .bashrc
T00M@n3KaPZ.h0wC[]h -> h0wC[]h or .h0wC[]h
agent.000 -> 000 or .000

Вы должны получить текст от последнего . или после последнего .до конца строки. Первое совпадение группы захвата регулярного выражения /\.([^.]+)$/работает, также как и разделение ввода по .s и возвращение последнего.

Имя файла всегда будет содержать хотя бы одно ., но оно может содержать несколько .. (см. примеры)

Ввод всегда будет совпадать ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programmer5000
источник
17
Пожалуйста, рассмотрите возможность использования Песочницы в будущем, чтобы получить отзывы о своих проблемах, прежде чем публиковать их на главном сайте.
Мего
1
codegolf.meta.stackexchange.com/a/12432/59376 - Получил эту идею из вашего испытания.
Волшебная урна осьминога
@carusocomputing хороший вызов!
programmer5000
1
почему отрицательные голоса? Является ли этот вызов "чрезвычайно тривиальным" или так?
Абель Том
История редактирования @AbelTom предполагает, что отрицательные голоса были из-за отсутствия спецификаций в первом проекте этого вопроса.
Патрик Робертс

Ответы:

11

JavaScript (ES6), 19 байт

Возвращает полное имя файла, когда нет расширения файла. Я полагаю, это приемлемое неопределенное поведение .

let f =

s=>s.split`.`.pop()

console.log(f("hi.txt"))               // -> txt
console.log(f("carrot.meme"))          // -> meme
console.log(f("lol"))                  // -> undefined behavior
console.log(f("what..is..this..file")) // -> file
console.log(f("T00M@n3KaPZ.h0wC[]h")) // -> h0wC[]h
console.log(f(".bashrc")) // -> bashrc

Arnauld
источник
Смысл неопределенного поведения в том, что все идет. Хотя носовые демоны, хотя и по-прежнему остаются неопределенными, могут не выполнить условие «нет вредоносных программ».
Джон Дворак
10

Mathematica, 13 22 байта

Изменить: не уверен, как я пропустил ".bashrc"тестовый пример. Спасибо Artyer за честность.

FileExtension["a"<>#]&

Если вход совпадает \.[^.]+, то FileExtensionпросто возвращает пустую строку, поэтому мы добавляем букву a. В любом другом случае добавление aне влияет на вывод FileExtension.

ngenisis
источник
11
Математика встроена ... не удивительно.
programmer5000
1
Я был бы удивлен, если бы не было никаких встроенных mathematica для любого возможного вопроса
sagiksp
У меня нет доступа к Mathematica, но я подозреваю, что .extэто ни к чему не приведет, что не сработает из-за .bashrcнеобходимости вывода bashrcMathics не получится )
Artyer
Mathematica просто нуждается в мета-встроенных модулях Create Built-in XXXXXXXX.
Волшебная Урна Осьминога
7

с функция, 21

  • 1 байт сохранен благодаря @Dennis.
  • 3 байта сохранены благодаря @JohanduToit.
  • 2 байта сохранены благодаря @Neil.
  • 1 байт сохранен благодаря @algmyr.
f(s){s=rindex(s,46);}

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

Цифровая травма
источник
1
Если вы в порядке с использованием устаревших функций POSIX, вы можете использовать rindexдля сохранения байта.
algmyr
@algmyr Конечно, он отлично работает на TIO, поэтому я буду его использовать. Я никогда не слышал rindex()раньше - спасибо за совет!
Цифровая травма
5

PHP, 21 байт

<?=pathinfo($argn,4);

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

это более короткое выражение для

<?=pathinfo($argn)[extension];

PathInfo

PHP, 27 байт

<?=end(explode(".",$argn));

взрываться

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

PHP <7,0, 26 байт

<?=end(split("\.",$argn));

не рекомендуется раскол

Йорг Хюльсерманн
источник
1
Вы рассчитываете завершающий перевод новой строки? Должно быть 27 байтов, а не 28.
Конор О'Брайен
@ ConorO'Brien Спасибо. У меня есть счет после копирования и вставки из сплит-версии a ``
Йорг Хюльсерманн
2
На pathinfo()основании может быть <?=pathinfo($argn,4);.
manatwork
4

GNU Make , 12 байт

$(suffix $1)

Не использует встроенный, 27 байт:

$(lastword $(subst ., ,$1))
eush77
источник
4

Пакетный, 10 байтов

@echo %~x1

Странно конкурентоспособно на этот раз.

Нил
источник
4

V , 5 , 3 байта

Поскольку большая часть этого ответа не печатается, чем печатается, вот hexdump:

00000000: cd81 ae                                  ...

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

Это использует алгоритм Яна Дворака , просто это более эффективная кодировка.

Объяснение:

Í       " Remove all occurrences of:
 0x81   "   Anything (greedy)
     ®  "   Followed by a dot 

Старое решение:

$T.d|
Джеймс
источник
Пояснения пожалуйста?
Эрик Аутгольфер
@EriktheOutgolfer Готово
Джеймс
Ждать ®означает, за которым следует точка? Лол это странно
Эрик Outgolfer
3

Желе , 4 байта

ṣ”.Ṫ

Монадическая ссылка, берущая имя файла и возвращающая расширение без ведущего ..

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

Как?

Буквально делает то, что спросили ...

ṣ”.Ṫ - Main link: list of characters, f
 ”.  - literal '.'
ṣ    - split f at occurrences of '.'
   Ṫ - tail (get the last chunk)
Джонатан Аллан
источник
3

Go , 85 байт

Идти это ... хлопотно.

import(."fmt"
."os"
."strings")
func main(){s:=Split(Args[1],".");Print(s[len(s)-1])}

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

Образец скобок из кода:

()(){([])([()])}
totallyhuman
источник
2
()(){([])([()])}- это действительный Brain-Flak?
eush77
5
@ eush77 Это технически действует Brain-Flak, так как он будет работать без ошибок, но он не делает ничего интересного / полезно. Это либо просто литерал 2без инструкций / команд, либо что-то еще, либо бесконечный цикл, который непрерывно выделяет больше памяти, в зависимости от ввода.
Джеймс
Использование filepath.Extсэкономит вам несколько укусов
Пауэлл
3

JavaScript (ES6), 33 31 28 байт

s=>s.slice(s.lastIndexOf`.`)

Изменение спецификации в комментариях устраняет необходимость +1.

-3 байта благодаря nderscore

Стивен
источник
1
-3 с sliceи выполнение шаблона строки:s=>s.slice(s.lastIndexOf`.`)
nderscore
3

Common Lisp, 57 байт

(lambda(s)(#1=reverse(subseq #2=(#1# s)0(search"."#2#))))

Попробуйте онлайн (добавлено несколько байтов для вызова этой анонимной функции и отображения возвращаемой строки)

объяснение

(#1=reverse ...)     ;reverse is now accessible with #1# - saves 1 byte. I 
                     ;also need to reverse output of function inside to 
                     ;get extension in correct order
#2=(#1# s)           ;reverse of input string is now accessible with #2#
(search"."#2#)       ;I take reversed string and search for "." to get position of 
                     ;first instance of "." in string from the end of it
(subseq ... 0 ...)   ;get part of reversed string, 
                     ;starting from first character and ending just 
                     ;before first occurance of "."
                     ;this gives reversed extension

Я получаю подстроку обратной строки, начиная с 0 и заканчивая этим


источник
3

Гема, 3 персонажа

*.=

Образец прогона:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
manatwork
источник
3

MATL, 8 7 байт

46&YbO)

Попробуйте это в MATL Online !

объяснение

        % Implicitly grab input as string
46      % ASCII for '.'
&Yb     % Split the input string at the '.' characters
O)      % Retrieve just the last part
        % Implicitly print the result
Suever
источник
3

Javascript (ES5), 38 байт

function(s){return s.split(".").pop()}
Sinned
источник
2
Точно так же, вы знаете, что пользователь сообщества автоматически произнес отрицательный ответ при редактировании вашего ответа. Я считаю это ошибкой .
Денис
Пожалуйста, исправьте это, если можете!
согрешивших
3

C #, 33 41 байт

a=>a.Split('.').Last();

Изменить как предложено:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
источник
1
Вы должны включить using Sytem.Linq;в свой счетчик байтов
TheLethalCoder
А также a=>a.Split('.').Last();неявное возвращение короче
TheLethalCoder
@TheLethalCoder Спасибо за предложенные исправления, все еще новичок в этом :)
LiefdeWen
Я удивлен, что это дольше, чем мое решение, использующее Path...
TheLethalCoder
3

Awk, 14 13 символов

( 10 9 символов кода + 4 символа командной строки.)

{$0=$NF}1

Благодаря:

Образец прогона:

bash-4.4$ awk -F. '{$0=$NF}1' <<< $'hi.txt\ncarrot.meme\nlol\nwhat..is..this..file\n.bashrc\nT00M@n3KaPZ.h0wC[]h'
txt
meme
lol
file
bashrc
h0wC[]h
manatwork
источник
Вам не нужно ;. и просто к сведению, awk '{$0=$NF}1 работает, опция командной строки не требуется. Ох ... Я должен быть уставшим. Я вижу что ты тут делал. Вам нужна опция командной строки.
Роберт Бенсон
1
Спасибо, @RobertBenson. Я понятия не имею, почему я положил это ;туда.
manatwork
3

Луа , 53 30 байт

Заменяет все до последнего .пустой строкой ''.

Двойные скобки, чтобы выбрать только первое возвращаемое значение gsub.

Любые советы по гольфу приветствуются, я ржавый в Луа ...

print(((...):gsub('.*%.','')))

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

Фелипе Нарди Батиста
источник
3

Java 8, 52 27 байт

s->s.replaceAll(".*\\.","")

Попробуй это здесь.

Замените все до последней точки (и самой точки) ничем.

Это короче, чем использование split ( s->s.split("\\.")[s.split("\\.").length-1];) или substring ( s->s.substring(s.lastIndexOf('.'));).

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

Такси , 1397 байт

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 1 l 1 r 1 l.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan "b" if no one is waiting.Switch to plan "a".[b]Go to The Babelfishery:n 1 l 1 l.[c]Go to Fueler Up:n.Go to Joyless Park:n 2 r.Go to Narrow Path Park:w 1 r 3 l.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 l 1 r 2 l.Pickup a passenger going to Crime Lab.Pickup a passenger going to Joyless Park.'.' is waiting at Writer's Depot.Go to Writer's Depot:s.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "c" if no one is waiting.Go to Narrow Path Park:n 5 l.[d]Pickup a passenger going to Chop Suey.Go to Chop Suey:e 1 r 1 l 1 r.Go to Narrow Path Park:n 1 l 1 r 1 l.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Joyless Park:e 1 r 3 l.Switch to plan "f" if no one is waiting.Pickup a passenger going to Narrow Path Park.Go to Fueler Up:w 1 l.Go to Narrow Path Park:n 4 l.Switch to plan "e".[f]Go to Narrow Path Park:w 1 r 3 l.[g]Switch to plan "h" if no one is waiting.Pickup a passenger going to KonKat's.Go to KonKat's:e 1 r.Pickup a passenger going to KonKat's.Go to Narrow Path Park:n 2 l.Switch to plan "g".[h]Go to KonKat's:e 1 r.Pickup a passenger going to Post Office.Go to Post Office:s 3 r 1 l.

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

Такси не имеет функции обратного хода, поэтому это быстро раздувается. Логика такова:

  1. Разбить строку на символы
  2. Обратный массив
  3. Итерируйте по каждому, пока не будет найден период, сохраняя каждый в массиве FIFO
  4. Очистить массив (потому что доступен только один массив LIFO)
  5. Дамп массива FIFO в массив LIFO
  6. Объединить массив LIFO и вывод
Инженер Тост
источник
3

Vim, 5 байт

$F.d0

Пояснение: найти последнюю .в строке, удалить все перед ней

Другой, более длинный, но, на мой взгляд, все еще интересный подход с 9 байтами (обратите внимание на трейлинг новую строку)

d/.*\./e

Этот работает аналогично, 5 байтов (опять же, трейлинг новой строки):

d?\.

oktupol
источник
2

Мозг-Flak , 84 байта

Включает +2 для -rc

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

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

# Push 1 to start the loop
(())

# Start loop
{{}

  # If TOS == 46 i.e. '.'
  ([((((()()()){}())()){}{}){}]({}<>)<>)({()(<{}>)}{})
  # ^------------------------^ ^-------^ 
  #           This is 46         Also, copy TOS to other stack

# End loop after the first '.'
}{}

# Delete everything from this stack
{{}}

# Delete the '.' that got copied
<>{}

# Copy everything back to reverse it to the correct order
{({}<>)<>}<>
Райли
источник
2

Japt , 6 5 байт

q'. o

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

объяснение

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Люк
источник
Когда вам нужно только вернуть последний элемент массива, вы можете использовать oвместо gJ. (Узнал этот трюк от @obarakon некоторое время назад)
ETHproductions
2

JQ, 15 14 символов

( 11 10 символов кода + 4 символа параметров командной строки.)

./"."|last

Образец прогона:

bash-4.4$ jq -Rr './"."|last' <<< 'what..is..this..file'
file

Он-лайн тест

manatwork
источник
2

Октава, 24 байта

@(x)strsplit(x,'.'){end}

Создает анонимную функцию с именем, ansкоторая может принимать строку в качестве ввода

Онлайн демо

Suever
источник