小猫命令


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 2015年

3
@FryAmTheEggman 永久链接
丹尼斯

1
怎么样ÜÑ喜欢?
桅杆

2
它是如此美好,当你看不到任何Pyth都在codegolf ...
JMM

Answers:


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 2015年

178

Bash,19个字节

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

饲养小猫的最好方法是使用实​​际的猫。

运行示例

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

39
这项工作的正确工具。
Digital Trauma 2015年

120
+1只需要一只猫做小猫,总是带我两只猫
SnoringFrog 2015年

4
现在,让我想起了这些man woman笑话……
xebtl 2015年

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

Ruby,13个字节

字节计数包括1个字节的p标志。像这样运行它:ruby -p kitten.rb

$_.downcase!

从标准输入或文件参数中获取输入,就像长大的cat一样。


这是仅小写ASCII还是其他字符,如Ä
圣保罗Ebermann

1
@PaŭloEbermann:我刚刚测试过:echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

我发誓昨天有很多关于此的评论。我不知道这些产品去了哪里,但是:是的,它可以按照规范工作。
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。不影响输出。

后半部分比较难懂,是要确定我们是否具有管道输入(相当于PowerShell的stdin)或命令行输入。该特殊变量$args仅在存在命令行输入时才存在,因此我们遍历每个gc(for Get-Content)并将其舍入到l。否则,我们只快$input完成任务l。请注意,我们可以交换if / else语句(即if($input)),但是由于“输入”比“ args”长一个字符,因此这种方式更短。


@Nazek内置"String".ToLower()也将小写Unicode字符,这是违反规则的。关于Unicode,PowerShell有很多不正确的方法,但是不幸的是,这是一个实例,它可以正常工作。
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,所以请不要粗鲁:)。

可以肯定的是,此代码可以被广泛使用,而coffee / 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字节

matsjoyce纠正了功能(并添加了4个字节)。幸运的是,通过切换到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
这对于s​​tdin无效,因为您只能读一行,并且不能小写。
matsjoyce 2015年

@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语法实现。
Felix Dombek

2

Mathematica,66个字节

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

称为

kit@"HelLo"

Mathematica已经具有ToLowerCase功能,但它也可以转换特殊(Unicode和数学)字符。所以我不得不把它小猫化。此功能将接受任何输入。


@TheNumberOne-这就是Mathematica中的工作方式。无需其他代码即可执行此操作。如果您想要一个可执行文件,那么Mathematica不是工具。
Verbeia 2015年

是否根据需要连接名称输入为命令行参数的文件?
msh210 '16

命令行参数在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<'[']

cat风格的args处理是从本教程派生的,然后重新排列以剃除字符。

解释l,小写一个字符的功能:

  • sum[32|condition]是的较短形式if condition then 32 else 0
  • [x..]!!countis iterate succ x !! counttoEnum $ fromEnum x + count并且比使用Data.Char.toLower条件将其限制为ASCII的输入短。
  • '@''['被字符紧接在前的A和下面的Z,所以,我可以使用<的代替<=

感谢Anders Kaseorg提供了sum[...|...][x..]!!技巧。


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

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中读取。您目前仅从stdin中读取。
algmyr

0

sed,14个字节

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

用运行env -i sed -f kitten.sed


1
由于这只是一种奇特的说法LANG=C sed -f kitten.sed,所以我不确定是否应该对这种情况进行惩罚。这个问题没有指定如何计算程序调用,在meta中似乎也没有解决。
安赫尔

是否根据需要连接名称输入为命令行参数的文件?
msh210 '16

@ msh210是的,当然。
安赫尔

1
@Ángel s/.*/\L&/提供九个字节的解决方案
someonewithpc '16

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

您被迫将上述lambda与文件一起使用,因此无需从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;}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.