Команда котенка


65

Котенок очень похож на кота. Некоторые из основных отличий - привлекательность, недостаток интеллекта и размер. Точно так же catкоманда отличается от kittenкоманды. К счастью, в этом случае есть только одно отличие. В команде «котенок» все заглавные буквы заменяются строчными.


Задача

Для реализации программы, которая ведет себя аналогично cat. Все символы [A-Z]выводятся в нижнем регистре.


вход

Список файлов в качестве аргументов командной строки. Если в списке нет файлов, считайте из стандартного ввода. Входные данные могут содержать непечатаемые символы и символы вне диапазона ASCII.


Выход

Если входные данные представляют собой набор файлов, объедините содержимое и выведите все символы в нижнем регистре. При чтении из STDIN выведите содержимое STDIN со всеми заглавными буквами в нижнем регистре.

Примечание: делайте символы только [A-Z]строчными. Это недопустимо, если любые другие символы сделаны строчными.


Примеры

$ echo "HelLo" > file.txt
$ kitten file.txt
hello
$ echo "Good Bye" | kitten
good bye
$ echo "Ä" | kitten
Ä

Как обычно с , выигрывает наименьшее количество байтов.

Leaderboards


Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
Вы явно [A-Z]ожидаете ввода Unicode, явно указав «Только нижний регистр символов»?
AdmBorkBork

2
@TimmyD Да, но это главным образом для того, чтобы люди не могли использовать встроенные функции в нижнем регистре.
TheNumberOne

3
@FryAmTheEggman Постоянная ссылка
Деннис

1
Как насчет того Ü, Ñи любит?
Мачта

2
Это так приятно, когда ты вообще не видишь Пита в загоне ...
jmm

Ответы:


52

Perl, 6 байт

5-байтовый код + 1-байтовая командная строка

$_=lc

Пример использования:

echo ABCdef | perl -p kitten.pl
abcdef

Подтверждение правильного поведения Unicode:

echo "HelloÉ" | perl -p kitten.pl
helloÉ

2
Вы уверены, что это не влияет на символы Юникода?
Мартин Эндер

7
@ MartinBüttner Это не так . Мы находимся в категории «иначе»: «Правила ASCII используются для изменения регистра. Нижний регистр любого символа вне диапазона ASCII - это сам символ ». Мой +1 за ответ.
xebtl

178

Баш, 19 байт

cat "$@"|tr A-Z a-z

Лучший способ сделать котят - использовать настоящих кошек.

Пример запуска

$ ./kitten kitten
cat "$@"|tr a-z a-z

39
Правильный инструмент для работы.
Цифровая травма

120
+1 за то, что для котенка нужна только одна кошка, я всегда
беру

4
Теперь это напоминает мне эти man womanшутки ...
xebtl

2
+1 за клонирование кошки, а не спаривание, способ создания потомства
MD-Tech

25
@SnoringFrog Он избил другого.
TheNumberOne

22

Perl, 11 байт

10-байтовый код + 1-байтовая командная строка

y/A-Z/a-z/

Пример использования:

perl -p entry.pl input1.txt input2.txt
echo "ABCdef" | perl -p entry.pl


11

Рубин, 13 байт

Количество байтов включает 1 байт для pфлага. Запустите его следующим образом: ruby -p kitten.rb.

$_.downcase!

Принимает данные из аргументов стандартного файла или файла, как взрослый кот.


Означает ли это только нижний регистр ASCII или другие символы Ä?
Пауло Эберманн

1
@ PaŭloEbermann: Я только что проверил это: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Нил Слэйтер

Я клянусь, что было много комментариев здесь относительно этого вчера. Я не знаю, куда они делись, но: Да, это работает в соответствии со спецификацией.
Даниеро

5

PowerShell, 112 байт

function l([string]$a){97..122|%{[char]$b=$_;$a=$a-split$b-join$b};$a}if($args){$args|%{l(gc $_)}}else{l $input}

Ужасно нечитаемый Вот немного расширенная версия ниже:

function l([string]$a){
  97..122|%{
    [char]$b=$_
    $a=$a-split$b-join$b
  }
  $a
}

if($args){
  $args|%{
    l(gc $_)
  }
}
else{
  l $input
}

Определяет внутреннюю функцию, lкоторая перебирает цикл от 97 до 112 (то есть, от ASCII aдо ASCII z). Разбивает входную строку над этим символом (yay регистронезно по умолчанию), объединяет его с «правильным» нижним регистром. Обратите внимание, что да, это означает, что «Test» кратко станет «T st», так как он e, например, выполняет итерации . Не влияет на вывод.

Вторая половина - хитрость, чтобы выяснить, есть ли у нас конвейерный ввод (эквивалентный stdin для PowerShell) или ввод из командной строки. Специальная переменная $argsприсутствует только в том случае, если присутствует ввод из командной строки, поэтому мы перебираем каждый из них gc(для Get-Content) и отбрасываем его до l. В противном случае, мы просто подонок наш $inputдо l. Обратите внимание, что мы могли бы поменять местами наши операторы if / else (то есть, if($input)), но поскольку «input» на один символ длиннее, чем «args», этот путь короче.


@Nazek Встроенный "String".ToLower()также строчные символы Юникода, что противоречит правилам. Есть много вещей, которые PowerShell не делает правильно в отношении Unicode, но, к сожалению, это один из примеров того, что он работает правильно.
AdmBorkBork


5

R, 97 байт

cat(chartr("A-Z","a-z",sapply(if(length(a<-commandArgs(T))){a}else{"stdin"},readLines)),sep="\n")

Использование:

$ echo "HeLlo" > file.txt
$ Rscript kitten.R file.txt
hello
$ echo "Good Bye" | Rscript kitten.R
good bye
$ echo "bLABLa" > file2.txt
$ Rscript kitten.R file.txt file2.txt
hello
blabla
$ echo Ä | Rscript kitten.R
Ä

5

CoffeeScript , 292 байта

f=require 'fs';d='';p=process;v=p.argv;s=p.stdin;l=((d)=>console.log d.replace /([A-Z])/g,(a,l)=>l.toLowerCase());if v.length>2 then(v.forEach (v,i)=>if i>1 then(f.exists v, (e) =>if e then(f.readFile v,'utf-8',(r,d)=>l d) else l v))else(s.resume();(s.on 'data',(c)=>d+=c);s.on 'end',()=>l d)

Использование:

$ echo "HelLo" > file.txt
$ coffee kitten.coffee file.txt
hello
$ echo "Good Bye" | coffee kitten.coffee
good bye
$ echo "Ä" | kitten
Ä
$ coffee kitten.coffee file.txt SoMeTeXt
sometext
hello

Мое первое участие в Codegolf, так что, пожалуйста, не будь грубым :).

Конечно, этот код можно использовать больше, и кофе / javascript не лучший выбор, но он делает то, что ожидал.

Когда он читает аргументы, он также заботится о существовании файла (если файл не существует, строка задается).

Любая помощь или совет по улучшению этого кода приветствуется!


4

Юлия, 123 байта

f(s)=for l=readlines(s) print(replace(l,r"[A-Z]",lowercase))end
A=ARGS
length(A)>0?for i=A open(f,i)end:open(f,readline())

Ungolfed:

function file_to_lower(s::Stream)
    # Loop over the lines of the input stream
    for l in readlines(r)
        # Print the lowercased line
        print(replace(l, r"[A-Z]", lowercase))
    end
end

if length(ARGS) > 0
    # Loop over the files specified from the command line
    for i in ARGS
        # Open the file, apply the function, then close it
        open(file_to_lower, i)
    end
else
    # Get the input file from STDIN
    open(file_to_lower, readline())
end

4

CJam, 18 байт

ea_:gs{q}?'_,_eler

Список файлов должен быть представлен в виде URL-адресов, что является единственным форматом, который понимает CJam.

Пример работает

$ cjam kitten <<< "AaÁáÄä"
aaÁáÄä
$ cjam kitten file:///home/dennis/kitten file:///home/dennis/kitten
ea_:gs{q}?'_,_elerea_:gs{q}?'_,_eler

Как это устроено

ea                  Push the array of command-line arguments.
  _                 Push a copy.
   :g               Retrieve the contents of all files with those URLS.
     s              Flatten the resulting array of strings.
      {q}           Push a block that reads all input from STDIN.
         ?          Select the string of the array of args is non-empty.
                    Otherwise, execute the code block.
          '_,       Push the string of all ASCII characters before _.
             _el    Push a copy and convert it to lowercase.
                er  Perform transliteration.

4

Python 2, 100 102 97 байт

Функциональность исправлена ​​(и добавлено 4 байта) с помощью matsjoyce. К счастью, я сохранил два байта, переключившись на Python 2.

from sys import*;print''.join(f.read().lower()for f in(map(open,argv[1:])if argv[1:]else[stdin]))

Принимает аргументы из командной строки или из STDIN, если аргументы не найдены.

Это злоупотребляет аргументами по умолчанию некоторых функций. По умолчанию openиспользуется текстовый режим только для чтения, который является именно тем, что мы хотим. read, если вызывается без аргументов, вернет весь текст в потоке.

Ungolfed:

import sys

if len(sys.argv) > 1:              # If we have command-line arguments:
    source = []                    # Initialize an empty list
    for path in sys.argv[1:]:      # Iterate through every filename we have
        kitfile = open(path, 'rt') # Open the file in read-only text mode
        source.append(kitfile)     # Add it to the list
else:                              # Otherwise, if the args are empty:
    source = [sys.stdin]           # Set our source to STDIN wrapped in a list

kittened = []                      # Initialize an empty list
for kitfile in source:             # Iterate through every file (or just STDIN)
    text = kitfile.read()          # Read everything from the stream
    kitten_text = text.lower()     # Make it lowercase
    kittened.append(kitten_text)   # Add it to the list
final = ''.join(kittened)          # Join everything together
print final                        # Print the result

1
Это не будет работать для стандартного ввода, так как вы читаете только одну строку и не пишете ее строчными буквами
matsjoyce

@matsjoyce Я исправил свой код. Спасибо за напоминание! К сожалению, он добавил четыре байта, но больше не зависел от inputотсутствия оценки, я мог бы переключиться на Python 2 и удалить скобки print.
bkul

3

Python 3, 124 123 байта


from sys import*
for f in list(map(open,argv[1:]))or[stdin]:print(f.read().translate({i:i+32for i in range(65,91)}),end="")

Питон ест котят!

$ python kitten.py file.txt
hello
$ echo "Good Bye" | python kitten.py 
good bye
$ echo "Ä" | python kitten.py 
Ä

3

C 106 108 байт

Редактировать: Исправлена ​​ошибка, которая появлялась при сжатии байтов. Stdin не работал, теперь это так.

Я почти уверен, что смог бы сжать несколько байтов, но вот легкое для восприятия, совсем не оскорбительное выражение:

main(n,s,f,c)void**s;{for(f=n-1?open(*++s,0,0):0;read(f,&c,1);putchar(64<c&c<91?c+32:c));n-->2&&main(n,s);}

И несколько более аккуратно отформатированная версия для чтения:

main(n,s,f,c)
void**s;
{
    for(f=n-1?open(*++s,0,0):0; read(f,&c,1); putchar(64<c&c<91?c+32:c));
    n-->2&&main(n,s);
}

+1, потому что это научило меня тому, что неявные параметры int возможны только с синтаксисом K & R.
Феликс Домбек

2

Mathematica, 66 байт

kit=StringReplace[#,x:RegularExpression["[A-Z]"]:>ToLowerCase[x]]&

Называется

kit@"HelLo"

Mathematica уже имеет ToLowerCaseфункцию, но она также преобразует специальные (Unicode и математические) символы. Так что мне пришлось его котировать. Эта функция будет принимать любой вход.


@TheNumberOne - вот как это работает в Mathematica. Для этого не нужно больше кода. Если вам нужен исполняемый файл, то Mathematica - не инструмент.
Вербея

Это объединяет файлы, имена которых вводятся как аргументы командной строки, как требуется?
msh210

Аргументы командной строки не существуют в Mathematica. Он сопутствует своим функциональным входам. Также вам не нужно присваивать переменную.
CalculatorFeline

2

C #, 230 226 байт

namespace System{using Linq;class P{static void Main(string[]a){Console.Write(string.Concat((a.Length>0?string.Concat(a.Select(f=>IO.File.ReadAllText(f))):Console.In.ReadToEnd()).Select(c=>c>'@'&&c<'['?char.ToLower(c):c)));}}}

Ungolfed:

namespace System
{
    using Linq;
    class P
    {
        static void Main(string[] a)
        {
            Console.Write(                                                  // Print...
                string.Concat(                                                  // ...all chars combined to a string...
                    (a.Length > 0 ?                                             // ...commandline arguments?...
                        string.Concat(a.Select(f => IO.File.ReadAllText(f))) :  // ...then all files as single string...
                        Console.In.ReadToEnd()                                  // ...else STDIN input
                    ).Select(c => c > '@' && c < '[' ? char.ToLower(c) : c)     // ...Lowercase only A..Z
                )
            );  
        }
    }
}

2

Хаскелл, 133

import System.Environment
main=getArgs>>=mapM_(>>=putStr.map l).f
f[]=[getContents]
f n=map readFile n
l x=[x..]!!sum[32|x>'@',x<'[']

Обработка арг в стиле кошки происходит из этого урока , а затем перестраивается для бритья персонажей.

Поясняю l, функция в нижнем регистре один символ:

  • sum[32|condition]это более короткая форма if condition then 32 else 0.
  • [x..]!!countis iterate succ x !! countis toEnum $ fromEnum x + countи короче, чем импорт и использование Data.Char.toLowerс условием ограничить его до ASCII.
  • '@'и '['являются ли символы непосредственно предшествующими Aи последующими Z, чтобы я мог использовать <вместо <=.

Спасибо Anders Kaseorg за помощь sum[...|...]и [x..]!!трюки.


1
l x=[x..]!!sum[32|x>'@',x<'[']
Андерс Касеорг

1

C #, 342 байта

  • принимает список файлов из переданных аргументов.
  • читать каждый символ в каждом файле, который преобразуется только в нижний регистр, если и только если символ в диапазоне A..Z, чем отправить его в STDOUT.
  • Если нет списка файлов, который читает STDIN, читает каждый символ, преобразуется в нижний регистр тогда и только тогда, когда символ в диапазоне A..Z, чем отправить его в STDOUT.
namespace System{
using IO;
using Linq;
class P{
static void Main(string[]a){
Action<char>e=C=>{var c=char.ToLower(C);Console.Out.Write(c>='a'&&c<='z'?c:C);};
if(a.Length>0)a.ToList().ForEach(f=>File.ReadAllText(f).ToCharArray().ToList().ForEach(e));
else 
while(true) Console.In.ReadLine().ToCharArray().ToList().ForEach(e);
}
}
}

C #, 319 байт

одинарный, как указано выше:

namespace System{using IO;using Linq;class P{static void Main(string[]a){Action<char>e=C=>{var c=char.ToLower(C);Console.Out.Write(c>='a'&&c<='z'?c:C);};if(a.Length>0)a.ToList().ForEach(f=>File.ReadAllText(f).ToCharArray().ToList().ForEach(e));else while(true)Console.In.ReadLine().ToCharArray().ToList().ForEach(e);}}}

1

SILOS 179 символов

loadLine :
a = 256
x = get a
lbla
X = x
B = x
C = 91
B - 64
if B c
printChar x
GOTO x
lblc
C - x
if C D
printChar x
GOTO x
lblD
x + 32
printChar x
lblx
a + 1
x = get a
if x a
lblb

Не стесняйтесь попробовать этот код онлайн!


По сути это переводится в pusedocode.

String input = input();
for(char c in input)
if(c is uppercase) print c + 32/*lowercase c*/else print c

0

C, 91 байт

#include <stdio.h>
main(){int c;while(EOF!=(c=getc(stdin))){c=tolower(c);putc(c,stdout);}}

C 98 байт

#include <stdio.h>
main(){int c;while(EOF!=(c=getc(stdin))){if(c>64&&c<91)c+=32;putc(c,stdout);}}

Хотя если читаемость имела значение больше, чем число байтов, та же логика написана ниже:

#include <stdio.h>
main()
{
int c;
        while (EOF != (c = getc(stdin))) {
                if ((c >= 'A') && ((c <= 'Z')))
                        c = (c - 'A') + 'a';
                putc(c,stdout);
        }
}

Это не первый тестовый пример.
TheNumberOne

Это не соответствует спецификации. Он должен вести себя как cat в том смысле, что вы берете имена файлов в качестве аргументов, и если имена файлов не заданы, читайте из stdin. Вы в настоящее время читаете только со стандартного ввода.
Algmyr

0

sed, 14 байтов

s/[A-Z]/\L\0/g

Беги с env -i sed -f kitten.sed.


1
Так как это просто причудливый способ сказать LANG=C sed -f kitten.sed, я не уверен, должен ли я применить штраф за это. Этот вопрос не определяет, как считать вызовы программ, и он не рассматривается в мета
Анхель

Это объединяет файлы, имена которых вводятся как аргументы командной строки, как требуется?
msh210

@ msh210 Да, конечно.
Анхель

1
@ Анхель s/.*/\L&/для решения девяти байтов
someonewithpc

Спасибо @someonewithpc. И то s/.*/\L&/и другое s/./\L&/gдействительно 9-байтовые решения!
Анхель

0

Java, 198 байт

b->B->{B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;};

Вы вынуждены использовать вышеупомянутую лямбду с файлами, поэтому нет необходимости принимать данные из STDIN! Кроме того, это Function<File[], UnaryOperator<String>>. Это используется как foo.apply(anArrayOfFiles).apply(anything).

Что-то, что имеет больше смысла для тех, кто плохо знаком с Java, занимает 223 байта:

String A(java.io.File[]b){String B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;}

Что-то, что компилируется, занимает 232 байта:

class a{String A(java.io.File[]b){String B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;}}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.