การแปลงสตริงเป็นตัวพิมพ์เล็ก (โดยไม่ต้องมีฟังก์ชั่นบิวท์อินถึงตัวต่ำกว่า!)


25

เป้าหมายของ code-golf นี้คือการสร้างรหัสที่อนุญาตให้ผู้ใช้ป้อนสตริง ASCII (มีอักขระ ASCII ที่พิมพ์ได้เท่านั้น) และโปรแกรมของคุณจะแสดงตัวแปรตัวพิมพ์เล็กของสตริงนี้

สำคัญ: คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชันในตัวที่แปลงสตริง (หรืออักขระเพียงตัวเดียว) เป็นตัวพิมพ์เล็ก (เช่นToLower()ใน. NET, strtolower()ใน PHP, ... )! อย่างไรก็ตามคุณได้รับอนุญาตให้ใช้ฟังก์ชั่นในตัวอื่น ๆ ทั้งหมด

หมายเหตุสำคัญอื่น:สตริงอินพุตไม่มีอักขระตัวพิมพ์ใหญ่เท่านั้น สายป้อนเป็นส่วนผสมของอักขระตัวพิมพ์ใหญ่ตัวอักษรตัวพิมพ์เล็กตัวเลขและอื่น ๆASCII พิมพ์ตัวอักษร

โชคดี!


4
น่าเสียดายที่ฉันจะต้องยกเลิก ฉันไม่ใช่มือใหม่
John Dvorak

@Jan: จริง ๆ แล้วกับผู้เริ่มต้นฉันหมายถึงว่าระดับทักษะนี้จะเป็น 'ผู้เริ่มต้น' ไม่ใช่แค่ผู้เริ่มต้นเท่านั้นที่ได้รับอนุญาตให้เข้า ฉันลบคำว่า 'เริ่มต้น' และแน่นอนคุณได้รับอนุญาตให้เข้า
ProgramFOX

1
นิพจน์ทั่วไปได้รับอนุญาตหรือไม่ GolfScript เท่านั้นที่สามารถเอาชนะs/./\L\0/gได้
จัดการ

3
@ การผลิต: แน่นอน\Lถูกสร้างขึ้นใน?
marinus

@ manatwork: ใช่ regex ได้รับอนุญาต
ProgramFOX

คำตอบ:


21

เชลล์ - 10

@ แปลของการแก้ปัญหา Perl Gowtham /bin/trโดยใช้

tr A-Z a-z

วิ่งตัวอย่าง:

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

อะไรทำให้สิ่งนี้เป็นคำตอบที่ได้รับการยอมรับจากความอยากรู้ Gowtham มีวิธีแก้ปัญหา 10 ตัวอักษรก่อน ...
Ry-

1
จากการอภิปรายเกี่ยวกับเมตาดูเหมือนว่าเหตุผลคือวิธีการแก้ปัญหาของ Gowtham คือ 11 ตัวอักษร (เพราะ-pธงนับเป็นหนึ่ง) ผมเห็นด้วย แต่เขาดูเหมือนว่ามันสมควรได้รับมากขึ้นในการได้รับการยอมรับ ..
หิ่งห้อย

อ่าขอบคุณ - นั่นสมเหตุสมผล ฉันจะเก็บไว้ในใจ!
Ry-

53

Python 2.7 - 30 (ด้วยการใช้กฎที่ไม่ดีและไม่เหมาะสม)

raw_input().upper().swapcase()

ในฐานะที่เป็นการแก้ไขแบบไม่ระบุชื่อคุณสามารถทำได้ 2726 ใน Python 3 :

input().upper().swapcase()

ฉันทำผิดกฎอย่างชัดเจนที่นี่ แต่ ...

สำคัญ: คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชันในตัวที่แปลงสตริง (หรืออักขระเพียงตัวเดียว) เป็นตัวพิมพ์เล็ก (เช่นToLower()ใน. NET, strtolower()ใน PHP, ... )! อย่างไรก็ตามคุณได้รับอนุญาตให้ใช้ฟังก์ชั่นในตัวอื่น ๆ ทั้งหมด

การดำเนินการนี้จะใช้สตริงและแปลงเป็นตัวพิมพ์ใหญ่ จากนั้นในการเรียกใช้เมธอดที่ไม่เกี่ยวข้องมากมันจะสลับตัวพิมพ์เล็กของสตริง - เพื่อให้ตัวอักษรตัวพิมพ์เล็กเป็นตัวอักษรตัวพิมพ์ใหญ่ ... และสลับตัวอักษรตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก


1
โซลูชัน Python 3 มีอักขระ26ตัว
Timtech

@ Timtech ฉันไม่สามารถนับได้

1
มันไม่ได้เป็นเพียงแค่ที่ไม่เกี่ยวข้อง มันไม่เกี่ยวข้องกันมาก
Carter Pape

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:)
Gowtham

1 ถ้าคุณสมมติ-e( perl -e-> perl -pe), 3 ถ้าคุณสมมติสคริปต์ ( perl-> perl -p)
nyuszika7h

10

Befunge-98 - 26 22 21 19

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

ขึ้นอยู่กับความจริงที่(c-39)/26มี1ไว้สำหรับรหัสอักขระของอักขระ ASCII ตัวพิมพ์ใหญ่เท่านั้น (สมมติว่าการหารจำนวนเต็ม) สำหรับตัวละครแต่ละตัวพิมพ์ออกcc + (((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())ทำงานของบิต
asteri

1
@JeffGohlke: mapใช้ฟังก์ชัน (ในกรณีนี้ord) กับ interable และส่งคืน iterable (ord(x) for x in input())มันเหมือนเป็นรูปแบบสั้น
Ry-

เข้าใจแล้ว ขอบคุณสำหรับคำอธิบาย!
asteri

1
คำตอบของคุณเป็นไปตามจิตวิญญาณของคำถาม แต่ของฉันตามตัวอักษรของคำถาม ...

ดีมาก. for c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end='')ชนะการแก้ปัญหา 62 ความยาวของผมยังไม่ได้โหลด ฉันลองใช้map(ord,input())เคล็ดลับบางอย่างแต่พลาดค่าความจริงคูณด้วย 32 และเพิ่มเข้าไปในเคล็ดลับรหัสอักขระ ดีมาก.
Steven Rumbalski

8

Ruby, 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. ดำเนินการตามขั้นตอนวิธีในจุดรหัสพื้นที่: &.(a.&i.)
  3. ระบุช่วงอักขระสำหรับแต่ละตัวอักษร ตัวละครระหว่าง codepoints ว่า "@" และ "Z" 1=I.จะถือว่าเป็นตัวพิมพ์ใหญ่:
  4. สำหรับ codepoint ตัวพิมพ์ใหญ่แต่ละตัวให้เพิ่ม 32: ]+32* ...
  5. โปรดทราบว่าขั้นตอนที่ (2) สร้างขั้นตอนโดยนัย (5): เราเริ่มต้นด้วยการฉายจากตัวละครไปยังโดเมนจำนวนเต็มดังนั้นเมื่อเราเสร็จแล้วเราจะจับคู่จำนวนเต็มเหล่านั้นกลับไปยังตัวละคร

เห็นได้ชัดว่าการใช้งานเฉพาะนี้พิจารณาเฉพาะ ASCII เท่านั้น แต่วิธีการนั้นสามารถขยายไปถึงระนาบการพูดได้หลายภาษาขั้นพื้นฐานใน Unicode


1
ดี! น่าเสียดายที่ดูเหมือนว่าโซลูชันของคุณกำลังดำเนินไปอย่างไม่ถูกต้อง ;-) ควรแก้ไขได้อย่างง่ายดาย (แก้ไข: '@Z'(]+32*1=I.)&.(a.&i.)1!:1]1ควรทำ)
FireFly

จับได้ดีขอบคุณ ฉันก็ประทับใจเช่นกันที่คุณสามารถแก้ไขรหัสด้วยตัวเอง: J ไม่ใช่ภาษาที่เข้าถึงได้ง่ายที่สุดในตอนนี้ :)
Dan Bron

อ่าฉันได้เล่นกับ J ด้วยตัวเอง .. ฉันพยายามที่จะหาu:(a.i.x)+32*1='@Z'I.x=.1!:1]1สิ่งที่ตรงกับความยาวของคุณ แต่ก็น่าสนใจน้อยกว่า (เพราะมันใช้ 'ใต้' ไม่ได้) พูดถึงสิ่งที่ฉันไม่รู้เกี่ยวกับ dyadic I.ดังนั้นขอบคุณที่ใช้มัน :-)
FireFly

เย็น. แต่วิธีการแก้ปัญหา Befunge ของคุณยังมี J เอาชนะ 4 ตัว เห็นได้ชัดว่าฉันไม่สามารถปล่อยให้สิ่งนั้นยืนอยู่ได้ :) ฉันพยายามดูว่าการแก้ปัญหา J นั้นลดลงหรือไม่โดยทำตามผู้นำของคุณในการพึ่งพา '@' เพียงอย่างเดียวแทนที่จะเป็น '@' และ 'Z'
Dan Bron

(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

เราต้องการ c> = 0 เนื่องจาก getchar (EOF) จะเป็น <0 ขอบคุณสำหรับคำแนะนำอื่น ๆ
Rozuur

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

1
ข้อผิดพลาดเล็ก ๆ น้อย ๆ : ดูเหมือนว่าควรจะมี 65 แทนที่จะเป็น 64 pastebin.com/Zc9zMx2W
จัดการเอกสาร

5

Golfscript - 17

โปรแกรม:

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

คำอธิบาย:

  1. {}% จับคู่โค้ดภายในกับอักขระทุกตัวในสตริง
  2. .. คัดลอกส่วนบนสุดของสแต็ก (อักขระ) สองครั้ง
  3. 64> 1 ถ้ารหัสอักขระมากกว่า 64 อีก 0
  4. \สลับสองไอเท็มบนสแต็ก (รับสำเนาตัวอักษรตัวที่สองและเก็บผลลัพธ์ของการ64>อยู่ในตำแหน่งที่สอง)
  5. 91< ตรวจสอบเพื่อดูว่ารหัสอักขระน้อยกว่า 91 คล้ายกับขั้นตอนที่ 3
  6. *คูณผลลัพธ์จากขั้นตอนที่ 3 และ 5 เข้าด้วยกัน เท่ากับ 1 เท่านั้นหากทั้งสองขั้นตอนเป็นจริง
  7. 32* ทวีคูณผลลัพธ์ของขั้นตอนที่ 6 ด้วย 32 จะเป็น 32 ถ้าขั้นตอนที่ 6 เป็น 1 และอีก 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

เคล็ดลับที่น่าอัศจรรย์ @ F.Hauri!
จัดการ

@ nyuszika7h +1 คือ-pพารามิเตอร์บรรทัดคำสั่งไม่ใช่บรรทัดใหม่
จัดการ

ขอโทษด้วย
nyuszika7h

3

Python (33)

หากมีข้อสงสัยให้ใช้เปลือก

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

น่าเสียดายที่นี่ยังคงนานกว่าโซลูชันของเลโก้


+1 นั่นไม่ใช่ Python ที่คุณใช้อยู่ ใช้งานได้กับ linux เท่านั้น แต่ก็ยังมีกฎเกณฑ์ที่เข้มงวดอยู่มาก !!!

@LegoStormtroopr ทำงานได้ทุกที่มีtrคำสั่ง (ซึ่งทำสิ่งที่ถูกต้อง) บนเส้นทางของเชลล์ที่เรียกใช้ฉันคิดว่า
Paŭlo Ebermann

3

DELPHI

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 ไม่ใช่ภาษาที่ยอดเยี่ยมสำหรับการเล่นกอล์ฟ ฉันใช้เดลฟายด้วยตัวเองและถึงแม้ว่าจะไม่มีโอกาสอันยิ่งใหญ่ที่ฉันจะชนะการแข่งขันกอล์ฟกับเดลฟาย แต่มันก็ยังสนุกที่จะท้าทายตัวเอง
Teun Pronk

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(''))
บาง

@ บางโอปฉันสงสัยว่าฉันมากับตัวอย่างนั้น .. ฉันค่อนข้างแน่ใจว่าฉันทดสอบรหัสนั้นบางทีฉันอาจคัดลอกรุ่นที่ไม่ทำงานหรือบางสิ่งบางอย่าง อย่างไรก็ตามขอขอบคุณสำหรับการแก้ไข
FireFly

ใช้ bitwise andแทนที่จะเป็นตรรกะ ... ดี!
บาง

ES6 มากยิ่งขึ้นการแก้ปัญหา ( 79L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join('') ): การใช้งาน:L('SoMeTeXt')
Florent

ดี! ฉันไม่แน่ใจเกี่ยวกับการทำให้มันเป็นฟังก์ชั่นเพียงอย่างเดียวเนื่องจากโซลูชันอื่น ๆ ทั้งหมดเป็นโปรแกรมที่ "เหมาะสม" ยังใช้ดีมากfor..ofโดยไม่คำนึงถึง
FireFly

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? 

ทั้งหมดทำงานได้ดี แต่ข้อได้เปรียบของการเปลี่ยนแปลง|(หรือ) โดย^(xor) คือไวยากรณ์เดียวกันอาจจะใช้สำหรับtoLower, toUpperหรือ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? 

ฉันลืม +1 -pด้วยคำขอโทษ @manatwork
F. Hauri

ไม่ได้นี้แปล@เพื่อ Backtick และ[\]^_เพื่อ{|}~DEL? และในนั้นก็เป็นส่วนที่ยุ่งยาก ..
FireFly

1
@FireFly ไม่จำเป็นต้องตรงกับ$& [A-Z]
F. Hauri

โอ้ฉันไม่ดี เจ๋งมากแล้ว!
FireFly

3

javascript 80

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

(76 ถ้าคุณลบ"X")

ด้วยpromptและalert- 92

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

ซอ

ขอบคุณ @FireFly @some @ C5H8NNaO4 และ @minitech


เอ่อคุณต้องปิดอาร์กิวเมนต์ที่สองreplaceด้วยfunction($){return ...}ใช่ไหม อย่างไรก็ตามพารามิเตอร์แรกของฟังก์ชันการแทนที่คือสตริงที่ตรงกันดังนั้นคุณสามารถวาง parens ใน regex ได้
FireFly

ฉันจะไปเกี่ยวกับการใช้งานเช่นนี้ได้อย่างไร
C5H8NNaO4


6
ฉันคิดว่าคำตอบทั้งหมด (หรืออย่างน้อยที่สุด) ที่นี่อ่านจาก stdin และพิมพ์เป็น stdout จากสิ่งที่ฉันรวบรวมการประชุมคือการใช้promptและalertสำหรับ I / O ใน JS
FireFly

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

นั่นคือ86ตัวอักษร - ขึ้นบรรทัดใหม่นับเป็น 2 ตัวอักษร ( string-functions.com/length.aspx )
Timtech

@Timtech: ใน R คุณสามารถแทนที่บรรทัดใหม่ในรหัสได้โดย;ไม่ต้องนับเพียงหนึ่งตัวอักษร มันสามารถเขียนได้:a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus

ใช่ตอนนี้ฉันรู้แล้ว ฉันอ่านเมตาดาต้า ... ดูเหมือนว่าเฉพาะใน Windows ที่ขึ้นบรรทัดใหม่คือ 2 ตัวอักษร (ฉันใช้โปรแกรมเพื่อวัดความยาวของรหัสของฉัน)
Timtech



2

PHP (42)

เรียกใช้จากบรรทัดคำสั่ง:

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

-R และจะไม่นับเครื่องหมายคำพูดเดี่ยว


หากคุณติดตามโซลูชัน Peal ของ Gowtham คุณจะนับได้เพียง 42 ตัวอักษร
eisberg

1
@eisberg: อัปเดตคะแนนโดยปล่อยให้เป็นเวอร์ชั่น 43 ตัวละครในประวัติศาสตร์ในกรณีที่มีข้อโต้แย้งใด ๆ
PleaseStand

str_ireplaceการค้นหาแบบไม่คำนึงถึงขนาดตัวพิมพ์ซึ่งยืดกฎออกไปถ้าไม่ทำให้แตก
ugoren

@ugoren ฉันไม่คิดอย่างนั้น เนื่องจากมีการระบุไว้อย่างชัดเจนว่าไม่อนุญาตให้สร้างฟังก์ชั่นในการเปลี่ยนเคสและไม่สนใจเคสที่ไม่เปลี่ยน
eisberg

2

PowerShell: 69 65 64

ฉันได้ลองใช้วิธีครึ่งโหลเพื่อให้แทนที่ทำงานในแบบที่ฉันต้องการโดยไม่ต้องใช้เวลานาน [regex]::Replaceไวยากรณ์แต่ฉันไม่ได้โชคดี หากใครมีความคิดว่าอะไรที่ใช้งานได้โปรดแนะนำให้ทำ

รหัส Golfed:

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

การเปลี่ยนแปลงจากต้นฉบับ:

  • จัดเรียงอาร์กิวเมนต์ล่าสุดเพื่อ[int]ไม่จำเป็นต้องใช้อีกต่อไปตามคำแนะนำในความคิดเห็น

คำอธิบาย:

(read-host) รับอินพุตของผู้ใช้

[regex]::Replace(... )บอก PowerShell ให้ใช้การจับคู่ RegEx เพื่อดำเนินการแทนบนสตริง

"[A-Z]" ตรงกับตัวอักษรตัวพิมพ์ใหญ่ทั้งหมด

{... }บอก PowerShell ให้ใช้สคริปต์เพื่อกำหนดค่าการแทนที่

[char]"$args" ใช้การจับคู่ปัจจุบันและพิมพ์เป็นอักขระ ASCII

32+ แปลงอักขระเป็นจำนวนเต็มซึ่งแทนรหัส ASCII และเพิ่มค่าด้วย 32 ซึ่งจะจับคู่รหัส ASCII ของตัวอักษรตัวเล็กที่สอดคล้องกัน

[char](...)รับค่าผลลัพธ์และแปลงกลับเป็นอักขระ ASCII

ตัวอย่างของต้นฉบับ:

ป้อนคำอธิบายรูปภาพที่นี่

(เวอร์ชันปัจจุบันทดสอบแล้ว - ภาพหน้าจอยังไม่โพสต์)


1
ยังไม่ได้ตรวจสอบเกี่ยวกับวิธีการแก้ไข[regex]::Replaceแต่คุณสามารถบันทึกได้ 4 ตัวอักษรโดยเปลี่ยน[int]เป็น+
goric

1
ที่จริงแล้วอาร์กิวเมนต์สุดท้ายทั้งหมดสามารถจัดใหม่ได้{[char](32+[char]"$args")}ซึ่งทำให้ไม่จำเป็นต้องร่ายไปยัง int อย่างชัดเจนและกำจัดอักขระอีกหนึ่งตัวออกไป
goric

@goric Geez ทำไมฉันไม่คิดอย่างนั้น? ยังคงเรียนรู้ฉันเดา
Iszi

2

k2, 15 ไบต์

ฉันสุดสายไปคนนี้ แต่ฉันก็พบว่ามันยอดเยี่ยมอยู่ดี

{_ci 32+_ic x}'

นอกจากนี้:

Pyth, 10 ไบต์

ไม่นับเพราะ Pyth ถูกสร้างหลังจากโพสต์สิ่งนี้ ยังคงเย็น

jkmC+32Cdw

2

05AB1E , 3 ไบต์

u.š

ท่าเรือ@ user8777หลาม 3 คำตอบ

ลองออนไลน์

คำอธิบาย:

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

แต่ไม่มีบิวด์อินที่เปลี่ยนแปลงตัวพิมพ์:

05AB1E , 12 11 ไบต์

ÇIS.u32*+çJ

-1 ขอบคุณไบต์@Emigna

ลองออนไลน์

คำอธิบาย:

Ç            # 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บันทึกไบต์บนเวอร์ชัน 12 ไบต์ของคุณ
Emigna

@Emigna อ่าฉลาด ฉันได้พยายาม.u32*+วิธีการเช่นนี้εÇy.u32*+ç]Jแต่โชคร้ายçแรปตัวละครในรายการเพื่อเพิ่มJหรือ `ที่ถูกต้องหลังจากที่ç..
เควิน Cruijssen

1

Javascript, 105

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

ที่จริงแล้วไม่มีการระบุรูปแบบผลลัพธ์ดังนั้นให้เรียกใช้ในคอนโซล ใช่จาวา JavaScript เป็น verbose ด้วย charcode <-> สตริง


1
c.charCodeAt()- มันจะเป็นค่าเริ่มต้น0หากไม่ใส่ดัชนี นอกจากนี้การหยุดที่ '@' ฉันเชื่อ (มันจะทำให้ "ลด" ลงใน backtick)
FireFly

@FireFly ดีขอบคุณ! ตกลงฉันจะแก้ไขมัน =)
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));}}

ประมาณ 70 สำหรับวิธีร่างกายเท่านั้น

เพิ่ม 5 chars เพื่อรวม LF / CR ในเอาต์พุต:

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

รุ่น LINQ จะสั้นกว่า:

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) .. ยกเว้นจะต้องมีusing System.Linq;(ทั้งหมด: 121)



1

Python 3 - 70

อัปเดตสำหรับการเปลี่ยนแปลงของ OP

ฉันเป็นมือใหม่ใน Python ดังนั้นคำวิจารณ์ใด ๆ ก็ยินดีต้อนรับ

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

ฉันขอโทษที่ต้องบอกว่าคุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นการลงบนตัวละครตัวหนึ่ง อัปเดตคำถามแล้ว
ProgramFOX

1
โปรดดูความคิดเห็นล่าสุดของฉัน : รหัสของคุณใช้งานได้เฉพาะเมื่อสตริงอินพุตมีอักขระตัวพิมพ์ใหญ่เท่านั้น แต่โปรดทราบว่ามันยังมีอักขระ ASCII อื่น ๆ เช่นตัวอักษรตัวเล็กและตัวเลข
ProgramFOX

ตกลงจะอัปเดตเมื่อฉันกลับถึงบ้าน
asteri

@ProgramFOX อัปเดตแล้ว
asteri

เจฟฟ์, ตรวจสอบคำตอบ @minitechs คุณทั้งคู่มีวิธีการที่คล้ายกันมากดังนั้นคุณควรจะสามารถดูได้อย่างไรและทำไมคำตอบของเขาจึงสั้นลง

1

Perl, 9 + 1 (สำหรับแฟล็ก -p) = 10

$_="\L$_"

\L ถูกถามโดยเฉพาะเกี่ยวกับและได้รับอนุญาตเพราะถึงแม้จะเป็นในตัว แต่ก็ไม่ใช่ฟังก์ชั่น


1

Powershell, 53 49 ไบต์

-4 ไบต์ขอบคุณ @AdmBorkBork

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

สคริปต์ทดสอบ:

$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"
}

เอาท์พุท:

True: hello world from powershell

เย็น! ¯\_(ツ)_/¯
mazzy

1

รหัสเครื่อง 8086, 14 ไบต์

ประกอบ:

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

รายการที่ยังไม่ได้ประกอบ:

 ; 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 

นำมาใช้เป็นMACRO(ฟังก์ชั่นเป็นหลัก) สายป้อนในความยาวในSI สตริงเอาท์พุทCXDI

ผลลัพธ์จากโปรแกรมทดสอบ PC DOS:

ป้อนคำอธิบายรูปภาพที่นี่

ดาวน์โหลดและทดสอบโปรแกรมตัวอย่างTOLOW.COM


นับ 14 ไบต์มาจากไหน ข้อมูลโค้ดยาวกว่านั้นแม้ว่าจะไม่มีความคิดเห็นก็ตาม ... 14 ไบต์เป็นโปรแกรมที่รวบรวมหรือไม่
โยนาห์

1
@Jonah opcode เป็น byte อยู่ในคอลัมน์ lefthand AC 3C 41ฯลฯ ฉันจะเพิ่มรหัส byte hex ประกอบขึ้นไปด้านบนเพื่อความกระจ่าง codegolf.meta.stackexchange.com/a/12340/84624
640KB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.