文字列を小文字に変換(組み込みの小文字関数なし!)


25

このcode-golfの目標は、ユーザーがASCII文字列(印刷可能なASCII文字のみを含む)を入力できるコードを作成し、プログラムがこの文字列の小文字のバリアントを出力することです。

重要:文字列(または1文字のみ)を小文字(ToLower().NET、strtolower()PHP など)に変換する組み込み関数を使用することはできません!ただし、他のすべての組み込み関数を使用できます。

別の重要な注意:入力文字列には大文字のみが含まれていません。入力文字列は、大文字、小文字、数字、およびその他のASCII印刷可能文字の混合です。

がんばろう!


4
残念ながら、オプトアウトする必要があります。私は初心者ではありません。
ジョンドヴォルザーク

@Jan:まあ、初心者とは、初心者だけが入ることができるということではなく、実際にこれのスキルレベルが「初心者」になることを意味しました。「初心者」という単語を削除しました。確かに、あなたは入ることができます。
ProgramFOX

1
正規表現は許可されていますか?GolfScriptだけが勝つことができましたs/./\L\0/g
マナトワーク

3
@manatwork:確か\Lに組み込まれていますか?
マリヌス

@manatwork:はい、正規表現は許可されています。
ProgramFOX

回答:


21

シェル-10

を使用した@GowthamのPerlソリューションの翻訳/bin/tr

tr A-Z a-z

サンプル実行:

% tr A-Z a-z <<<'Hello WORLD! @'
hello world! @

好奇心から、これが受け入れられた答えになるのはなぜですか?Gowthamには最初に10文字のソリューションがありました...
Ry-

1
メタに関する議論に基づくと、理由はGowthamの解が11文字であるように思われます-pフラグが1としてカウントされるため)。私は...それがより受け入れられるに値するように彼はそう、けれども同意
ホタル

ああ、ありがとう-それは理にかなっています。心に留めておきます!
Ry-

53

Python 2.7-30(ひどく、説得力のないルールの乱用)

raw_input().upper().swapcase()

匿名の編集が指摘したように、あなたはそれをすることができます 27Python 3の26

input().upper().swapcase()

私はここでルールを暴言しますが、...

重要:文字列(または1文字のみ)を小文字(ToLower().NET、strtolower()PHP など)に変換する組み込み関数を使用することはできません!ただし、他のすべての組み込み関数を使用できます。

これは文字列を取得し、大文字に変換します。次に、非常に無関係なメソッド呼び出しで、文字列の大文字と小文字を逆にします。これにより、小文字が大文字になり、大文字と小文字が入れ替わります


1
Python 3ソリューションは26文字です。
ティムテック

@Timtech数えられない。

1
それは単に無関係ではありません。それは非常に無関係です。
カーターパプ14

1
文字ßを含むテキストに遭遇すると、これは奇妙な結果になります。
FUZxxl

33

Perl - 11 10文字。

y/A-Z/a-z/

y///と同じtr///です!

動作中:

% perl -pe 'y/A-Z/a-z/' <<< 'Hello @ WORLD !'
hello @ world !

3
+1(少ない(?)本物の言語を打ち負かす唯一の実際の言語)。
Behrooz

実際には11文字です。-pオプションは1としてカウントされる
manatwork

@manatworkまたは、2としてカウントする必要があります:-およびp:)
ゴーサム

1あなたが想定した場合-eperl -e- > perl -pe)、3スクリプトを想定した場合(perl- > perl -p)。
nyuszika7h 14

10

Befunge-98-26 22 21 19

~:''-d2*/1-!' *+,#@

事実に依存し(c-39)/26ている1だけ(分割整数と仮定して)大文字のASCII文字の文字コードについて。各文字についてc、印刷しc + (((c-39)/26)==1)*' 'ます。

サンプルセッション:

% cfunge lower.b98
hello WORLD!
hello world!
This is a TEST!!11 az AZ @[`{
this is a test!!11 az az @[`{

9

Python 3、58

print("".join(chr(ord(x)+('@'<x<'[')*32)for x in input()))

これがどのように機能するか説明できますか?私はPythonをもっと良くすることに本当に興味があります。map(ord,input())ビットがどのように機能するかわかりません。
アステリ

1
@JeffGohlke:map関数(この場合はord)をinterableに適用し、iterableを返します。の短い形式のようなものです(ord(x) for x in input())
Ry-

とった。説明してくれてありがとう!
アステリー

1
あなたの答えは質問の精神に従いますが、私は質問の手紙に従います

非常に素晴らしい。未投稿の62の長さのソリューションを破りましたfor c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end='')。私はこのmap(ord,input())トリックを試してみましたが、真理値に32を掛けて文字コードトリックに追加するのを逃しました。非常に素晴らしい。
スティーブンランバルスキー

8

ルビー、18文字

本当に面白いものはありません。

gets.tr'A-Z','a-z'

(IRBで実行)

ただ楽しみのために:混乱バージョン:

$,=$* *' ';$;=$,.tr'A-Z','a-z';$><<$;

次のように実行します。

c:\a\ruby>lowercase.rb Llamas are AMAZING!

出力

llamas are amazing!

7

J-30

'@Z'(]+32*1=I.)&.(a.&i.)1!:1]1

Jは右から左に読み取られるため、これを分類するには:

  1. ユーザーに入力を求める: 1!:1]1
  2. code-point-spaceでアルゴリズムを実行します。 &.(a.&i.)
  3. 各文字の文字範囲を特定します。コードポイント「@」と「Z」の間の文字は大文字と見なされます1=I.
  4. 大文字のコードポイントごとに、32を追加します。 ]+32* ...
  5. ステップ(2)は暗黙的なステップ(5)を作成することに注意してください。最初に文字から整数ドメインに投影することから始めました。

明らかに、この特定の実装ではASCIIのみが考慮されます。しかし、このアプローチは、少なくともUnicodeの基本的な多言語プレーンにまで拡張できます。


1
いいね!残念ながら、あなたの解決策は間違った方向に向かっているようです。;-)しかし、簡単に修正できるはずです。(編集:それ'@Z'(]+32*1=I.)&.(a.&i.)1!:1]1を行う必要があります)
FireFly

いいキャッチ、ありがとう。Jが:)そこにほとんど即座にアクセス可能な言語ではありません。私はまた、あなたが自分でコードを修正することができました感銘を受けています
ダン・ブロン

ああ、私はJでいくつか遊んでみました。u:(a.i.x)+32*1='@Z'I.x=.1!:1]1あなたの長さにマッチしましたが、あまり面白くありませんでした(「アンダー」を使用しないため)。そういえば、私はダイアディックについて知らなかったI.ので、それを使ってくれてありがとう。:
FireFly

クール。ただし、Befungeソリューションでは、Jビートが4文字のままです。明らかにそれを我慢することはできません:)「@」と「Z」の両方ではなく、「@」だけに頼ってリードをたどって、Jソリューションを縮小するかどうかを確認しようとしています。
ダン・ブロン

(32(23)b.])&.(3&u:)、5バイト短くする必要があります。
FrownyFrog

7

C 64 63 59 55文字

main(c){while(c=getchar(),~c)putchar(c-65u<27?c+32:c);}

そこでは63文字しか数えていません。
マナトワーク

あなたは9文字を失うことができます:ドロップint ,c>=0。ここでは必要ありません。
JoeFish

getchar(EOF)は<0になるため、c> = 0が必要です。他の提案をありがとう。
ロズール

2
1. ~(c=getchar())2.c-64u<27
ugoren

1
わずかに小さなバグ:代わりに64の65があるべきようだpastebin.com/Zc9zMx2W
manatwork

5

Golfscript-17

プログラム:

{..64>\91<*32*+}%

説明:

  1. {}% 内部のコードをstringのすべての文字にマップします。
  2. .. スタックの最上部(キャラクター)を2回コピーします。
  3. 64> 文字コードが64より大きい場合は1、それ以外の場合は0。
  4. \スタック上の2つのアイテムを交換します(レターの2番目のコピーを取得し、2番目の64>位置に結果を保存します)。
  5. 91< 文字コードが91未満かどうかを確認します。手順3と同様です。
  6. *ステップ3と5の結果を乗算します。両方のステップが真の場合、1にのみ等しくなります。
  7. 32* ステップ6の結果に32を掛けます。ステップ6が1の場合は32、それ以外の場合は0になります。
  8. + 結果(32または0)を文字コードに追加します。

出力例:

echo HelLO @ WorLD | ruby golfscript.rb upper_to_lower.gs
hello @ world

4

Perl:24文字

s/[A-Z]/chr 32+ord$&/ge

サンプル実行:

bash-4.1$ perl -pe 's/[A-Z]/chr 32+ord$&/ge' <<< 'Hello @ WORLD !'
hello @ world !

なんでchr ord?私の答えを読んでも何も学ばないと確信しています
;

@ F.Hauri、素晴らしいトリック!
マナトワーク

@ nyuszika7h、+ 1は-pコマンドラインパラメータであり、改行ではありません。
マナトワーク14

ああ、ごめんなさい。
nyuszika7h 14

3

パイソン(33)

疑わしい場合は、シェルを使用してください。

import os;os.system('tr A-Z a-z')

残念ながら、これはまだレゴのソリューションよりも長いです。


+1これは実際に使用しているPythonビルトインではありません。Linuxでのみ動作しますが、それでも非常にルールに優しい!!!

@LegoStormtroopr trは、呼び出されたシェルのパス上にコマンド(正しいことを行う)が存在するすべての場所で動作すると思われます。
パエロエベルマン

3

デルフィ

const
  UpChars:set of AnsiChar = ['A'..'Z'];
var
  I: Integer;
begin
  SetLength(Result, Length(pString));
  for I := 1 to length(pstring) do
    Result[i] := AnsiChar((Integer(pString[i] in UpChars))*(Ord(pString[i])+32));
  WriteLn(Result);
end;

3
これはゴルフではありません。この作品は他の作品と比べて非常に違うと思いませんか?
レイ

1
@ray Golfingは、コードをできるだけ短くすることです。Delphiはゴルフに最適な言語ではありません。私は自分でデルファイを使用していますが、デルファイでゴルフに勝つ可能性はあまりありませんが、挑戦するのはまだ楽しいです。
テウンプロンク14

3

JavaScript- 109 104(ES6:95)

修正されたバージョンをありがとう。

a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&c<91)*32);alert(b.join(""))

ブラウザがES6関数式をサポートしている場合、次のように機能します。

alert(prompt().split("").map(c=>String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)).join(""))

最初のコードは機能しません(FFおよびChromeでテスト済み)。これは、文字列の長さの後に文字を取得しようとすると、未定義にが存在しないため取得undefinedしてc.charCodeAt()失敗するためcharCodeAtです。実用例105文字:a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&&c‌​<91)*32);alert(b.join(''))
一部

@いくつかのおっと、私はそのスニペットをどのように思いついたのだろうか。とにかく、修正してくれてありがとう。
ホタル

and論理的なものの代わりにビット単位を使用して...素晴らしい!
いくつかの

さらにES6溶液(79): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join('')。使用法:L('SoMeTeXt')
フロレント14

いいね!ただし、他のすべてのソリューションは「適切な」プログラムであるため、単なる機能にするかどうかはわかりません。それでも、for..of関係なく非常に素晴らしい使用。
FireFly 14

3

Perl 18

s/[A-Z]/$&|" "/eg

何かのようなもの:

perl -pe 's/[A-Z]/$&|" "/eg'  <<<'are NOT allowed to: ToLower() in .NET, strtolower() in PHP'
are not allowed to: tolower() in .net, strtolower() in php

そして

perl -pe 's/[A-Z]/$&|" "/eg' <<< "The input string Doesn't cOntaIn...( C0D3-@01F. ;-)"
the input string doesn't contain...( c0d3-@01f. ;-)

以下のための@FireFly

perl -pe 's/[A-Z]/$&|" "/eg' <<< "Doesn't this translate @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

いや

より一般的:とにかく18文字:

s/[A-Z]/$&|" "/eg

s/[A-Z]/$&^" "/eg

これは状態の何も変更しません:

perl -pe 's/[A-Z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

すべて正常に動作しますが、|(or)by ^(xor)を変更する利点は、同じ構文をtoLowertoUpperまたはに使用できることですswapCase

toUpper:

perl -pe 's/[a-z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
DOESN'T ... @ TO ` AND [\]^_ TO {|}~DEL? 

およびswapCase (18 + 1 = 19文字)

perl -pe 's/[a-z]/$&^" "/egi' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
dOESN'T ... @ TO ` AND [\]^_ TO {|}~del? 

-p申し訳ありませんが@manatworkの+1を忘れてしまった
F.ハウリ

これは翻訳しない@バッククォートにして[\]^_{|}~DEL?そして、その中のトリッキーな部分はある...
ホタル

1
@FireFlyいいえ、$&一致する必要があり[A-Z]ます。
F.ハウリ

ああ、私の悪い。とてもクールです!
ホタル

3

JavaScript 80

"X".replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)})

(を削除した場合は76 "X"

promptalert- 92

alert(prompt().replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)}))

フィドル

@FireFly @some @ C5H8NNaO4と@minitechに感謝


Er、2番目の引数をreplacewith function($){return ...}でラップする必要がありますか?ちなみに、置換関数の最初のパラメーターは一致した文字列なので、正規表現に括弧を削除できます。
ホタル

このように実行するにはどうすればよいですか?
C5H8NNaO4

@ C5H8NNaO4 str(コードはこちら)
Math chiller

6
ここでのすべての(または少なくともほとんどの)答えは、stdinから読み、stdoutに印刷すると思います。私が集まるところでは慣例が使用することですpromptし、alertJSでのI / Oのために。
ホタル

1
/gこれを正しく動作させるにはフラグが必要です。
Ry-

2

R

71文字:

chartr(paste(LETTERS,collapse=""),paste(letters,collapse=""),scan(,""))

83文字:

a=as.integer(charToRaw(scan(,"")))
b=a%in%(65:90)
a[b]=a[b]+32
rawToChar(as.raw(a))

That's 86 characters - newlines count as 2 characters. (string-functions.com/length.aspx)
Timtech

@Timtech: In R you can replace newlines in code by ; so no they count just for one character. It could be written: a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus

Yes, now I realized. I read up on meta... seems that only on Windows that newlines are 2 characters (I was using a program to measure the length of my code).
Timtech



2

PHP (42)

Run from the command line:

-R'echo@str_ireplace($a=range(a,z),$a,$argn);'

-R and the single quotes are not counted.


If you follow Gowtham's Peal solution, you would only count 42 characters.
eisberg

1
@eisberg: Updated the score, leaving a 43-character version in the history in case of any dispute.
PleaseStand

str_ireplace does case insensitive search, which is stretching the rules, if not breaking them.
ugoren

@ugoren I do not think so. As it is clearly stated that only build in function changing the case are not allowed and this is ignoring the case not changing it.
eisberg

2

PowerShell: 69 65 64

I've tried a half-dozen ways to get Replace to work the way I want it to without using the long [regex]::Replace syntax, but I haven't had any luck. If anyone else has an idea of what might work, please do suggest it.

Golfed code:

[regex]::Replace((read-host),"[A-Z]",{[char](32+[char]"$args")})

Changes from original:

  • Rearranged last argument so that [int] is no longer needed, per suggestion in comments.

Explanation:

(read-host) gets the user input.

[regex]::Replace(...) tells PowerShell to use RegEx matching to perform replacement operations on a string.

"[A-Z]" matches all uppercase letters.

{...} tells PowerShell to use a script to determine the replacement value.

[char]"$args" takes the current match and types it as an ASCII character.

32+ converts the character to an integer, representing the ASCII code, and increases the value by 32 - which would match ASCII code of the corresponding lowercase letter.

[char](...) takes the resulting value and converts it back to an ASCII character.

Demo of original:

enter image description here

(Current version tested - screenshot not yet posted.)


1
Haven't checked on how to get around that [regex]::Replace, but you can save 4 chars by changing [int] to +
goric

1
Actually, the whole last argument can be rearranged to {[char](32+[char]"$args")}, which removes the need to explicitly cast to int and shaves off one more character
goric

@goric Geez, why didn't I think of that already? Still learning, I guess.
Iszi

2

k2, 15 bytes

I am super late to this one, but I found this cool anyway.

{_ci 32+_ic x}'

Also:

Pyth, 10 bytes

Doesn't really count because Pyth was created after this was posted. Still cool.

jkmC+32Cdw

2

05AB1E, 3 bytes

u.š

Port of @user8777 Python 3 answer.

Try it online.

Explanation:

u    # Convert the (implicit) input to uppercase
   # Switch the case (upper to lower and vice-versa)
     # (and output the result implicitly)

But without any case-altering builtins:

05AB1E, 12 11 bytes

ÇIS.u32*+çJ

-1 byte thanks to @Emigna.

Try it online.

Explanation:

Ç            # Get the unicode values of each character of the (implicit) input-String
 IS          # Get the input-string, split to characters again
   .u        # Check for each if it's uppercase or not (1 if truthy; 0 if falsey)
     32*     # Multiply that result by 32 (32 if truhy; 0 if falsey)
        +    # Add it to all the unicode values at the same indices in the list
         ç   # Convert the now modified unicode values back to characters
          J  # And join all characters together to a string again
             # (which is output implicitly as result)

1
ÇIS.u32*+çJ saves a byte on your 12-byte version.
Emigna

@Emigna Ah, smart. I had tried the .u32*+ approach like this: εÇy.u32*+ç]J, but unfortunately ç wraps the characters in a list, so an additional J or ` was required after the ç..
Kevin Cruijssen

1

Javascript, 105

prompt().split("").map(function(a){c=a.charCodeAt(0);return String.fromCharCode(c|(c-64?32:0))}).join("")

Actually ther was no output form specified, so run it in console Yea, JavaScript really is verbose with charcode <-> string


1
c.charCodeAt() -- it defaults to 0 if an index is omitted. Also, breaks on '@' I believe (it gets "lowercased" into backtick)
FireFly

@FireFly Nice, Thanks!, ok i'll gonna fix it =)
C5H8NNaO4


1

C# - 108

class P{static void Main(string[]a){foreach(var c in a[0])System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

About 70 for just the method body.

Add 5 chars to include a LF/CR in the output:

class P{static void Main(string[]a){foreach(var c in a[0]+"\n")System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

A LINQ version would be shorter:

class P{static void Main(string[]a){a[0].Any(c=>System.Console.Write(
(char)(c>64&&c<91?32+c:c))is P);}}

(103) .. except that it requires using System.Linq; (total: 121).



1

Python 3 - 70

Updated for OP's changes.

I'm a Python newbie, so any critique is welcome.

print("".join(chr(ord(c)+32) if 64<ord(c)<91 else c for c in input()))

I'm sorry, I had to say that you're not allowed to use a to-lower function on one character. Question updated.
ProgramFOX

1
Please see my recent comment: your code does only work if the input string contains only uppercase characters, but please note that it also contain other ASCII characters such as lowercase characters and numbers.
ProgramFOX

Okay, will update when I get home
asteri

@ProgramFOX Updated.
asteri

Jeff, check out @minitechs answer. You both have very similar approaches so you should be able to see how, and why his answer is shorter.

1

Perl, 9 + 1 (for -p flag) = 10

$_="\L$_"

\L was specifically asked about and allowed, because even though it's a built-in, it's not a function.


1

Powershell, 53 49 bytes

-4 bytes thanks @AdmBorkBork

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

Test script:

$f = {

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

}

@(
    ,("Hello WORLD from PowerShell", "hello world from powershell")
) | % {
    $a,$e = $_
    $r = &$f $a
    "$($r-eq$e): $r"
}

Output:

True: hello world from powershell

cool! ¯\_(ツ)_/¯
mazzy

1

8086 machine code, 14 bytes

Assembled:

AC 3C 41 7C 06 3C 5A 7F 02 0C 20 AA E2 F2

Unassembled listing:

 ; Lowercase a string
 ; Input: string: SI, length: CX
 ; Output: string: DI
 TOLOW  MACRO   
        LOCAL _LOOP, _STORE
       _LOOP:
 AC         LODSB           ; load byte from [SI] into AL, advance SI 
 3C 41      CMP  AL, 'A'    ; is char less than 'A'? 
 7C 06      JL   _STORE     ; if so, do not convert 
 3C 5A      CMP  AL, 'Z'    ; is char greater than 'Z'? 
 7F 02      JG   _STORE     ; if so, do not convert 
 0C 20      OR   AL, 020H   ; lowercase the char 
       _STORE:
 AA         STOSB           ; store char to [DI], advance DI 
 E2 F2      LOOP _LOOP      ; continue loop through string 

Implemented as a MACRO (essentially a function). Input string in SI, length in CX. Output string in DI.

Output from PC DOS test program:

enter image description here

Download and test TOLOW.COM example program.


where is the 14 byte count coming from? the snippet is longer than that, even without comments... is 14 bytes the compiled program?
Jonah

1
@Jonah The byte opcode is in the lefthand column, AC 3C 41, etc. I'll add the assembled hex byte code to the top for clarity. codegolf.meta.stackexchange.com/a/12340/84624
640KB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.