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


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^!\[\]{}@$%+=]+$.


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


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

10

Mathematica, 13 22 байта

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

FileExtension["a"<>#]&

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


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

Пакетный, 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

Go , 85 байт

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

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

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

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

()(){([])([()])}

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

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

3

Javascript (ES5), 38 байт

function(s){return s.split(".").pop()}

2
Точно так же, вы знаете, что пользователь сообщества автоматически произнес отрицательный ответ при редактировании вашего ответа. Я считаю это ошибкой .
Денис

Пожалуйста, исправьте это, если можете!
согрешивших

3

C #, 33 41 байт

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

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

using System.Linq;a=>a.Split('.').Last();

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

Вам не нужно ;. и просто к сведению, awk '{$0=$NF}1 работает, опция командной строки не требуется. Ох ... Я должен быть уставшим. Я вижу что ты тут делал. Вам нужна опция командной строки.
Роберт Бенсон

1
Спасибо, @RobertBenson. Я понятия не имею, почему я положил это ;туда.
manatwork


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?\.


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

Он-лайн тест


2

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

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

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

Онлайн демо

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.