Що розширення файлу?


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
Будь ласка, подумайте про використання пісочниці в майбутньому, щоб отримати зворотній зв'язок щодо ваших проблем, перш ніж надсилати їх на головний сайт.
Мего


@carusocomputing приємний виклик!
програміст5000

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

Математика, 13 22 байти

Редагувати: Не впевнений, як я пропустив ".bashrc"тестовий випадок. Дякую Artyer, що тримав мене чесно.

FileExtension["a"<>#]&

Якщо введення збігається \.[^.]+, то FileExtensionпросто повертає порожній рядок, тому ми додаємо буква a. У будь-якому іншому випадку попереднє відтворення aне впливає на вихід FileExtension.


11
Математика побудована ... не дивно.
програміст5000

1
Я був би здивований, якби не було вбудованої математики для будь-якого питання
sagiksp

Я не маю доступу до Mathematica, але я б підозрював, що .extце не призведе до нічого, що піддається .bashrcнеобхідності виводити bashrc(Це не вдається в Mathics )
Artyer


Mathematica просто потребує мета-вбудованих модулів Create Built-in XXXXXXXX.
Чарівна восьминога урна




7

c функція, 21

  • 1 байт збережено завдяки @Dennis.
  • 3 байти збережено завдяки @JohanduToit.
  • 2 байти збережено завдяки @Neil.
  • 1 байт збережено завдяки @algmyr.
f(s){s=rindex(s,46);}

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


1
Якщо у вас все в порядку з використанням застарілих функцій POSIX, ви можете використовувати rindexдля збереження байта.
алгмір

@algmyr Звичайно, він прекрасно працює на TIO, тому я його використовуватиму. Я ніколи раніше не чув rindex()- дякую за пораду!
Цифрова травма

5

PHP, 21 байт

<?=pathinfo($argn,4);

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

- коротший вираз для

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

довідкова інформація

PHP, 27 байт

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

вибухнути

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

PHP <7,0, 26 байт

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

застарілий розкол


1
Чи рахуєте ви перший рядок за першим? Це повинно бути 27 байт, а не 28.
Конор О'Брайен

@ ConorO'Brien Дякую. Я рахую після копіювання та вставки з розділеної версії a ``
Jörg Hülsermann

2
Основою pathinfo()може бути <?=pathinfo($argn,4);.
манатура



4

Пакет, 10 байт

@echo %~x1

Дивно конкурентоспроможний один раз.


4

V , 5 , 3 байти

Оскільки більшу частину цієї відповіді не можна друкувати, ніж друкувати, ось шістнадцятковий набір:

00000000: cd81 ae                                  ...

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

Тут використовується алгоритм Яна Дворака , просто ефективніше кодування його.

Пояснення:

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

Старе рішення:

$T.d|

Пояснення, будь ласка?
Ерік Аутгольфер

@EriktheOutgolfer Готово
Джеймс

Зачекати ®означає, що йде за крапкою? Лол, що дивно.
Ерік Аутгольфер



3

Ідіть , 85 байт

Іти - це клопітно.

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

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

Зразок дужок з коду:

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

2
()(){([])([()])}- це дійсний Брейн-Флак?
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

Лист звичайний, 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

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

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

Вам це не потрібно ;. і просто FYI, awk '{$0=$NF}1 працює, опція командного рядка не потрібна. О ... я, мабуть, втомився. Я бачу, що ви там робили. Вам потрібен варіант командного рядка.
Роберт Бенсон

1
Дякую, @RobertBenson Я поняття не маю, чому я туди поставив ;.
манастирські роботи


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

Мозок-Флак , 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

Онлайн-тест


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