Перетворення рядка в малі регістри (без вбудованих до нижчих функцій!)


25

Мета цього коду-гольфу - створити код, який дозволяє користувачеві вводити рядок ASCII (містить лише символи для друку ASCII ), а ваша програма виводить нижній регістр цього рядка.

Важливо: вам НЕ дозволяється використовувати вбудовану функцію, яка перетворює рядок (або лише один символ) у малі регістри (наприклад, ToLower()у .NET, strtolower()у PHP, ...)! Однак ви можете використовувати всі інші вбудовані функції.

Ще одне важливе зауваження: рядок введення містить не лише великі символи. Вхідний рядок являє собою поєднання великих символів, малих символів, цифр та інших символів для друку ASCII .

Удачі!


4
на жаль, мені доведеться відмовитися. Я не новачок.
Джон Дворак

@Jan: Що ж, з початківцем я насправді мав на увазі, що рівень майстерності цього рівня буде «початківцем», а не тільки початківцям дозволяти вступати. Я видалив слово "новачок" і, безумовно, вам дозволяється входити.
ProgramFOX

1
Чи дозволені регулярні вирази? Побоїти міг лише GolfScript s/./\L\0/g.
манатство

3
@manatwork: напевно \Lвбудований?
marinus

@manatwork: Так, регулярний вираз дозволений.
ProgramFOX

Відповіді:


21

Оболонка - 10

Переклад рішення Perl @ Gowtham за допомогою /bin/tr.

tr A-Z a-z

Проба зразка:

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

Що робить це прийнятою відповіддю з цікавості? Gowtham мав розчин 10-символьний перший ...
Рибаковим

1
Виходячи з мета-дискусії, здається, міркування полягає в тому, що рішення Гоутема становить 11 знаків (адже -pпрапор вважається одним). Я згоден, однак, схоже, він заслуговує на те, щоб його більше прийняли ..
FireFly

Ах, дякую - це має сенс. Я буду пам'ятати про це!
Ри-

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
Це не просто не пов'язано між собою. Це дуже не пов'язано.
Картер Папе

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 (припустимо, що це ціле ділення). Для кожного символу 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

Пітон 3, 58

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

Чи можете ви пояснити, як це працює? Мені дуже цікаво покращитися на Python. Я не розумію, як map(ord,input())працює шматочок.
asteri

1
@JeffGohlke: mapзастосовує функцію (в даному випадку ord) до цілісного і повертає ітерабельний. Це як коротша форма (ord(x) for x in input()).
Ри-

Зрозумів. Дякую за пояснення!
asteri

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. Виконайте алгоритм у просторі кодової точки: &.(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 - це не сама доступна мова тут :)
Dan Bron

Ах, я сам грав з Дж. Я встиг придумати u:(a.i.x)+32*1='@Z'I.x=.1!:1]1, що відповідає вашій довжині, але набагато менш цікавий (оскільки він не використовує "під"). Говорячи про це, я не знав про діадік 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 символів: drop int і ,c>=0. Вони тут не потрібні.
JoeFish

нам потрібно c> = 0, оскільки getchar (EOF) буде <0. Дякую за інші пропозиції.
Розуур

2
1. ~(c=getchar())2.c-64u<27
угорен

1
Незначно невелика помилка: здається, має бути 65 замість 64. pastebin.com/Zc9zMx2W
manatwork

5

Гольфскрипт - 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!
манастирство

@ nyuszika7h +1 є параметром -pкомандного рядка, а не новим рядком.
манатура

О так, вибачте.
nyuszika7h

3

Пітон (33)

Якщо ви сумніваєтесь, використовуйте оболонку.

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

На жаль, це все-таки довше рішення Лего.


+1 Це насправді не вбудований Python, який ви використовуєте. Працює лише на Linux, але все ще дуже обмежений за правила !!!

@LegoStormtroopr Працює скрізь, trна шляху викликаної оболонки, мабуть, є команда (яка робить правильно).
Paŭlo Ebermann

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 - це не чудова мова для гри в гольф. Я використовую сам дельфі, і хоча не існує великого шансу, що я зміг би виграти гольф з дельфі, все одно цікаво кинути собі виклик.
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

Використання побіжно andзамість логічного ... приємно!
десь

Ще більш ES6 рішення ( 79 ): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join(''). Використання:L('SoMeTeXt')
Флорент

Приємно! Я не впевнений у тому, щоб зробити це просто функцією, оскільки всі інші рішення - це "належні" програми. Тим не менш, дуже приємно використовувати for..ofнезалежно.
FireFly

3

Перл 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:

до верхнього:

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

Хіба це не перевести @на лапки і [\]^_до {|}~DEL? І в цьому криється хитра частина ..
FireFly

1
@FireFly Ні, $&повинні відповідати [A-Z].
Ф. Хаурі

Ой, моя погана. Тоді дуже круто!
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


Er, вам потрібно обернути другий аргумент replaceз function($){return ...}, немає? До речі, перший парам до функції заміни - це відповідна рядок, щоб ви могли скинути парени в регулярний вираз.
FireFly

Як би я пішов про це, як це?
C5H8NNaO4

@ C5H8NNaO4 str (код тут)
Math chiller

6
Я думаю, що всі (або, принаймні, більшість) відповідей тут прочитані від stdin та друкуються до stdout. З того, що я збираю, умова - це використання promptта alertвведення / виведення в JS.
FireFly

1
/gДля правильної роботи вам потрібен прапор.
Ри-

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символи - нові рядки вважаються двома символами. ( 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, що нові рядки мають два символи (я використовував програму для вимірювання довжини мого коду).
Timtech



2

PHP (42)

Запустити з командного рядка:

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

-R і єдині лапки не враховуються.


Якщо ви будете дотримуватися рішення Гоутама Піл, ви б налічили лише 42 символи.
eisberg

1
@eisberg: оновлено бал, залишивши 43-символьну версію в історії у випадку будь-яких суперечок.
Будь ласка, продовжте

str_ireplaceробить випадок нечутливого пошуку, який розтягує правила, якщо не порушує їх.
ugoren

@ugoren Я так не думаю. Оскільки чітко сказано, що тільки вбудовувати функції, що змінюють корпус, не дозволяється, і це ігнорування випадку, а не його зміна.
eisberg

2

PowerShell: 69 65 64

Я спробував півдесятка способів змусити Замінити роботу так, як мені хочеться, не використовуючи довгий [regex]::Replaceсинтаксис, але мені не пощастило. Якщо хтось інший має уявлення про те, що може працювати, будь ласка, запропонуйте це.

Код для гольфу:

[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, чому я цього не придумав? Я все ще вчуся, я здогадуюсь.
Іссі

2

k2, 15 байт

Я супер пізно з цим, але я все-таки знайшов цей класний.

{_ci 32+_ic x}'

Також:

Pyth, 10 байт

Насправді не рахується, тому що Pyth був створений після публікації цього повідомлення. Ще круто.

jkmC+32Cdw

2

05AB1E , 3 байти

u.š

Порт @ user8777 відповідь Python 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 Ах, розумний. Я спробував такий .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 дійсно є багатослівним з рядком charcode <->


1
c.charCodeAt()- вона за замовчуванням, 0якщо індекс пропущено. Крім того, перерви на "@" Я вважаю (він стає "нижчим" у backtick)
FireFly

@FireFly Приємно, спасибі !, добре, я все
виправлю


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 символів, щоб включити 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

Пітон 3 - 70

Оновлено для змін в ОП.

Я новачок Python, тому будь-яка критика вітається.

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

Вибачте, я повинен був сказати, що вам заборонено використовувати функцію "нижчий" на одному символі. Питання оновлено.
ProgramFOX

1
Будь ласка, дивіться мій останній коментар : ваш код працює лише у тому випадку, якщо рядок введення містить лише великі символи, але зауважте, що він також містить інші символи ASCII, такі як маленькі символи та цифри.
ProgramFOX

Гаразд,
оновлюсь,

@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

круто! ¯\_(ツ)_/¯
маззи

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, довжина в CX. Вихідний рядок вDI .

Вихід з тестової програми ПК DOS:

введіть тут опис зображення

Завантажте та протестуйте приклад програми TOLOW.COM .


звідки походить 14 байт? фрагмент довший за це, навіть без коментарів ... це 14 байт складеної програми?
Йона

1
@Jonah Опційний байт знаходиться у лівій колонці AC 3C 41тощо. Я для додавання ясності додаю зібраний шістнадцятковий байтовий код у верхній частині. codegolf.meta.stackexchange.com/a/12340/84624
640KB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.