子猫コマンド


65

子猫は猫によく似ています。主な違いのいくつかは、可愛らしさ、知性の欠如、サイズです。同様に、catコマンドはコマンドとは異なりkittenます。幸いなことに、この場合の違いは1つだけです。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
Ä

場合と同様、最小バイトが勝ちます。

リーダーボード


これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# 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
codegolfでPythがまったく表示されないのはとても素晴らしいことです
...-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の範囲外の文字の小文字は、その文字自体です。」
xebtl

178

Bash、19バイト

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

子猫を作る最良の方法は、実際の猫を使うことです。

実行例

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

39
仕事に最適なツール。
デジタル外傷

120
子猫を作るのに1匹の猫だけが必要な場合は+1、常に2匹の猫を連れて行きます
-SnoringFrog

4
今、それはそれらのman womanジョークを思い出させます…
xebtl

2
子孫を作成する交配方法ではなく猫のクローンに行くための+1
MD-Tech

25
@SnoringFrog彼はもう1つを打ちました。
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バイト

バイトカウントには、pフラグの1バイトが含まれます。次のように実行しますruby -p kitten.rb

$_.downcase!

大人の猫のように、stdinまたはファイル引数から入力を受け取ります。


これはASCIIだけを小文字にしÄますか?
パエロエベルマン

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
}

l97から112(つまりASCII aからASCII z)のループを繰り返す内部関数を定義します。入力文字列をその文字で分割し(大/小文字を区別しないデフォルト)、「正しい」小文字で再結合します。はい、これはe、たとえばを繰り返し処理するときに、「テスト」が一時的に「T st」になることを意味します。出力には影響しません。

後半は、パイプライン入力(PowerShellのstdinに相当)またはコマンドライン入力があるかどうかを判断するのが難しい部分です。特殊変数$argsは、コマンドライン入力が存在する場合にのみ存在するため、各変数をループしgc(for Get-Content)、最大でschlepしlます。それ以外の場合は、$input最大でを削りますl。if / elseステートメント(つまりif($input))を入れ替えることができますが、「入力」は「引数」より1文字長いため、この方法は短くなります。


@Nazek組み込みの"String".ToLower()Unicode文字も小文字になりますが、これはルールに違反します。PowerShellがUnicodeに関して正しくしないことはたくさんありますが、残念ながらこれは正しく動作する1つのインスタンスです。
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

ファイルのリストは、CJamが理解できる唯一の形式であるURLの形式で提供する必要があります。

実行例

$ 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に切り替えて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
これは標準入力では機能しません。1行だけを読み、小文字にしないからです。
matsjoyce

@matsjoyceコードを修正しました。念押し有難う!残念ながら、4バイト追加されましたが、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は子猫を食べます!

$ 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には存在しません。関数の入力を連結します。また、変数に割り当てる必要もありません。
電卓

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、1文字を小文字にする関数の説明:

  • sum[32|condition]はの短い形式ですif condition then 32 else 0
  • [x..]!!countis iterate succ x !! counttoEnum $ fromEnum x + countData.Char.toLowerASCIIに制限する条件でインポートおよび使用するよりも短くなります。
  • '@''['は直前Aと直後の文字ですZので、の<代わりに使用できます<=

Anders Kaseorgの貢献sum[...|...][x..]!!トリックに感謝します。


1
l x=[x..]!!sum[32|x>'@',x<'[']
アンデルスカセオルグ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);}}}


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から読み取るという意味で、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&/
Anngel

@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;}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.