Lệnh mèo con


65

Một con mèo giống như một con mèo. Một số khác biệt chính là dễ thương, thiếu thông minh và kích thước. Tương tự, catlệnh khác với kittenlệnh. May mắn thay, chỉ có một sự khác biệt trong trường hợp này. Trong lệnh mèo con, tất cả các chữ cái viết hoa được thay thế bằng các chữ cái viết thường.


Mục tiêu

Để thực hiện một chương trình hành xử tương tự cat. Tất cả các ký tự [A-Z]được xuất ra chữ thường.


Đầu vào

Một danh sách các tệp như là đối số dòng lệnh. Nếu không có tệp nào được liệt kê, thì hãy đọc từ đầu vào tiêu chuẩn. Đầu vào có thể chứa các ký tự và ký tự không thể in bên ngoài phạm vi ASCII.


Đầu ra

Nếu đầu vào là một loạt các tệp, nối các nội dung và xuất tất cả các ký tự dưới dạng chữ thường. Nếu đọc từ STDIN, hãy xuất nội dung của STDIN với tất cả các chữ cái viết hoa dưới dạng chữ thường.

Lưu ý: Chỉ làm cho các ký tự [A-Z]chữ thường. Không thể chấp nhận nếu bất kỳ ký tự nào khác được viết thường.


Ví dụ

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

Như thường lệ với , ít byte nhất sẽ thắng.

Bảng xếp hạng


Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


2
Bằng cách nói rõ ràng "Chỉ làm cho các ký tự [A-Z]viết thường" bạn có dự đoán đầu vào Unicode không?
admBorkBork

2
@TimmyD Có, nhưng chủ yếu là để ngăn mọi người sử dụng các hàm tích hợp để viết thường.
TheNumberOne

3
@FryAmTheEggman permalink
Dennis

1
Làm thế nào về Ü, Ñvà thích?
Mast

2
Đó là rất đẹp khi bạn không nhìn thấy bất kỳ Pyth ở tất cả trong một codegolf ...
JMM

Câu trả lời:


52

Perl, 6 byte

Mã 5 byte + dòng lệnh 1 byte

$_=lc

Ví dụ sử dụng:

echo ABCdef | perl -p kitten.pl
abcdef

Xác nhận hành vi Unicode chính xác:

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

2
Bạn có chắc chắn điều này không ảnh hưởng đến các ký tự Unicode?
Martin Ender

7
@ MartinBüttner Nó không làm . Chúng tôi đang ở trong danh mục khác nếu có ở đây: quy tắc ASCII được sử dụng để thay đổi trường hợp. Chữ thường của bất kỳ ký tự nào nằm ngoài phạm vi ASCII là chính ký tự đó.
xebtl

178

Bash, 19 byte

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

Cách tốt nhất để làm mèo con là sử dụng mèo thật.

Chạy ví dụ

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

39
Công cụ phù hợp cho công việc.
Chấn thương kỹ thuật số

120
+1 chỉ cần một con mèo để làm một con mèo con, luôn đưa tôi hai con mèo
SnoringFrog

4
Bây giờ điều đó làm tôi nhớ đến những man womantrò đùa đó
xebtl

2
+1 để tiến hành nhân bản mèo thay vì phương pháp giao phối tạo con cái
MD-Tech

25
@SnoringFrog Anh bash cái khác.
TheNumberOne

22

Perl, 11 byte

Mã 10 byte + dòng lệnh 1 byte

y/A-Z/a-z/

Ví dụ sử dụng:

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

15

Python 3, 77 byte

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

1
Thật thông minh, sử dụng byte để tránh sự thay đổi của ASCII.
matjoyce

11

Ruby, 13 byte

Số byte bao gồm 1 byte cho pcờ. Chạy nó như vậy : ruby -p kitten.rb.

$_.downcase!

Đưa đầu vào từ stdin hoặc đối số tệp, giống như con mèo trưởng thành.


Có phải điều này chỉ viết tắt ASCII, hoặc các nhân vật khác như thế Änào?
Paŭlo Ebermann

1
@ PaŭloEbermann: Tôi vừa thử nó: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

Tôi thề có một loạt các ý kiến ​​ở đây liên quan đến điều đó ngày hôm qua. Tôi không biết những người đã đi đâu, nhưng: Vâng, nó hoạt động theo thông số kỹ thuật.
daniero

5

PowerShell, 112 byte

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

Kinh khủng không thể đọc được. Đây là một phiên bản mở rộng hơn một chút dưới đây:

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

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

Xác định hàm nội bộ llặp qua vòng lặp từ 97 đến 112 (nghĩa là ASCII ađến ASCII z). Tách chuỗi đầu vào trên ký tự đó (mặc định không phân biệt chữ hoa chữ thường), nối lại nó với chữ thường "chính xác". Xin lưu ý rằng có, điều này có nghĩa là "Thử nghiệm" sẽ nhanh chóng trở thành "T st" khi nó lặp đi lặp lại e, chẳng hạn. Không ảnh hưởng đến đầu ra.

Nửa thứ hai là một mẹo nhỏ để tìm hiểu xem chúng ta có đầu vào đường ống (tương đương với stdin cho PowerShell) hoặc đầu vào dòng lệnh. Biến đặc biệt $argschỉ xuất hiện nếu có đầu vào dòng lệnh, vì vậy chúng tôi lặp qua từng cái, gc(for Get-Content) và schlep mà lên đến l. Nếu không, chúng tôi chỉ schlep của chúng tôi $inputlên đến l. Lưu ý rằng chúng ta có thể hoán đổi các câu lệnh if / other (nghĩa là if($input)), nhưng vì "đầu vào" dài hơn một ký tự so với "args" nên cách này ngắn hơn.


@Nazek Việc tích hợp "String".ToLower()cũng sẽ viết thường các ký tự Unicode, trái với quy tắc. Có rất nhiều thứ mà PowerShell không làm đúng với Unicode, nhưng thật không may, đây là một ví dụ mà nó hoạt động chính xác.
admBorkBork


5

R, 97 byte

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

Sử dụng:

$ 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 byte

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)

Sử dụng:

$ 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

Sự tham gia đầu tiên của tôi vào codegolf vì vậy xin đừng thô lỗ :).

Để chắc chắn mã này có thể được chơi nhiều hơn và cà phê / javascript không phải là lựa chọn tốt nhất để làm điều đó, nhưng nó làm những gì được mong đợi.

Khi nó đọc các đối số, nó cũng quan tâm đến sự tồn tại của tệp (nếu tệp không tồn tại, chuỗi được đánh dấu.)

Bất kỳ trợ giúp hoặc lời khuyên để cải thiện mã này đều được chào đón!


4

Julia, 123 byte

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())

Ung dung:

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 byte

ea_:gs{q}?'_,_eler

Danh sách các tệp phải được cung cấp dưới dạng URL, đây là định dạng duy nhất mà CJam hiểu.

Ví dụ chạy

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

Làm thế nào nó hoạt động

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 byte

Chức năng đã được sửa (và thêm 4 byte) bằng matjoyce. May mắn thay, tôi đã lưu hai byte bằng cách chuyển sang Python 2.

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

Lấy các đối số từ dòng lệnh hoặc từ STDIN nếu không tìm thấy đối số.

Điều này lạm dụng các đối số mặc định của một số chức năng. Theo mặc định, opensử dụng chế độ văn bản chỉ đọc, đó là chính xác những gì chúng ta muốn. read, nếu được gọi mà không có đối số, sẽ trả về tất cả văn bản trong luồng.

Ung dung:

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
Điều này sẽ không hoạt động cho stdin, vì bạn chỉ đọc một dòng và không viết thường nó.
matjoyce

@matsjoyce Tôi đã sửa mã của mình. Cảm ơn đã nhắc nhở! Thật không may, nó đã thêm bốn byte, nhưng không còn phụ thuộc vào việc inputkhông đánh giá, tôi có thể chuyển sang Python 2 và xóa dấu ngoặc đơn trên print.
bkul

3

Python 3, 124 123 byte


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="")

Con trăn ăn thịt mèo con!

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

3

C, 106 108 byte

Chỉnh sửa: Đã sửa lỗi mắc lỗi khi nén byte. Stdin đã không làm việc, bây giờ nó là.

Tôi khá chắc chắn rằng tôi có thể vắt kiệt một số byte, nhưng đây là một cách dễ nắm bắt, hoàn toàn không lạm dụng ngôn ngữ, trình:

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);}

Và một phiên bản được định dạng gọn gàng hơn để đọc:

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 bởi vì điều này đã dạy tôi rằng các tham số int ẩn chỉ có thể với cú pháp K & R.
Felix Dombek

2

Toán học, 66 byte

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

Gọi là

kit@"HelLo"

Mathematica đã có một ToLowerCasechức năng, nhưng nó cũng chuyển đổi các ký tự đặc biệt (Unicode và toán học). Vì vậy, tôi đã phải mèo con nó. Chức năng này sẽ có bất kỳ đầu vào.


@TheNumberOne - đó là cách nó hoạt động trong Mathicala. Không cần thêm mã để làm điều này. Nếu bạn muốn một tệp thực thi, thì Mathicala không phải là công cụ.
Verbeia

Điều này có liên kết các tệp có tên được nhập làm đối số dòng lệnh, theo yêu cầu không?
msh210

Luận điểm dòng lệnh không tồn tại trong Mathematica. Nó kết hợp chức năng đầu vào của nó. Ngoài ra, bạn không cần phải gán cho một biến.
Máy

2

C #, 230 226 byte

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)));}}}

Ung dung:

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

Haskell, 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<'[']

Việc xử lý args kiểu mèo được lấy từ hướng dẫn này , sau đó được sắp xếp lại thành các ký tự cạo.

Giải thích l, hàm viết thường một ký tự:

  • sum[32|condition]là một hình thức ngắn hơn của if condition then 32 else 0.
  • [x..]!!countiterate succ x !! counttoEnum $ fromEnum x + countvà ngắn hơn so với nhập khẩu và sử dụng Data.Char.toLowervới một điều kiện để hạn chế nó để ASCII.
  • '@''['là các ký tự ngay trước Avà sau Z, để tôi có thể sử dụng <thay vì <=.

Cảm ơn Anders Kaseorg đã đóng góp sum[...|...]và các [x..]!!thủ thuật.


1
l x=[x..]!!sum[32|x>'@',x<'[']
Anders Kaseorg

1

C #, 342 byte

  • lấy danh sách tập tin từ các đối số được thông qua.
  • đọc mọi char trong mọi tệp hơn là chỉ chuyển đổi thành chữ thường nếu và chỉ khi ký tự trong phạm vi A..Z hơn gửi nó đến STDOUT.
  • Nếu không có danh sách tệp nào hơn đọc STDIN, hãy đọc mọi char, chuyển đổi thành chữ thường nếu và chỉ khi ký tự trong phạm vi A..Z hơn gửi nó đến 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 byte

lót đơn, giống như trên:

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 ký tự

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

Hãy thử mã này trực tuyến!


Về cơ bản, nó chuyển thành mã này trong puseocode.

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

0

C, 91 byte

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

C, 98 byte

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

Mặc dù nếu khả năng đọc quan trọng hơn số byte, logic tương tự được viết dưới đây:

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

Điều này không thành công trong trường hợp thử nghiệm đầu tiên.
TheNumberOne

Điều này không đáp ứng các thông số kỹ thuật. Nó nên hoạt động giống như con mèo theo nghĩa là bạn lấy tên tệp làm đối số và nếu không có tên tệp nào được đưa ra, hãy đọc từ stdin. Bạn hiện chỉ đọc từ stdin.
algmyr

0

sed, 14 byte

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

Chạy với env -i sed -f kitten.sed.


1
Vì đây chỉ là một cách để nói LANG=C sed -f kitten.sed, tôi không chắc mình có nên áp dụng hình phạt cho việc đó không. Câu hỏi này không chỉ định cách đếm các cuộc gọi chương trình và dường như không được giải quyết trong meta.
Ángel

Điều này có liên kết các tệp có tên được nhập làm đối số dòng lệnh, theo yêu cầu không?
msh210

@ msh210 Vâng, tất nhiên rồi.
Ángel

1
@ Ángel s/.*/\L&/cho một giải pháp chín byte
someonewithpc

Cảm ơn @someonewithpc. Cả hai s/.*/\L&/s/./\L&/gthực sự là các giải pháp 9 byte!
Ángel

0

Java, 198 byte

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;};

Bạn buộc phải sử dụng lambda ở trên với các tệp, vì vậy không cần phải nhập dữ liệu từ STDIN! Ngoài ra, đó là một Function<File[], UnaryOperator<String>>. Nó được sử dụng như thế nào foo.apply(anArrayOfFiles).apply(anything).

Là một cái gì đó có ý nghĩa hơn đối với những người mới sử dụng Java, phải mất 223 byte:

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;}

Là một cái gì đó biên dịch, nó chiếm tới 232 byte:

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;}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.