เซ็นคำว่า 2!


17

เซ็นคำว่า 2!

เมื่อไม่นานมานี้ฉันโพสต์สิ่งที่ท้าทายเรียกว่าลงชื่อคำนั้น! . ในการท้าทายคุณต้องค้นหาลายเซ็นของคำซึ่งเป็นตัวอักษรที่เรียงตามลำดับ (เช่นลายเซ็นต์ของthisคือhist) ตอนนี้ความท้าทายนั้นทำได้ค่อนข้างดี แต่มีประเด็นสำคัญหนึ่งประเด็น: มันเป็นวิธีที่ง่ายเกินไป (ดูคำตอบ GolfScript ) ดังนั้นฉันได้โพสต์ความท้าทายที่คล้ายกัน แต่มีกฎเพิ่มเติมซึ่งส่วนใหญ่ได้รับการแนะนำโดยผู้ใช้ PPCG ในความคิดเห็นของปริศนาก่อนหน้า ดังนั้นไปเลย!

กฎระเบียบ

  1. โปรแกรมของคุณจะต้องป้อนข้อมูลจากนั้นออกลายเซ็นไปยัง STDOUT หรือเทียบเท่าในภาษาใด ๆ ที่คุณใช้
  2. คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นการเรียงลำดับแบบบิวด์อินดังนั้นจึงไม่อนุญาตให้ใช้สิ่งนี้$ใน GolfScript
  3. ต้องรองรับ Multicase - โปรแกรมของคุณจะต้องจัดกลุ่มตัวอักษรของตัวพิมพ์ใหญ่และตัวพิมพ์เล็กด้วยกัน ดังนั้นลายเซ็นของHelloคือeHlloไม่ใช่Helloตามที่คุณได้รับคำตอบจาก GolfScript ในเวอร์ชันแรก
  4. จะต้องมีล่าม / คอมไพเลอร์ฟรีสำหรับโปรแกรมของคุณซึ่งคุณควรเชื่อมโยง

เกณฑ์การให้คะแนน

คะแนนของคุณคือนับไบต์ของคุณ จำนวนไบต์ที่น้อยที่สุดชนะ

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


2
ต้องสั่งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่ ตัวอย่างเช่นสำหรับThHihsเราสามารถส่งออกhHhistหรือเราต้องออกhhHistหรือHhhistไม่
ลดขนาด

2
@Kslkgh ฉันไม่ต้องการติดตั้งล่าม GolfScript เพื่อทำความเข้าใจคำถาม ควรระบุข้อกำหนดอย่างชัดเจนในคำถาม
feersum

1
@feersum คุณไม่จำเป็นต้อง มีลิงก์ในคำตอบสำหรับล่ามออนไลน์ แต่ฉันจะทำให้ชัดเจนขึ้น

8
การจัดการตัวพิมพ์เล็ก / ตัวพิมพ์ใหญ่อย่างถูกต้องใน Unicode นั้นน่ากลัวคำถามนี้จึง จำกัด ตัวอักษร ASCII โดยสมัครใจ: [a-zA-Z]?
Matthieu M.

3
คุณลืมปิดวงเล็บหลัง "เห็นคำตอบ GolfScript นี้" xkcd.com/859
nyuszika7h

คำตอบ:


11

Pyth, 10 ไบต์

sm@+drd1zG

ลองออนไลน์: สาธิต

คำอธิบาย:

             implicit: z = input string
 m       G   map each letter (variable d) of the alphabet to:
   +drd1        d + upper(d)
  @     z       filter z for these two letters
s            sum, join to a string

5

Haskell, 51

f s=[x|(a,b)<-zip['a'..'z']['A'..],x<-s,x==a||x==b]

สร้างรายชื่อของคู่ของตัวอักษรzip [('a','A'), ...('z','Z')]เนื่องจากการตัดปลายไม่จำเป็นต้องระบุจุดปลายที่สอง สำหรับแต่ละคู่ในรายการเราใช้ตัวอักษรในสตริงอินพุตsที่เป็นหนึ่งในสองอักขระในคู่


5

Python 3, 72 70 ไบต์

s=input()
print("".join(d*(ord(d)&31==c)for c in range(27)for d in s))

[a-zA-Z]ถือว่าการป้อนข้อมูลประกอบด้วยเพียง

(-2 ไบต์ขอขอบคุณ @xnor)


ฉันคิดว่าคุณสามารถทำ"".join(c*b ...)สำหรับ"".join(c ... if b) วิธีเดียวกับที่สามารถเป็นsum(n ... if b) sum(n*b ...)
xnor

ยุบสองลูปเป็นวงเดียวด้วย Sentinel และบีบอัดการตรวจสอบความเท่าเทียมกัน: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor

@xnor ฉันได้เพิ่มเคล็ดลับแรก (ขอบคุณ!) แต่ฉันคิดว่าคุณควรโพสต์ที่สองเป็นคำตอบแยก :)
Sp3000

4

GOTO ++, 531 ไบต์

niveaugourou 0
s=ENTRETONTEXTE()
§2 a=LeCaracNumero()&s *(1)
n=*(1)
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)
b=LeCaracNumero()&s &i
c=&b
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){
c=-*(32)
§4 GOTONULPOURLESNULS %5 }&a sup *(96){
d=-*(32)
§5 GOTONULPOURLESNULS %1 }&c inf &d{
a=&b
n=&i
§1 faiblard
GOTOPRINTDUTEXTE()&a
s=Marijuana()}BOITEAPINGOUINS()}PrendsUnMorceau()&s *(0) &n{ }PrendsUnMorceau()&s }&n+*(1){ *(0){{ «»
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){
GOTOPASMALIN %2
§3 GOTOPRINTDUTEXTE()&s

หน้าโครงการ GOTO ++

นี่คือโค้ดที่อ่านง่ายและมีความคิดเห็นมากกว่าเวอร์ชั่นเล็กน้อย (โปรดสังเกตว่าGOTOเริ่มความคิดเห็นใน GOTO ++):

niveaugourou 0                                          GOTO Allow every keyword to be used
s=ENTRETONTEXTE()                                       GOTO Read from STDIN
§2 a=LeCaracNumero()&s *(1)                             GOTO Get first char in s
n=*(1)                                                  
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)     GOTO Loop on every char of s
b=LeCaracNumero()&s &i                                  GOTO b = i-th char
c=&b                                            
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){                    GOTO If b is uppercase, goto §4 
c=-*(32)                                                GOTO Get the uppercase ASCII value of b
§4 GOTONULPOURLESNULS %5 }&a sup *(96){                 GOTO same as above but with a
d=-*(32)                                                
§5 GOTONULPOURLESNULS %1 }&c inf &d{                    GOTO If b is after a in alphabetical order, goto §1 (next loop iteration)
a=&b                                                    GOTO Else replace a by b
n=&i                                                                
§1 faiblard                                             GOTO End loop
GOTOPRINTDUTEXTE()&a                                    GOTO Print the value of a
t=PrendsUnMorceau()&s *(0) &n                           GOTO Get the part of s before a
u=PrendsUnMorceau()&s }&n+*(1){ *(0)                    GOTO Get the part of s after a
e=BOITEAPINGOUINS()&t &u                                GOTO Create an array of penguins containing the two substrings
s=Marijuana()&e «»                                      GOTO Concatenate the penguins in the array
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){  GOTO If s is one char long, goto §3
GOTOPASMALIN %2                                         GOTO Else goto §2
§3 GOTOPRINTDUTEXTE()&s                                 GOTO Print the last char

2
เครื่องหมายของภาษาการเขียนโปรแกรมที่ยอดเยี่ยม: คำสั่งทั้งหมดเป็นภาษาฝรั่งเศสและเว็บไซต์อย่างเป็นทางการแจ้งว่า "ส่งโลโก้ของคุณและดูเป็นใบ้"
Alex A.

@AlexA เครื่องหมายของภาษาโปรแกรมที่ยอดเยี่ยม: function(arg)และfunction() argใช้ได้ทั้งคู่ ยิ่งไปกว่านั้นวงเล็บลำดับความสำคัญ} {ไม่ใช่ที่น่าเบื่อ( )
ทำให้เสียชีวิตใน

4

Pyth, 15 14 ไบต์

s*V/LzJ.irG1GJ

ขอบคุณสำหรับ isaacg สำหรับการลบ 1 ไบต์

ฉันยังไม่รู้เกี่ยวกับ Pyth มากนักดังนั้นสิ่งนี้อาจไม่ดีนัก

ลองที่นี่


หนึ่งสนามกอล์ฟที่ง่าย: sเป็นเช่นเดียวกับjkในรายการของสตริง
isaacg

4

JavaScript (ES6), 71 74

จำกัด เฉพาะ A-Za-z (ดูความคิดเห็นโดย @Matthieu M)

แก้ไขเกินไปใช้ในการเขียนนิพจน์เดียวด้วยเครื่องหมายจุลภาคเพื่อหลีกเลี่ยง 'คืน' จำเป็นต้องใช้เอาท์พุตดังนั้นฉันสามารถใช้คอมม่าง่ายๆforและลืมเครื่องหมายจุลภาค

การใช้ความเข้าใจอาร์เรย์จำนวนไบต์คือ 73 แต่นั่นไม่ใช่ EcmaScript 6 ที่ถูกต้องอีกต่อไป

หมายเหตุปกติ: ทดสอบการเรียกใช้ตัวอย่างข้อมูลบนเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6 (ไม่ใช่ Chrome ไม่ใช่ MSIE โดยเฉพาะอย่างยิ่งฉันทดสอบบน Firefox, Safari 9 แล้ว)

f=w=>{v=[];for(c of w)v[n=parseInt(c,36)]=(v[n]||'')+c;alert(v.join``)}
<input id=I value='Hellzapoppin'><button onclick=f(I.value)>-></button>


4

Javascript, 112 194 ไบต์

r=[];t=[];a=s.split('').map(function(x){t[i=parseInt(x,36)]?t[i].push(x):t[i]=[x];return i;});while(l=a.length)r[l-1]=t[a.splice(a.indexOf(Math.max.apply({},a)),1)].pop();console.log(r.join(''))

นี่อยู่ไกลจาก "นักกอล์ฟ" แต่ตอนนี้ฉันค่อนข้างยุ่งแค่แก้ไขเพื่อลบการเรียงลำดับ


1
@frikinside ในขณะที่มันอาจไม่ช่วยแก้ปัญหานี้ตั้งแต่การเรียงลำดับไม่ได้รับอนุญาตฟังก์ชัน Javascript ES6 arrow จะช่วยให้เรื่องนี้สั้นลง (ไม่ใช่ทุกเบราว์เซอร์ที่รองรับ ES6 ให้ลองใช้ Firefox) บางทีมันอาจช่วยแก้ปัญหาในอนาคตของคุณได้! :) ตัวอย่างของสิ่งที่มันอาจมีลักษณะดังนี้:console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich

@UndefinedFunction จริง ๆ แล้วฉันเลือกใช้จาวาสคริปต์ธรรมดาตามวัตถุประสงค์เพื่อ "ท้าทาย" แต่ขอบคุณมากสำหรับคำแนะนำที่ดี!
frikinside

@ edc65 จริง ๆ แล้วฉันก็รู้ว่าในความคิดเห็นก่อนหน้า (เหมือนที่คุณพูด) และฉันไม่ลืมมันฉันยังไม่มีเวลามาจนถึงตอนนี้
frikinside

4

Python 3, 64

การปรับปรุงเล็กน้อยในคำตอบของ Sp3000ซึ่งใช้แนวคิดการวนซ้ำตัวอักขระดัชนีและสำหรับแต่ละตัววนซ้ำผ่านอินพุตเพื่อใช้อักขระที่ตรงกับกรณี

c=1
for d in(input__+'~')*26:print(end=d[ord(d)&31^c:]);c+=d>'z'

ใช้ลูปเดียววนรอบอินพุท 26 ครั้ง คั่นจะใช้ในการทราบเมื่อมีการไปที่ดัชนีตัวอักษรถัดไป~ cไม่ว่าจะเป็นตัวละครdตรงกับค่าcมากถึงห้าบิตสุดท้ายของบิต - ค่าdคือ xor-ed ด้วยcโดยมี 0 เป็นตัวบ่งชี้การจับคู่

จากนั้นอักขระdจะถูกพิมพ์อย่างแม่นยำเมื่อผลลัพธ์คือ0สตริงว่างเปล่าเป็นอย่างอื่น


3

Python 2.7 114 106 ไบต์

l=[0]*123
for e in raw_input():l[ord(e)]+=1
print''.join(chr(j)*l[j]for i in range(26)for j in(i+65,i+97))

บันทึกการมีตัวอักขระในอาร์เรย์ความยาว 123 (สำหรับรวมทั้งช่วง AZ และ az) จากนั้นวนซ้ำผ่านมันเพื่อรับรายการที่ไม่เป็นศูนย์
ไม่มีประสิทธิภาพ แต่มีประสิทธิภาพมากกว่าเดรัจฉานบังคับ (แต่อีกต่อไป :()

ทดสอบมัน -

<< HelloWorldhi
>> deHhillloorW

เมื่อฉันใช้มันHelloWorldhiฉันจะได้รับ['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Blue

@muddyfish อุ้ยฉันไม่ดี ฉันวางรหัสผิดในขณะที่ลองทำสองสิ่ง ขอบคุณสำหรับ :) :)
Kamehameha

คุณไม่จำเป็นต้องใช้if l[j]ทั้ง
บลู

@muddyfish Nice พวกมันกลายเป็นสตริงว่าง (และถูกลบเมื่อมีการjoinแก้ไข) -8 ไบต์ ขอบคุณ :)
Kamehameha

1
@SirParselot ใช่ แต่ดูเหมือนว่าจะปรับเปลี่ยนอินพุตตามที่ระบุในคำถามดังนั้นไม่ได้ทำอย่างนั้น
Kamehameha

3

PHP, 275 270 ไบต์

<?php
for($i=65;$i<123;$i++){$v[$i]=chr($i);}foreach(str_split($argv[1])as$c){$a=array_search($c,$v);if($a<97){$p[]=($a+32);$z[]=$a;}else{$p[]=$a;}}foreach($p as$chr){$m=min($p);if($z[0]+32==$m){echo chr($m-32);unset($z[0]);}else{echo chr($m);}unset($p[array_search($m,$p)]);}


คำอธิบาย:
รหัสจะสร้างอาร์เรย์ที่มีตัวอักษรทุกตัวในตัวอักษรซึ่งมีค่า ASCII เป็น Array Key หลังจากนั้นรหัสจะสร้างอาร์เรย์ใหม่ซึ่งมีค่า ASCII ของอินพุต จากนั้นค่าต่ำสุดจะถูกพิมพ์ออกมาและถูกลบออก

การใช้งาน:
โทรหาสคริปต์พร้อมอาร์กิวเมนต์: php -d error_reporting=0 script.php Hello

เวอร์ชันที่ไม่อัปโหลด:

<?php
$input = $argv[1];
$valueArray = [];
for($i=65;$i<123;$i++) {
    $valueArray[$i] = chr($i);
}
$new = str_split($input);
foreach($new as $char) {
    if(array_search($char, $valueArray)<97) {
        $newArray[] = (array_search($char, $valueArray)+32);
        $checkArray[] = array_search($char, $valueArray);
    } else {
        $newArray[] = array_search($char, $valueArray);
    }
}
foreach($newArray as $chr) {
    if($checkArray[0]+32 == min($newArray)) {
        $string .= chr(min($newArray)-32);
        unset($checkArray[0]);
    } else {
        $string .= chr(min($newArray));
    }
    $key = array_search(min($newArray), $newArray);
    unset($newArray[$key]);
}

echo $string;


คำแนะนำใด ๆ ที่ชื่นชมอย่างมาก


ตัวอักษรตัวพิมพ์ใหญ่ไม่ทำงาน ... จำเป็นต้องแก้ไข
jrenk

แก้ไขว่ารหัสยังใช้งานได้เมื่ออินพุตมีตัวอักษรตัวพิมพ์ใหญ่
jrenk

3

Haskell, 83 53 ไบต์

import Data.Char
f y=[c|x<-[' '..],c<-y,toLower c==x]

การใช้งาน: ->f "HelloWorldhi""deHhillloorW"

มันทำงานอย่างไร: yเป็นสตริงอินพุต

[ |x<-[' '..]                  ]  -- for every x from Space to the last Unicode character
             ,c<-y                -- loop through all character c from the input string
 c                ,toLower c==x   -- and keep those where the lowercase version equals x

แก้ไข: บันทึก 30 ไบต์ลองจินตนาการดูสิ! ขอบคุณ @Mauris


2
ทำไมไม่เพียงimport Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x](53 ไบต์) (การดำเนินการนี้จะใช้เวลาสักครู่เพราะlength [' '..] == 1114080- แต่มันมีขอบเขต จำกัด )
Lynn

1
@Mauris: ว้าว! Btw: 8.5 วินาทีบนแล็ปท็อปอายุ 4 ปีไม่นานเกินไป
Nimi

3

Python 3, 61 ไบต์

คำตอบใหม่สำหรับเทคนิคที่แตกต่าง!

z=['']*42
for c in input():z[ord(c)&31]+=c
print(*z,sep='')

สังเกตว่าord('a')&31==ord('A')&31และเราก็สามารถสร้างอาร์เรย์ของสตริงที่ว่างเปล่าและสำหรับตัวละครแต่ละตัวเพิ่มไปยังอาร์เรย์ของดัชนีค่าord('z')&31==ord('Z')&31 ASCII ของมัน &31เมื่อคุณพิมพ์มันจะถูกจัดเรียง

จำกัด การป้อนข้อมูล a-zA-Zการป้อนข้อมูล


2

Python 3, 97 92 ไบต์

from itertools import*;print(*min(permutations(input()),key=lambda z:str(z).lower()),sep='')

วิธีที่ดีที่สุดในการจัดเรียงนั้นชัดเจนในการสร้างการเรียงสับเปลี่ยนทั้งหมดจากนั้นเลือกขั้นต่ำซึ่งเพิ่งจะเรียงลำดับ :)

สตริงจะลดระดับลงก่อนที่จะทำการเปรียบเทียบเพื่อปฏิบัติตามกฎ

คำเตือน: อาจช้ามากกับสายใหญ่

ล่ามตั้งอยู่ที่นี่


2

Python 3, 118 ไบต์

i=input();i,x=map(list,(i,i.lower()))
while x:q=min(x);x.remove(q);q=[q.upper(),q][q in i];i.remove(q);print(q,end="")

ฉันรู้ว่าอาจจะสั้นกว่ากอล์ฟมาก


คุณสามารถแทนที่ด้วยif q not in i: if~-(q in i):
PurkkaKoodari

ฉันทำเพราะฉันเรียกใช้.remove()ฟังก์ชันนี้
บลู

2

Powershell, 164 ไบต์

ฉันแน่ใจว่ามีวิธีที่สะอาดกว่าในการทำเช่นนี้ แต่ฉันไม่สามารถหาสิ่งอื่นได้อีก เพียงรับอินพุตเป็นอาเรย์ตัวอักษรทำการเรียงลำดับการแทรกและแยกเอาท์พุทออกมา แพ้อย่างน่ากลัวแม้กับภาษาที่ไม่ใช่กอล์ฟอื่น ๆ

รหัส:

$a=[char[]]($args[0]);For($u=1;$u-lt$a.Count;$u++){$n=$a[$u];$l=$u;while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){$a[$l]=$a[$l-1];$l--}$a[$l]=$n};$a-join''

การใช้งาน:

PS C:\scripts> .\sign-word-2.ps1 tTHhis
hHistT

ขยายและอธิบาย:

$a=[char[]]($args[0])               # Takes command-line argument, recasts as char array
For($u=1;$u-lt$a.Count;$u++){       # Performs a quick-n-dirty insertion sort
  $n=$a[$u]
  $l=$u
  while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){
  # Ugly, ugly code here. String.CompareTo(String) is case-insensitive, but
  # because we cast as a char[], Char.CompareTo(Char) is case-sensitive ...
  # So, need to do an on-the-fly re-casting as a string with ""+
    $a[$l]=$a[$l-1]
    $l--
  }
  $a[$l]=$n
}
$a-join''             # Without the -join'', it would print out the chars with a space between

2

จูเลีย 61 ไบต์

f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s

จูเลียจะแสดงมันเป็นเอาท์พุทสตริงถ้าคุณเรียกว่าใน REPL ถ้ามีการพิมพ์ออกไป STDOUT แล้วก็ต้อง 78 ไบต์:

x->(f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s;print(f(x)))

ล่ามจูเลียสามารถพบได้ที่นี่ อีกอันที่ฉันใส่รหัสไปแล้วอยู่ที่นี่แล้วแล้ว โปรดทราบว่าด้วยสิ่งที่สองคุณจะต้องทำให้เทอร์มินัล (ที่ด้านล่าง) มองเห็นได้โดยการลากขอบเขตขึ้น การคลิกที่ "execute" จะทำให้มันรันในเทอร์มินัลที่บรรทัดคำสั่งปกติ (และจะไม่แสดงเอาต์พุตหากถูกเรียกโดยไม่มี println) หรือคุณสามารถพิมพ์juliaลงในเทอร์มินัลแล้วจัดการทุกอย่างภายใน REPL ที่จะเกิดขึ้น

และเพื่อความสนุกยิ่งขึ้นต่อไปนี้คือการปรับใช้อื่น ๆ

จัดเรียง Gnome (83 ไบต์):

s->(for m=2:endof(s),n=m:-1:2 s[n]%32<s[n-1]%32&&(s=s[[1:n-2,n,n-1,n+1:end]])end;s)

อัลกอริทึมการเรียงลำดับของฉันเอง (84 ไบต์):

s->(k=1;while length(k)>0 k=find(diff([s...]%32).<0);s=s[setdiff(1:end,k)]s[k]end;s)

2

สกาลา, 82 ไบต์

print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})

จากบรรทัดคำสั่ง:

$ scala -e 'print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})' Hello
eHllo

อาจจะสามารถเล่นกอล์ฟได้อีกเล็กน้อย ... เพียงแค่ใช้การเรียงลำดับการแทรกโดยใช้การพับ


2

รหัสเครื่อง x86, 51 42 ไบต์

00000000  b3 82 89 da 8b 07 80 fc  0d 74 12 b9 20 20 09 c1  |.........t..  ..|
00000010  38 e9 7e 06 86 c4 89 07  31 d2 43 eb e7 85 d2 74  |8.~.....1.C....t|
00000020  df c6 47 01 24 b4 09 cd  21 c3                    |..G.$...!.|
0000002a

การเรียงลำดับของบับเบิลที่มีเทคนิคการรีจิสเตอร์ซ้ำเพื่อโกนไบต์ที่นี่และที่นั่น ไฟล์ .COMวิ่งใน DosBox, ได้รับข้อมูลจากบรรทัดคำสั่งและพิมพ์ออกไปออกมาตรฐาน

sample session

ประกอบความเห็น:

    org 100h

section .text

start:
    ; bubble sort - external loop
ext:
    ; start from the first character (assume bh=0, true on every DOS)
    mov bl,82h
    ; "not-swapped" flag - 82h => no swaps in current iteration;
    ; 0 => a swap happened (the 82h will come in handy later)
    mov dx,bx
    ; bubble sort - internal loop
int:
    ; read 2 characters at time in the full ax
    mov ax,word[bx]   ; al     ah
                      ; ^[bx]  ^[bx+1]
    ; check if we are at the end (the command line is CR terminated)
    cmp ah,0dh
    je skip
    ; make uppercase in cx
    mov cx,2020h
    or cx,ax
    ; compare
    cmp cl,ch
    jle next
    ; wrong order - swap and rewrite
    xchg al,ah
    mov word[bx],ax
    ; mark that we did a swap
    xor dx,dx
next:
    ; next character
    inc bx
    jmp int
skip:
    ; loop as far as we swapped something
    test dx,dx
    jz ext
end:
    ; $-terminate the string
    mov byte[bx+1],'$'
    ; print
    ; dx already contains the location of the string, since that's the
    ; flag value we used for "no swaps"
    mov ah,9
    int 21h
    ret


1

Perl, 88 ไบต์

@_=/./g;a:{for(0..@_-2){@_[$_,$_+1]=@_[$_+1,$_],redo a if uc$_[$_]gt uc$_[$_+1]}}print@_

เพียงแค่เรียงฟองง่าย ๆ โทรด้วยตัวเลือก -n เพื่อส่งข้อความ

เช่น:

echo "tThHiIsS" | perl -n sort2.pl

เอาท์พุท:

hHiIsStT

1

PHP, 106 ไบต์

รหัส:

$c=count_chars($argv[1]);$r=str_repeat;for($i=64;++$i<91;)echo$r(chr($i),$c[$i]),$r(chr($i+32),$c[$i+32]);

ไม่มีอะไรพิเศษในรหัส; count_chars()สร้างอาร์เรย์ที่จัดทำดัชนีโดยรหัส ASCII ที่มีจำนวนการเกิดขึ้นสำหรับแต่ละอักขระ ASCII ส่วนที่เหลือคือการทำซ้ำที่น่าเบื่อกว่าอาร์เรย์นี้

ตัวอย่างของการดำเนินการ:

$ php -d error_reporting=0 sign.php qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKasdfJHGFDSAZXCVBNM
AaaBbCcDddEeFffGgHhIiJjKkLlMmNnOoPpQqRrSssTtUuVvWwXxYyZz

ไบต์พิเศษสามารถบันทึกได้โดยใช้ PHP 7: แทนที่$c[$i]ด้วย($c=count_chars($argv[1]))[$i]และลบการกำหนด$cจากจุดเริ่มต้นของโปรแกรม


1

Haskell, 74 ไบต์

l=(`mod`32).fromEnum
f=foldr(#)""
e#[]=[e]
e#a@(h:t)|l e<l h=e:a|1<2=h:e#t

สมบูรณ์แตกต่างจากฉันคำตอบอื่นคราวนี้มันเป็นส่วนแทรกแบบง่าย ๆ


1

Pip, 18 14 ไบต์

ที่เก็บ GitHub สำหรับ Pip

ดูเหมือนว่าจะไม่มีการแข่งขันกับ Pyth แต่มันน่านับถือ

FcAZ OcQUC_FIa

ใช้งานได้กับสตริงที่มีa-zA-Zเท่านั้น สำหรับตัวอักษรแต่ละตัวให้ใช้การดำเนินการตัวกรองเพื่อจับตัวอักษรจากสตริงอินพุตที่เท่ากับตัวพิมพ์เล็ก - ใหญ่:

                    a <- cmdline arg, AZ <- string containing uppercase alphabet (implicit)
FcAZ                For each character c in AZ:
           FIa      Filter characters of a on the following lambda function:
      UC_           Uppercase of character...
         Qc         ... is equal to c
     O              Output the resulting list, joined on empty string by default

หมายเหตุสองประการ:

  • พื้นที่จำเป็น มิฉะนั้นลำดับAZOจะสแกนเป็นA ZOแทนAZ O;
  • โปรแกรมจะไม่แสดงบรรทัดขึ้นบรรทัดใหม่ หากต้องการเพิ่มให้ใส่xท้ายรหัส (ดังนั้นการพิมพ์สตริงว่างหลังจากวนรอบเสร็จแล้ว)

ตัวอย่างการรัน (ใช้xชุดตัวเลือก):

dlosc@dlosc:~/pip$ pip -e "FcAZ OcQUC_FIax" "HelLo wOrld"
deHlLloOrw

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.