Команда кошеня


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
Ä

Як зазвичай у , виграє найменше байт.

Табло лідерів


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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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
Постійне посилання на
Dennis

1
Як щодо того Ü, Ñі кохає?
щогли

2
Це так приємно, коли ти взагалі не бачиш жодного Pyth у кодовому гольфі ...
jmm

Відповіді:


52

Perl, 6 байт

5 байт-код + 1 байт командного рядка

$_=lc

Приклад використання:

echo ABCdef | perl -p kitten.pl
abcdef

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

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

2
Ви впевнені, що це не впливає на символи Unicode?
Мартін Ендер

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 за те, що мені потрібна лише одна кішка, щоб зробити кошеня, завжди приймає мені двох котів
SnoringFrog

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

15

Python 3, 77 байт

from fileinput import*
print(end=b''.join(input(mode='rb')).lower().decode())

1
Це розумно, використовуючи байти, щоб уникнути зміни не-ASCII.
matsjoyce

11

Рубін, 13 байт

Кількість байтів включає 1 байт для pпрапора. Запустіть його наступним чином: ruby -p kitten.rb.

$_.downcase!

Здійснює введення аргументів stdin чи файлів, як і доросла кішка.


Це лише нижчий регістр ASCII, а також інші символи на кшталт Ä?
Paŭlo Ebermann

1
@ PaŭloEbermann: Я щойно перевірив це: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Ніл Слейтер

Я клянусь, що тут було багато коментарів щодо цього. Я не знаю, куди вони пішли, але: Так, це працює відповідно до специфікації.
daniero

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). Розбиває вхідний рядок на цей символ (так, за замовчуванням не враховується регістр), він знову з'єднує його з "правильним" малим регістром. Зауважте, що так, це означає, що "Тест" ненадовго перетвориться на "T st", оскільки він повторюється e, наприклад. Не впливає на вихід.

Друга половина - це складно розібратися, чи є у нас трубопровід (еквівалентний stdin для PowerShell) або введення командного рядка. Спеціальна змінна $argsє лише за наявності введення командного рядка, тому ми переносимо петлю на кожну, gc(для Get-Content) та schlep, що до l. В іншому випадку, ми просто покидьок наш $inputдо l. Зауважте, що ми можемо поміняти своєю операцією if / else (тобто if($input)), але оскільки "input" на один символ довший, ніж "args", цей спосіб коротший.


@Nazek Вбудований "String".ToLower()також би мав рядкові символи Unicode, що суперечить правилам. Є багато речей, які 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

Моя перша участь у кодегольфі, тому, будь ласка, не будьте грубі :).

Напевно, цей код можна більше гольфувати, і кава / 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())

Безголівки:

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, якщо викликається без аргументів, поверне весь текст у потоці.

Безголівки:

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
Це не працюватиме для stdin, оскільки ви читаєте лише один рядок і не малі його.
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 байт

Редагувати: виправлена ​​помилка, яка вискакувала під час стискання байтів. Стдін не працював, тепер це так.

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

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

Математика, 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)));}}}

Безголівки:

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..]!!countце iterate succ x !! countє toEnum $ fromEnum x + countі коротше , ніж імпорту і використання Data.Char.toLowerз умовою , щоб обмежити його в ASCII.
  • '@'і '['це символи, що передують Aі передують, і Zя можу використовувати <замість них <=.

Завдяки Андерс 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

Це не відповідає специфікації. Він повинен поводитись як кіт у тому сенсі, що ви приймаєте назви файлів як аргументи, а якщо файли не даються, читайте з stdin. Ви зараз читаєте лише з stdin.
algmyr

0

sed, 14 байт

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

Бігайте з env -i sed -f kitten.sed.


1
Оскільки це просто фантазійний спосіб сказати LANG=C sed -f kitten.sed, я не впевнений, чи слід застосувати штраф до цього. Це питання не вказує, як рахувати програмні дзвінки, і, здається, не розглядається в мета.
Ángel

Чи є це об'єднані файли, імена яких вводяться як аргументи командного рядка, як потрібно?
msh210

@ msh210 Так, звичайно.
Ángel

1
@ Ángel s/.*/\L&/для вирішення дев'яти байтів
whowithpc

Дякуємо @someonewithpc. І те, s/.*/\L&/і s/./\L&/gсправді 9-байтне рішення!
Ángel

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.