Die Zombie-Apokalypse ist da und die Welt geht unter. Plötzlich entdeckt jemand eine Formel, die die aktuelle Stunde, Minute und den aktuellen Tag enthält, und spuckt die perfekte Note aus, um auf einem Klavier zu spielen, das jeden Zombie, der sie hört, sofort tötet. Leider gibt es nur noch einen Klavierspieler auf der Welt, und er hat vergessen, Noten zu lesen, weiß aber immer noch, wie man Noten liest. Natürlich ist dies eine sehr zeitkritische Sache, daher scheint es natürlich, dass ein Computer dies tut. 1
Ihre Herausforderung besteht darin, eine Notiz wie G
die folgende zu notieren und sie auf einem Notensystem (im Violinschlüssel) auszugeben:
-----
-----
|
---|-
|
--O--
-----
Spezifikation:
- Sie müssen einen Stab mit abwechselnden Zeilen von
-----
(5 Bindestrichen) und eine Leerzeile ausgeben . Es werden-----
insgesamt 5 s sein. Die Notiz muss oben auf diesen Stab gelegt werden. - Die Eingabe gibt an, wo sich die Notiz befindet. Die Eingabe wird sein:
- ein optionales
H
oderL
, wobei "hoch" oder "niedrig" angegeben wird - ein Brief von
A
bisG
, der die Tonhöhe angibt - ein optionales
#
oderb
, scharf oder flach spezifizierend.
- ein optionales
- Die "Notiz" ist definiert als:
- Einer
O
(Großbuchstabe O) ist auf die Mitte des Stabes ausgerichtet, die sich an der Stelle der Notiz befindet. (Die oberste Zeile istHF
(hohes F) und die unterste Zeile istE
(ein normales E).) - Drei
|
s (vertikale Balken), der Stiel, der sein wird:- ein Leerzeichen links von der Note und abwärts (beginnend ein Leerzeichen unter der Note), wenn sich die Note in der Mittellinie (
B
) oder darüber befindet, oder - Ein Leerzeichen rechts von der Note und nach oben (beginnend ein Leerzeichen über der Note), wenn sich die Note unter der Mittellinie befindet.
- ein Leerzeichen links von der Note und abwärts (beginnend ein Leerzeichen unter der Note), wenn sich die Note in der Mittellinie (
- Ein
#
oderb
ein Leerzeichen direkt links von der Note, falls in der Eingabe angegeben.
- Einer
- Ledgerzeilen müssen hinzugefügt werden, wenn die Note zu hoch oder zu niedrig ist. Diese Linien sind
---
(nur 3 Striche in der Breite im Gegensatz zu 5) und werden nur angezeigt, wenn sich die Notiz auf oder über / unter (jeweils für die oberen / unteren Hauptbuchlinien) den Hauptbuchlinien befindet. - Überflüssige Leerzeichen können beliebig platziert werden. Sie können beispielsweise festlegen, dass die leeren Zeilen Leerzeichen enthalten oder dass nach den Hauptbuchzeilen ein Leerzeichen steht, wenn dies beim Speichern von Zeichen hilfreich ist.
Hier ist eine Visualisierung, um die Spezifikation leichter zu verstehen, mit allen Notennamen neben den Zeilen:
HB
--- HA
HG
----- HF
HE
----- HD
HC
----- B
A
----- G
F
----- E
D
--- C
LB
--- LA
LG
--- LF
... (bottom cut off for brevity, you get the idea anyway)
Hier sind einige weitere Beispiele, mit denen Sie Ihr Programm testen können:
Eingang: HG#
#O
-|---
|
-|---
-----
-----
-----
Eingang: LAb
-----
-----
-----
-----
-----
|
--|
|
bO-
Eingang: HB
O
|--
|
-|---
-----
-----
-----
-----
Eingang: C
-----
-----
-----
-----
|
---|-
|
-O-
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
1: realistischste ausstellung evar! :-P
#
oderb
auf der rechten Seite der Note statt auf der linken Seite; ist es wirklich das, was benötigt wird?Antworten:
Golfscript,
211210209197195192 ZeichenKommen Sie für den (ab diesem Post) Gewinn, eine GolfScript-Version meiner neuesten Python-Version :
Testen Sie es hier (die ersten beiden Zeilen sind Benutzereingaben, normalerweise kommt es von stdin).
"Lesbare" Version:
quelle
Ruby -
271267252249234229220214 ZeichenIch habe Ruby buchstäblich nur dafür gelernt. Es gibt also durchaus Verbesserungspotential beim Golfspielen. Oder etwas wirklich zu tun. Aber ich brauchte eine Sprache mit veränderlichen Zeichenfolgen. :)
Etwas ungolfed:
Ich kann es um weitere 2 Zeichen auf 212 Zeichen reduzieren, wenn führende Leerzeilen zulässig sind. Diese Lösung füllt die nicht gedruckten Zeilen nicht aus:
Sind Lambdas faires Spiel? Dann kann ich mit dem ersten Ansatz 210 Zeichen bekommen
Oder 207 Zeichen mit zusätzlichen Leerzeilen:
Natürlich müsstest du das jetzt tun
f.call("HGb")
.quelle
!x.nil?
entspricht!x
. Und für eine Zeile ist ifsif x;y;end;
gleichbedeutend mity if x
. Sie können in dieser Zeichenfolge auch einen wörtlichen Zeilenumbruch verwenden.if
zum arbeiten bekommen. Wenn ich benutze?\n
(wenn das so gemeint ist), muss ich ein Leerzeichen hinzufügen, damit ich nichts gewinne. Und das Entfernen der.nil?
s hat überhaupt nicht funktioniert (immer bewertettrue
)..nil?
, aber es lohnt sich in Zeichen.!x.nil?
ist!!x
. :)Python,
329309295286280277 ZeichenJetzt ein bisschen mehr golfen. Noch kann verbessert werden, aber nicht sicher, ob ich die Rubin- oder Golfscript-Lösungen mit diesem Ansatz schlagen kann.
Ursprünglich habe ich zeilenweise gedruckt, aber es hat sich herausgestellt, dass dies zu viel Zeit in Anspruch nimmt. Daher erstelle ich ein Zeichenfolgenraster und gebe dann ein, was ausgefüllt werden muss. Die Eingabe erfolgt über die Befehlszeile, z.
quelle
GolfScript -
243232228227 ZeichenIch habe meine CoffeeScript-Antwort in GolfScript übersetzt, das viel besser für die Manipulation von Strings geeignet ist.
BEARBEITEN: Sie haben sechs Zeichen gespeichert, indem Sie den Inkrement-Operator ordnungsgemäß verwendet haben, drei Zeichen, indem Sie den Stapel gut ausgenutzt haben, sechs weitere Zeichen, indem Sie nicht verwendete Operatoren unverantwortlich neu definiert haben, und eines, indem Sie das nachstehende Leerzeichen nach den Kulanzlinien nicht drucken.
Völlig golfen:
Mit Kommentaren:
quelle
Go
. es wird ausgegebenoo|||
:)Python,
250245242235 ZeichenEine ganz andere Herangehensweise, die meine andere übertroffen hat! Der eingegebene Verarbeitungscode ist ähnlich, aber das war's auch schon.
Ich habe den Wert jedes Zeichens basierend auf der Zeile und der Spalte festgelegt und dann den Druck ausgeführt:
quelle
Java -
921907863 ZeichenIch baue jeden String einzeln auf und speichere jeden String in einem Array. Durchlaufen Sie dann das Array und drucken Sie jede Zeile aus.
Oh bitte, hasse mich nicht, es ist mein erstes Mal. Ich konnte keine FAQ / Einführung finden, also hoffe ich, dass mein Beitragsformat in Ordnung ist. Ich bin mir nicht sicher, wie ernst die Leute mit der Anzahl der Zeichen umgegangen sind ... normale Version des Codes - extra ist Zeilenumbruch / Leerzeichen (1313 Zeichen):
quelle
args
).[]
, Leerzeichen um Klammern usw.Haskell 377C
Ungolfed-Version:
quelle
Literate CoffeeScript -
497527 ZeichenIch bin mir sicher, dass es einen besseren Weg gibt, das Gitter aufzubauen, aber ich kann es nicht herausfinden.
Ein Golfhelfer.
Wechselstrom-Hauptskala und Personal.
Unsere Notationsfunktion übernimmt die Zeichenfolgendarstellung einer Note.
Zuerst bestimmen wir die Oktave.
Dann die Notiz und versehentlich. Ich muss es lieben, Aufträge zu dekonstruieren.
Lassen Sie uns die Note und die Oktave in einen Index konvertieren und die Note plotten.
Jetzt schneiden wir nur so viel Personal ab, wie wir brauchen.
Und der Notenstamm.
Lassen Sie uns nun die Ergebnisse ausgeben.
Zuletzt exportieren wir die Funktion für Konsolentests. Diese Zeichen zählen nicht zur Gesamtsumme.
quelle
C
325304Jetzt 21 Bytes kürzer dank @ace !
Ausgabe:
quelle
n
und die Variablei=0
in der erstenfor
Schleife entfernen können .if
Aussage((i%12)&11)==0
kann durch ersetzt werden!((i%12)&11)
.?:
hat eine sehr niedrige Priorität als^
und<
, so dass Sie die Klammern der Bedingungen vor dem entfernen können?
. Und Sie können ersetzenprintf("%s",
mitputs(
.JavaScript
390388Ich muss zugeben, dass dies eine Herausforderung ist. Ich bin mir sicher, dass es Möglichkeiten gibt, dies weiter zu reduzieren. Ich bin offen für Vorschläge.
Erste Iteration
Bei der zweiten Iteration (mit
n.slice(-1)
anstelle vonn[n.length-1]
) werden 2 Byte gespartUngolfed-Version:
quelle