Conversion d'une chaîne en minuscules (sans fonctions intégrées vers minuscules!)

25

Le but de ce code-golf est de créer un code qui permet à l'utilisateur de saisir une chaîne ASCII (ne contient que des caractères ASCII imprimables ), et votre programme sort la variante minuscule de cette chaîne.

Important: vous n'êtes PAS autorisé à utiliser une fonction intégrée qui convertit la chaîne (ou un seul caractère) en minuscules (comme ToLower()en .NET, strtolower()en PHP, ...)! Vous êtes toutefois autorisé à utiliser toutes les autres fonctions intégrées.

Autre remarque importante: la chaîne d'entrée ne contient pas que des caractères majuscules. La chaîne d'entrée est un mélange de caractères majuscules, de caractères minuscules, de chiffres et d'autres caractères imprimables ASCII .

Bonne chance!

ProgramFOX
la source
4
malheureusement, je vais devoir me retirer. Je ne suis pas débutant.
John Dvorak
@Jan: Eh bien, avec un débutant, je voulais en fait dire que le niveau de compétence serait "débutant", pas que seuls les débutants seraient autorisés à entrer. J'ai supprimé le mot «débutant» et vous êtes sûrement autorisé à entrer.
ProgramFOX
1
Les expressions régulières sont-elles autorisées? Seul GolfScript pouvait battre s/./\L\0/g.
manatwork
3
@manatwork: \Lest sûrement intégré?
marinus
@manatwork: Oui, une expression régulière est autorisée.
ProgramFOX

Réponses:

21

Coquille - 10

Traduction de la solution Perl de @ Gowtham à l'aide de /bin/tr.

tr A-Z a-z

Exemple d'exécution:

% tr A-Z a-z <<<'Hello WORLD! @'
hello world! @
Luciole
la source
Qu'est-ce qui en fait la réponse acceptée, par curiosité? Gowtham avait d'abord une solution à 10 caractères…
Ry-
1
Sur la base de la discussion sur la méta , le raisonnement semble être que la solution de Gowtham est de 11 caractères (car le -pdrapeau compte pour un). Je suis d'accord cependant, le sien semble mériter plus d'être accepté ..
FireFly
Ah, merci - cela a du sens. Je m'en souviendrai!
Ry-
53

Python 2.7 - 30 (avec un abus de règle terrible et sans excuse)

raw_input().upper().swapcase()

Comme l'a souligné une modification anonyme, vous pouvez le faire dans 2726 en Python 3 :

input().upper().swapcase()

J'abuse de manière flagrante des règles ici, mais ...

Important: vous n'êtes PAS autorisé à utiliser une fonction intégrée qui convertit la chaîne (ou un seul caractère) en minuscules (comme ToLower()en .NET, strtolower()en PHP, ...)! Vous êtes toutefois autorisé à utiliser toutes les autres fonctions intégrées.

Cela prend les cordes et les couvre en majuscules . Ensuite, dans un appel de méthode très indépendant, il inverse la casse de la chaîne - de sorte que toutes les lettres minuscules deviennent des lettres majuscules ... et permute toutes les lettres majuscules en lettres minuscules .


la source
1
La solution Python 3 comprend 26 caractères.
Timtech
@Timtech Je ne peux pas compter.
1
Ce n'est pas seulement sans rapport. C'est très indépendant.
Carter Pape
1
Cela aura des résultats étranges lorsque vous rencontrez du texte contenant les caractères ß.
FUZxxl
33

Perl - 11 10 caractères.

y/A-Z/a-z/

y///c'est pareil tr///!

En action:

% perl -pe 'y/A-Z/a-z/' <<< 'Hello @ WORLD !'
hello @ world !
Gowtham
la source
3
+1, pour la seule langue de la vie réelle qui a battu tous les moins (?) Vrais.
Behrooz
En fait, c'est 11 caractères. L' -poption est comptée comme 1.
manatwork
@manatwork Ou cela devrait être compté comme 2: -et p:)
Gowtham
1 si vous supposez -e( perl -e-> perl -pe), 3 si vous supposez un script ( perl-> perl -p).
nyuszika7h
10

Befunge-98 - 26 22 21 19

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

S'appuie sur le fait que ce (c-39)/26n'est 1que pour les codes de caractères de caractères ASCII majuscules (en supposant une division entière). Pour chaque caractère c, imprimez c + (((c-39)/26)==1)*' '.

Exemple de session:

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

Python 3, 58

print("".join(chr(ord(x)+('@'<x<'[')*32)for x in input()))
Ry-
la source
Pouvez-vous expliquer comment cela fonctionne? Je suis vraiment intéressé à m'améliorer en Python. Je ne comprends pas comment ça map(ord,input())fonctionne.
asteri
1
@JeffGohlke: mapapplique une fonction (dans ce cas, ord) à un interable et retourne un itérable. C'est comme une forme plus courte de (ord(x) for x in input()).
Ry-
Je l'ai. Merci pour l'explication!
asteri
1
Votre réponse suit l' esprit de la question, mais la mienne suit la lettre de la question ...
Très agréable. Battre ma solution non affichée de 62 longueurs for c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end=''). J'en ai essayé avec l' map(ord,input())astuce, mais j'ai manqué de multiplier la valeur de vérité par 32 et de l'ajouter à l'astuce de code de caractère. Très agréable.
Steven Rumbalski
8

Ruby, 18 caractères

Rien de vraiment intéressant.

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

(exécuté en IRB)

Juste pour le plaisir: une version déroutante:

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

Courez comme ceci:

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

Sortie

llamas are amazing!
Poignée de porte
la source
7

J - 30

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

J est lu de droite à gauche, donc pour décomposer ceci:

  1. Inviter l'utilisateur à entrer: 1!:1]1
  2. Effectuer l'algorithme dans l'espace de point de code: &.(a.&i.)
  3. Identifiez la plage de caractères pour chaque lettre; les caractères entre codepoints « @ » et « Z » sont considérés comme des majuscules: 1=I..
  4. Pour chaque point de code majuscule, ajoutez 32: ]+32* ...
  5. Notez que l'étape (2) crée une étape implicite (5): nous avons commencé par projeter du caractère au domaine entier, alors maintenant que nous avons terminé, nous mappons ces nombres entiers sur des caractères.

De toute évidence, cette implémentation particulière ne prend en compte que l'ASCII; mais l'approche pourrait être étendue au moins au plan multilingue de base en Unicode.

Dan Bron
la source
1
Agréable! Malheureusement, il semble que votre solution tourne mal. ;-) Cela devrait être une solution facile. (Edit: '@Z'(]+32*1=I.)&.(a.&i.)1!:1]1devrait le faire)
FireFly
Belle prise, merci. Je suis également impressionné que vous ayez pu corriger le code vous-même: J n'est pas la langue la plus accessible immédiatement :)
Dan Bron
Ah, j'ai joué avec J moi-même .. J'ai réussi à trouver ce u:(a.i.x)+32*1='@Z'I.x=.1!:1]1qui correspond à votre longueur mais qui est beaucoup moins intéressant (car il ne fait pas usage de 'under'). En parlant de cela, je ne connaissais pas le dyadique I., donc merci de l'utiliser. :-)
FireFly
Cool. Mais votre solution Befunge a toujours J battu de 4 caractères. Évidemment, je ne peux pas laisser cela se tenir :) J'essaie de voir si réduire la solution J en suivant votre exemple en vous appuyant uniquement sur '@', plutôt que sur '@' et 'Z'.
Dan Bron
(32(23)b.])&.(3&u:), devrait être plus court de 5 octets.
FrownyFrog
7

C 64 63 59 55 caractères

main(c){while(c=getchar(),~c)putchar(c-65u<27?c+32:c);}
Rozuur
la source
Je n'y compte que 63 caractères.
manatwork
Vous pouvez perdre 9 caractères: drop int et ,c>=0. Ils ne sont pas nécessaires ici.
JoeFish du
nous avons besoin de c> = 0 car getchar (EOF) sera <0. Merci pour toute autre suggestion.
Rozuur
2
1. ~(c=getchar())2.c-64u<27
ugoren
1
Insignifiamment petit bug: il semble qu'il devrait y en avoir 65 au lieu de 64. pastebin.com/Zc9zMx2W
manatwork
5

Golfscript - 17

Programme:

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

Explication:

  1. {}% mappe le code à l'intérieur à chaque caractère de la chaîne.
  2. .. copie deux fois le haut de la pile (le personnage).
  3. 64> 1 si le code de caractère est supérieur à 64, sinon 0.
  4. \échange les deux éléments de la pile (obtient la deuxième copie de la lettre et stocke le résultat de la 64>position deux).
  5. 91< vérifie si le code de caractère est inférieur à 91. Similaire à l'étape 3.
  6. *multiplie les résultats des étapes 3 et 5 ensemble. Seulement égal à 1, si les deux étapes étaient vraies.
  7. 32* multiplie le résultat de l'étape 6 par 32. Sera 32 si l'étape 6 était 1, sinon 0.
  8. + ajoutez le résultat (32 ou 0) au code de caractère.

Exemple de sortie:

echo HelLO @ WorLD | ruby golfscript.rb upper_to_lower.gs
hello @ world
Rees
la source
4

Perl: 24 caractères

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

Exemple d'exécution:

bash-4.1$ perl -pe 's/[A-Z]/chr 32+ord$&/ge' <<< 'Hello @ WORLD !'
hello @ world !
homme au travail
la source
Euh, pourquoi chr ord? Je suis sûr que vous n'apprendrez rien en lisant ma réponse ;-)
F. Hauri
Astuce incroyable, @ F.Hauri!
manatwork du
@ nyuszika7h, le +1 est le -pparamètre de ligne de commande, pas une nouvelle ligne.
manatwork
Oh oui, désolé.
nyuszika7h
3

Python (33)

En cas de doute, utilisez le shell.

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

Malheureusement, c'est encore plus long que la solution de Lego.

Fée lambda
la source
+1 Ce n'est en effet pas un Python intégré que vous utilisez. Fonctionne uniquement sur Linux, mais toujours très flexible !!!
@LegoStormtroopr Fonctionne partout où il y a une trcommande (qui fait la bonne chose) sur le chemin du shell invoqué, je suppose.
Paŭlo Ebermann
3

DELPHES

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;
Fabricio Araujo
la source
3
Ce n'est pas du golf. Ne pensez-vous pas que cette pièce est très différente des autres?
Ray
1
@ray Golfing consiste à obtenir votre code aussi court que possible. Delphi n'est pas un excellent langage pour le golf. J'utilise delphi moi-même et même s'il n'y a pas de grandes chances que je puisse gagner un golf avec delphi, c'est toujours amusant de se mettre au défi.
Teun Pronk
3

JavaScript - 109 104 (ES6: 95)

Merci à certains pour la version corrigée.

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

Ce qui suit fonctionne si le navigateur prend en charge les expressions de fonction ES6:

alert(prompt().split("").map(c=>String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)).join(""))
Luciole
la source
Le premier code ne fonctionne pas (testé dans FF et Chrome) car lorsque vous essayez d'obtenir un caractère après la longueur de la chaîne, vous obtenez undefined, puis c.charCodeAt()échoue, car undefined n'a pas charCodeAt. Un exemple de travail 105 caractères:a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&&c‌​<91)*32);alert(b.join(''))
certains
@quelques oups, je me demande comment j'ai trouvé cet extrait. Je suis presque sûr d'avoir testé ce code, j'ai peut-être copié une version non fonctionnelle ou quelque chose du genre. Quoi qu'il en soit, merci pour la correction.
FireFly
Utiliser un bit andau lieu d'un logique ... sympa!
certains
Une encore plus ES6 solution ( 79 ): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join(''). Utilisation:L('SoMeTeXt')
Florent
Agréable! Je ne suis pas sûr d'en faire une simple fonction, car toutes les autres solutions sont des programmes «appropriés». Pourtant, très belle utilisation de toute façon for..of.
FireFly
3

Perl 18

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

Quelque chose comme:

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

et

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

Pour @FireFly :

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

non.

Plus générique: 18 caractères quand même:

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

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

Cela ne changera rien dans l'état:

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

Tout fonctionne bien, mais l'avantage de changer |(ou) par ^(xor) est que la même syntaxe pourrait être utilisée pour toLower, toUpperou swapCase:

toUpper:

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

et swapCase (18 + 1 = 19 caractères) :

perl -pe 's/[a-z]/$&^" "/egi' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
dOESN'T ... @ TO ` AND [\]^_ TO {|}~del? 
F. Hauri
la source
J'ai oublié +1 pour -pdésolé @manatwork
F. Hauri
Cela ne se traduit-il pas @par backtick et [\]^_par {|}~DEL? Et c'est là que réside la partie délicate ..
FireFly
1
@FireFly Non, $&doivent correspondre [A-Z].
F. Hauri
Oh, ma mauvaise. Très cool, alors!
FireFly
3

javascript 80

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

(76 si vous supprimez "X")

avec promptet alert- 92

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

violon

merci à @FireFly @some @ C5H8NNaO4 et @minitech

Refroidisseur de mathématiques
la source
Euh, vous auriez besoin d'envelopper le deuxième argument replaceavec function($){return ...}, non? À propos, le premier paramètre de la fonction de remplacement est la chaîne correspondante, vous pouvez donc supprimer les parens dans l'expression régulière.
FireFly du
Comment pourrais-je le faire fonctionner, comme ça?
C5H8NNaO4
@ C5H8NNaO4 str (code ici)
Math chiller
6
Je pense que toutes (ou au moins la plupart) des réponses ici sont lues depuis stdin et imprimées vers stdout. D'après ce que je comprends, la convention est d'utiliser promptet alertpour les E / S dans JS.
FireFly
1
Vous avez besoin d'un /gindicateur pour que cela fonctionne correctement.
Ry-
2

R

71 caractères:

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

83 caractères:

a=as.integer(charToRaw(scan(,"")))
b=a%in%(65:90)
a[b]=a[b]+32
rawToChar(as.raw(a))
plannapus
la source
Ce sont des 86caractères - les nouvelles lignes comptent pour 2 caractères. ( string-functions.com/length.aspx )
Timtech
@Timtech: Dans R, vous pouvez remplacer les sauts de ligne dans le code par ;donc non, ils ne comptent que pour un seul caractère. Il pourrait être écrit:a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus
Oui, maintenant je m'en suis rendu compte. J'ai lu sur meta ... semble que c'est seulement sur Windows que les sauts de ligne sont à 2 caractères (j'utilisais un programme pour mesurer la longueur de mon code).
Timtech
2

Q, 18

.....

{x^ssr/[x]..Q`a`A}
tmartin
la source
2

Q (16)

.......

{x^(.Q.A!.Q.a)x}
skeevey
la source
2

PHP (42)

Exécutez à partir de la ligne de commande:

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

-R et les guillemets simples ne sont pas comptés.

Veuillez vous lever
la source
Si vous suivez la solution Peal de Gowtham, vous ne compteriez que 42 caractères.
eisberg
1
@eisberg: Mise à jour du score, laissant une version à 43 caractères dans l'histoire en cas de litige.
PleaseStand
str_ireplacene recherche pas la casse, ce qui étire les règles, sinon les enfreint.
ugoren
@ugoren Je ne pense pas. Comme il est clairement indiqué que seul le changement de fonction dans le cas n'est pas autorisé, ce qui ignore le cas et ne le modifie pas.
eisberg
2

PowerShell: 69 65 64

J'ai essayé une demi-douzaine de façons de faire en sorte que Replace fonctionne comme je le souhaite sans utiliser la longue [regex]::Replacesyntaxe, mais je n'ai pas eu de chance. Si quelqu'un d'autre a une idée de ce qui pourrait fonctionner, veuillez le suggérer.

Code golf:

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

Changements par rapport à l'original:

  • Réorganisé le dernier argument pour qu'il [int]ne soit plus nécessaire, selon la suggestion dans les commentaires.

Explication:

(read-host) obtient l'entrée utilisateur.

[regex]::Replace(... )indique à PowerShell d'utiliser la correspondance RegEx pour effectuer des opérations de remplacement sur une chaîne.

"[A-Z]" correspond à toutes les lettres majuscules.

{... }indique à PowerShell d'utiliser un script pour déterminer la valeur de remplacement.

[char]"$args" prend la correspondance actuelle et la tape sous forme de caractère ASCII.

32+ convertit le caractère en un entier, représentant le code ASCII, et augmente la valeur de 32 - ce qui correspondrait au code ASCII de la lettre minuscule correspondante.

[char](... )prend la valeur résultante et la reconvertit en caractère ASCII.

Démo de l'original:

entrez la description de l'image ici

(Version actuelle testée - capture d'écran non encore publiée.)

Iszi
la source
1
Je n'ai pas vérifié comment contourner cela [regex]::Replace, mais vous pouvez enregistrer 4 caractères en changeant [int]en+
goric
1
En fait, le dernier argument peut être réorganisé {[char](32+[char]"$args")}, ce qui supprime la nécessité de
transcrire
@goric Geez, pourquoi n'y ai-je pas déjà pensé? J'apprends toujours, je suppose.
Iszi
2

k2, 15 octets

Je suis super en retard sur celui-ci, mais j'ai quand même trouvé ça cool.

{_ci 32+_ic x}'

Également:

Pyth, 10 octets

Ne compte pas vraiment car Pyth a été créé après sa publication. Toujours cool.

jkmC+32Cdw
kirbyfan64sos
la source
2

05AB1E , 3 octets

u.š

Port de @ user8777 réponse Python 3 .

Essayez-le en ligne.

Explication:

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

Mais sans aucune modification de casse:

05AB1E , 12 11 octets

ÇIS.u32*+çJ

-1 octet grâce à @Emigna .

Essayez-le en ligne.

Explication:

Ç            # 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)
Kevin Cruijssen
la source
1
ÇIS.u32*+çJenregistre un octet sur votre version 12 octets.
Emigna
@Emigna Ah, intelligent. J'avais essayé l' .u32*+approche comme ceci εÇy.u32*+ç]JçJç
:,
1

Javascript, 105

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

En fait, aucun formulaire de sortie n'était spécifié, alors exécutez-le dans la console Oui, JavaScript est vraiment détaillé avec la chaîne charcode <->

C5H8NNaO4
la source
1
c.charCodeAt()- par défaut, 0si un index est omis. En outre, les pauses sur '@' je crois (il est "minuscule" dans le backtick)
FireFly
@FireFly Nice, Merci !, ok je vais le réparer =)
C5H8NNaO4
1

Rubis: 66

def l(s)s.bytes.map{|b|(65..90).include?(b)?b+32:b}.pack('c*');end
KaptajnKold
la source
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));}}

Environ 70 pour juste le corps de la méthode.

Ajoutez 5 caractères pour inclure un LF / CR dans la sortie:

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

Une version LINQ serait plus courte:

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) .. sauf qu'il l'exige using System.Linq;(total: 121).

Igby Largeman
la source
1

Haskell - 58

p x|(elem x['A'..'Z'])=[x..]!!32|1<2=x
main=interact$map p
nyuszika7h
la source
1

Python 3-70

Mis à jour pour les changements d'OP.

Je suis un débutant en Python, donc toute critique est la bienvenue.

print("".join(chr(ord(c)+32) if 64<ord(c)<91 else c for c in input()))
asteri
la source
Je suis désolé, je devais dire que vous n'êtes pas autorisé à utiliser une fonction to-lower sur un caractère. Question mise à jour.
ProgramFOX
1
Veuillez consulter mon commentaire récent : votre code ne fonctionne que si la chaîne d'entrée ne contient que des caractères majuscules, mais veuillez noter qu'il contient également d'autres caractères ASCII tels que des caractères minuscules et des chiffres.
ProgramFOX
D'accord, mettra à jour quand je
rentrerai
@ProgramFOX mis à jour.
asteri
Jeff, consultez la réponse @minitechs . Vous avez tous deux des approches très similaires, vous devriez donc pouvoir voir comment et pourquoi sa réponse est plus courte.
1

Perl, 9 + 1 (pour le drapeau -p) = 10

$_="\L$_"

\L a été spécifiquement interrogé et autorisé, car même s'il s'agit d'une fonction intégrée, ce n'est pas une fonction.

CJ Dennis
la source
1

Powershell, 53 49 octets

-4 octets merci @AdmBorkBork

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

Script de test:

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

Sortie:

True: hello world from powershell
mazzy
la source
cool! ¯\_(ツ)_/¯
mazzy
1

8086 code machine, 14 octets

Assemblé:

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

Liste non assemblée:

 ; 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 

Mis en œuvre en tant que MACRO(essentiellement une fonction). Chaîne d'entrée en SI, longueur en CX. Chaîne de sortie dansDI .

Sortie du programme de test PC DOS:

entrez la description de l'image ici

Téléchargez et testez l' exemple de programme TOLOW.COM .

640 Ko
la source
d'où vient le compte de 14 octets? l'extrait est plus long que cela, même sans commentaires ... est 14 octets le programme compilé?
Jonah
1
@Jonah L'opcode octet est dans la colonne de gauche AC 3C 41, etc. Je vais ajouter le code octet hexadécimal assemblé en haut pour plus de clarté. codegolf.meta.stackexchange.com/a/12340/84624
640 Ko